题目地址:https://buuoj.cn/challenges
解题思路
第一步:进入题目,就一个输入框
第二步:使用burpsuite抓包,查看提示
第三步:根据提示构建输入参数
-
分析漏洞:输入框输入的值交给pass,再进行一次md5加密后,将密文与sql查询语句进行查询
-
构建参数:要形成select * from admin where password = xxx or 1的永真语句,所以md5加密后的密文要包含
' or 1'
,根据提示,输入ffifdyop,跳转到新页面。
-
解释1:md5(string,raw),raw的值默认不写为FALSE,结果为32位16进制的字符串,raw设置了TRUE,其结果为16位原始二进制格式的字符串。答案也不唯一,可以尝试:129581926211651571912466741651878684928
content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621c(false)
raw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c(true)
string: 'or'6]!r,b
content: 129581926211651571912466741651878684928
hex: 06da5430449f8f6f23dfc1276f722738
raw: \x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8
string: T0Do#'or'8
- 解释2:在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。当然在我后来测试中发现,不只是1开头,只要是数字开头都是可以的。所以这里是password=’‘or’6xxx’,构成永真式。
第四步:来到新页面,查看提示
第五步:构建参数,进行绕过
此页面让我们传递两个参数a与b,且a与b的值不同但md5值相同。可以通过数值绕过,原理:md5函数不能处理数组,导致函数返回Null。而Null是等于Null的。输入?a[]=1&b[]=2
来到新页面。
第六步:绕过检测获取flag
新页面绕过方式同理,构建数组绕过,注意这里需要使用post进行提交,且要带上上一步的a,b参数