前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL注入点检测-文本内容相似度

SQL注入点检测-文本内容相似度

作者头像
鬼麦子
发布2023-03-07 15:38:29
1K0
发布2023-03-07 15:38:29
举报
文章被收录于专栏:鬼麦子鬼麦子

为什么造轮子

全自动SQL注入点检测,市面上简直太多了,但我这个有优势,尤其在于盲注检测上,用了些最基础的机器学习知识,做文本内容相似度判断。

如下代码:

代码语言:javascript
复制
<?php
$strs="QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm-_";
$rand_strs=substr(str_shuffle($strs),mt_rand(0,strlen($strs)-11),rand(100,164));
if($_GET['method']=='sql_inj_get_method'){
    //where sql注入
    $id = $_GET[ 'id' ];
  // Check database
  $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
  $result = $con->query($query) or die( '<pre>database error...    '.$rand_strs.'</pre>' );

  // Get results
  while( $row = mysqli_fetch_assoc( $result ) ) {
    // Get values
    $first = $row["first_name"];
归一化"last_name"];
        echo '<pre>ID:'. $id.'<br />';
        echo '<pre>first_name:'. $first.'<br />';
        echo '<pre>last_name:'. $last.'<br />';
  }
echo $rand_strs;

稍微懂点安全的人就知道 ,很明显的一个where int类型SQL注入。

代码语言:javascript
复制
http://172.26.87.30/web_vul_test/php_api/json_sql.php?method=sql_inj_get_method&ida=13243234&id=1

但是,因为这有个随机值"$rand_strs",sqlmap是检测不到 跑不出来的,

手工测试:

正常请求

加单引号

单引号闭合

基本来说,在黑盒测试中, 这就可以判断出 这是一个注入了,但大多数的sql检测工具的判定方式没有考虑到页面的随机内容,就会出现漏报,很多场景下都会有这种情况,如页面把时间戳、token、等随机的内容 显示在页面内,就会让常规检测的策略失效... 延时注入的检测方式又有短板,如sleep benchmark之类,我们要尽量做到安全检测不打扰,加上sleep benchmark这种的payload很明显这就是个恶意请求了,不谈waf什么的,就是感觉太明显了,还可能对业务造成影响,or sleep就常常会让mysql泵机...

所以就单引号和单引号闭合的方式,更好点,当然也可能误报,所以为了更准确判断sql注入点,用以下如图方法判断,

异常检测

在一个参数后面追加单双引号的时候,目的不单单只是检测sql,而是更多漏洞,因为在代码层面,'" 造成的异常不仅仅只出现在sql,有很多单双引号闭合的代码场景,如,命令里变量的闭合、代码内变量的闭合方式等... 只要后端没有严格的对输入参数进行过滤,单双引号就可能在业务代码的某个地方造成异常点,而通常这种异常会显示在响应包内,如上图。

那么问题来了,在响应包内有随机值时,怎么判断异常?

如图

•图一

•图二

•图三

三个完全一毛一样的请求,但是就因为响应包有随机值,检测判断异常时就变得很麻烦。

•图四

•图五

异常是如图四、图五这样的响应包。

那么如何检测判断出method\id参数存在异常,如图。

通过我自己的burp插件,一键检测漏洞,method/id参数处存在异常,并且id参数存在sql注入漏洞,本章先聊异常检测。

在有随机值的时候,我们的异常检测基于内容相似度的判断,

代码语言:javascript
复制
# coding: utf-8
'''
  @author: guimaizi
  @file: test1.py
  @time: 2021/11/14 15:16
  @desc:
'''

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import StandardScaler
from scipy import spatial
def calculation(list_html):
    list_num = []
    list_signal = []
    # 步骤一
    cv = CountVectorizer()
    data = cv.fit_transform(list_html)
    std = StandardScaler()
    data_list = std.fit_transform(data.toarray())
    print(data_list)
    # 步骤二
    for line in data_list:
        list_num.append(round(spatial.distance.cosine(data_list[0], line), 2))
    num = 0
    print(list_num)
    # 步骤三
    for signal in list_num:
        if signal != 0:
            if 1 / signal * 100 < 80:
                list_signal.append(num)
        num = num + 1
    print(list_signal)
    return list_signal
list_html=[
    '<pre>ID:1<br /><pre>first_name:admin<br /><pre>last_name:admin<br />JDS6xwWlYPZLcsNm-avhnR9fqd3KHMyrX0AFQ25eEkI71_4Gi8TU',
    '<pre>ID:1<br /><pre>first_name:admin<br /><pre>last_name:admin<br />eWtsifuM03h-TDYXj7NqgI4vGOSVLr5KmPHk_ZC',
    'error!AndyprcImbxKfFswzl7VJit6-DT',
    '<pre>database error...    C4oXG_BtKd2WQF3iNpSOJxRAVlPZ0aEj1Hg9svf-UThzMLe</pre>',
    '<pre>ID:1<br /><pre>first_name:admin<br /><pre>last_name:admin<br />o0LaSKk_WGyEdqZ6ftT2X835DlHReJwVAFYBmUx']
