考点:
1、sql注入中的md5($string,raw)
2、php类型
3、md5中数组绕过
目录
解题步骤
一、
进去先输入字符串,看变化
在响应头中我们可以看到password=md5($pass,true),其中(具体看这里)
true是一个可选项:
默认不写为FALSE。32位16进制的字符串
TRUE。16位原始二进制格式的字符串
md5函数在指定了true的时候,是返回的原始 16 字符二进制格式。返回的这个原始二进制不是普通的二进制(0,1),而是 'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c 这种,并且与’or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c对应的字符串"ffifdyop",经md5加密后的字符串:'or’6]!r,b
为什么要用ffifdyop这个字符串,是因为他的原始二进制中‘or’6,反过来说如果一个字符串的原始二进制中有‘or’6(当然6也可以是其他数字)也可以。
这样的话就可以让sql语句永远有返回值。
二、
输入ffifdyop,可以看到这样一个页面
看一下源码
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->
它意思是a要不等于b,且加密后的a要等于b(弱等于)
两种绕过方法:
1、构造两个经过md5后都是以0e开头的字符串
//a=QNKCDZO&b=aabg7XSs
//php里面在做 == 的时候会先把两边的类型转成一样的,
//并且是0e开头,PHP会认为这是科学计数法,
//不管0有多少次方都为0
2、构造两个数组
//因为md5处理不了数组,只能是字符串,两边都处理数组返回false,也就相等了
三、
进入后
它提示我们param1要不完全等于param2,且他们两md5后要恒等于。
!==和!=是不一样的
//前者要不完全等于,也就是可以类型不一样,或者值不一样
//后者要类型转换后不等于 。
这边绕过就不能用上边的第一种绕过,要用第二种。
param1[]=1¶m2[]='1'
//post传参
然后就可以看到flag了。
参考
sql注入:md5($password,true)
bfengj