项目地址:https://github.com/iamnotamaster/sql-injecter
给我之前写的sql注入脚本进行了一些升级,此文章就是对升级内容的分析,升级内容如下:
-  使用占位符foo来填充payload里需要经常修改的部分 
-  自动判断循环 
-  支持爆破和二分查找法来枚举一个字符 
-  显示枚举一个字符所需要的时间和数据包的数量 
-  二分查找的优点和缺点 
使用占位符foo来填充payload里需要经常修改的部分
payload不在使用拼接的方式来替换其需要修改的字符,而是通过占位符foo的方式替换字符。
首先要定义一个payload_foo  payload_foo = "1' and substr(str_foo,int_foo,1)='char_foo' and '1'='1" str_foo = "database()"  str_foo是用户输入的内容,如:database() int_foo是程序需要从1开始循环遍历字符串的数字,不需要用户输入 char_foo是程序需要遍历的字符,不需要用户输入  以上内容输入给程序就是枚举出database的内容
自动判断循环
程序根据给定的payload_foo中的占位符foo的数量,判断是否需要嵌套循环  例如上面提过的例子,它同时给定了int_foo和char_foo,说明要枚举出一个字符串,需要两个循环语句  而以下这个例子,只需要一个循环语句:payload_foo2 = "1' and str_foo=int_foo and '1'='1"  给定str_foo = "database()" payload_foo2的目的是枚举出database()的长度,因此只需要一个循环就能完成任务
支持爆破和二分查找法来枚举一个字符
爆破的话不用多说: brute_list1 = ", 0123456789abcdefghijklmnopqrstuvwxyz" 一个一个发  二分法的布尔注入(整个过程像是猜数字游戏一样): 发送一个payload如下: 1' and int_foo>str_foo and '1'='1  给定str_foo = "length(database())" 程序会随机猜一个数字guess替换占位符int_foo 目标如果显示出期待的字符串,说明guess > target,然后程序不断判断并缩小guess的范围,直到找到正确答案
显示枚举一个字符所需要的时间和数据包的数量
这个没什么技术含量,但是非常有用
二分查找的优点和缺点
-  优点:发送的数据包少且稳定,因为数据包少有利于规避 
-  缺点:爆破一个字符耗费的时间更长 
我已经测试了时间盲注post的二分查找,和时间盲注post爆破对比如下:
二分查找时间盲注post:

爆破时间盲注post:

可以看到,爆破几乎1s就能爆出一个字符(设置sleep(1)),然而二分查找需要2~4秒
但是二分查找爆出一个字符,只需要5~8个数据包,而爆破最高时能到30个理论上说,如果目标结果足够大,那么二分查找不论速度还是数据包的数量,都优于爆破
