项目地址: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个
理论上说,如果目标结果足够大,那么二分查找不论速度还是数据包的数量,都优于爆破