Qunie构造原理
即让某个字符串经过某个变换过程后仍然等于他本身
而在mysql中,可以使用replace函数去构造Qunie
构造的模板:
其中B的编码是为了在替换的时候保持中间的参数不被替换
S = REPLACE('A',B的编码,'A')
A = REPLACE("B",B的编码,"B")
替换后:
S = REPLACE('REPLACE("B",B的编码,"B")',B的编码,'REPLACE("B",B的编码,"B")')
当我们将 A 里面的 ”B“ 替换后,即为
P = REPLACE("REPLACE("B",B的编码,"B")",B的编码,"REPLACE("B",B的编码,"B")"
这个与S已经非常相似了,但单双引号不同
单双引号替换
接着我们去想办法替换掉刚才构造后产生的双引号:
如果我们直接在上述的 P 的外面替换,就会导致多替换,因为在P中内部的双引号是正确的,只有最外围的双引号是错误的,那么只能S转化之前对A进行操作
思考的方法即为,让A中的双引号在变换的时候给变成单引号,既然这样子那肯定要变换两次
那么接下来尝试构造 S , A :
S = REPLACE(REPLACE('A',CHAR(34),CHAR(39)),B的编码,'A')
A = REPLACE(REPLACE("B",CHAR(34),CHAR(39)),B的编码,"B")
构造一起则为
P = REPLACE(REPLACE('REPLACE(REPLACE("B",CHAR(34),CHAR(39)),B的编码,"B")',CHAR(34),CHAR(39)),B的编码,'REPLACE(REPLACE("B",CHAR(34),CHAR(39)),B的编码,"B")')
在这一大串里面,S的第二个replace会先将A中的双引号替换为单引号,第一次替换过后是这样的
REPLACE('REPLACE(REPLACE('B',CHAR(34),CHAR(39)),B的编码,'B')',B的编码,'REPLACE(REPLACE("B",CHAR(34),CHAR(39)),B的编码,"B")')
在进行一次替换
REPLACE(REPLACE('REPLACE(REPLACE("B",CHAR(34),CHAR(39)),B的编码,"B")',CHAR(34),CHAR(39)),B的编码,'REPLACE(REPLACE("B",CHAR(34),CHAR(39)),B的编码,"B")')
与S相同,满足Qunie的构造
S 和 A 很相似,除了第一个形参和第二个形参以及形参上的引号不一样外,其他是一样的,这或许可以有助于记忆
构造自动生成脚本
Qunie构造脚本(payload==password).py
花了好大功夫写的