calculation(list_html)

假设list_html[0]是正常请求的响应包,通过以上代码判断,list_html存在异常,执行结果如图

可以判断出: list_html[2]和list_html[3] 存在异常, 原理就是设了个值80%的文本相似度,低于就是异常。

具体步骤,

•步骤一: 用这list_html这五组数据进行标准化处理,也就是通过某种算法把文本内容转变成人看不懂,但是便于机器处理的数据矩阵。

•步骤二: 拿正常请求list_html[0]做比对(余弦距离),遍历list_html[x],取两位的小数点,再把人看不懂矩阵数据,变成浮点型数字。

•步骤三: 这段代码,应该是有代码基础的就能看懂吧,就是小于80,就说明存在异常。

其实本文最关键的就在这, sql盲注的检测基本已经没必要往下讲了,原理和异常检测一样....算了算了,还是拿注入举个例子,我这么懒的人呐...

sql盲注检测

上面已经清楚了,method/id这两个参数通过'"的判断存在异常。

我们来判断下id参数,下来把list_html改下

代码语言:javascript
复制
正常请求
http://172.26.87.30/web_vul_test/php_api/json_sql.php?method=sql_inj_get_method&ida=13243234&id=1
响应包
<pre>ID:1<br /><pre>first_name:admin<br /><pre>last_name:admin<br />rjbmwAkYnC1TP_DFKi2zytJLXgcBofG-qUl0Q5MEZhS46V3u7e9OxH8IdWvRN

单引号请求
http://172.26.87.30/web_vul_test/php_api/json_sql.php?method=sql_inj_get_method&ida=13243234&id=1’
响应包
<pre>database error...    KUYEIvhFgT9C35akeQGbyujr6ORMAs-zwcldmN7XHSD08_1LPxWf</pre>

-0测试
http://172.26.87.30/web_vul_test/php_api/json_sql.php?method=sql_inj_get_method&ida=13243234&id=1-0
响应包
<pre>ID:1-0<br /><pre>first_name:admin<br /><pre>last_name:admin<br />XV5sZSPGc1wEYjB3ikJoUnAWChqFey9LHtI2gmM

单引号闭合测试
http://172.26.87.30/web_vul_test/php_api/json_sql.php?method=sql_inj_get_method&ida=13243234&id=1''
响应包
<pre>ID:1''<br /><pre>first_name:admin<br /><pre>last_name:admin<br />qZJ8aieR5Cv0pgfSDEdVoFPwuGxOTyKk-A47B9sn1lh3LH6_MItQ2WrYmcNzj


list_html=[
    "<pre>ID:1<br /><pre>first_name:admin<br /><pre>last_name:admin<br />rjbmwAkYnC1TP_DFKi2zytJLXgcBofG-qUl0Q5MEZhS46V3u7e9OxH8IdWvRN",
    "<pre>database error...    KUYEIvhFgT9C35akeQGbyujr6ORMAs-zwcldmN7XHSD08_1LPxWf</pre>",
    "<pre>ID:1-0<br /><pre>first_name:admin<br /><pre>last_name:admin<br />XV5sZSPGc1wEYjB3ikJoUnAWChqFey9LHtI2gmM",
    "<pre>ID:1''<br /><pre>first_name:admin<br /><pre>last_name:admin<br />qZJ8aieR5Cv0pgfSDEdVoFPwuGxOTyKk-A47B9sn1lh3LH6_MItQ2WrYmcNzj"
]

很明显list_html[1]有问题, 也就是和其他的比较,其他的都符合%80以上的相似,而list_html[1]不符合,依此可以判断id这个参数存在注入

代码语言:javascript
复制
http://172.26.87.30/web_vul_test/php_api/json_sql.php?method=sql_inj_get_method&ida=13243234&id=1'   

根据上文的检测方式,管他是什么where/int/string/order by/like类型盲注,只是闭合的payload不同,都可以依上文做sql注入点检测 (bug自己调,哈哈哈,我已经填了很多坑了)。

我就这几个payload,干净简洁,waf不拦截。

代码语言:javascript
复制
['-0', "%'aNd'1", "'lIke'", ',1']

效果如下:

谦虚的说大概65%+的,靠着burp一个右键来判断注入点。

我吐槽下啊,那些搞AI的人,能不能整点简单明了的列子,别一上来就堆公式,堆术语,让我这种初中都没毕业的太难了,学习成本倍增,但是又想学。

欢迎扫描器技术交流 wechat: guimaizi

参考资料

https://xz.aliyun.com/t/9796 其实我用这个捡了好多ssrf,并且这是我漏扫的核心框架,可惜大家不识货,哈哈哈。

https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html 机器学习相关

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cosine.html 余弦距离算法

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鬼麦子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
检测工具
域名服务检测工具(Detection Tools)提供了全面的智能化域名诊断,包括Whois、DNS生效等特性检测,同时提供SSL证书相关特性检测,保障您的域名和网站健康。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档