抓包查看响应包。
看来是md5注入。
看一下md5函数
对于ffifdyop这个字符串经过md5函数加密为16位原始二进制格式的字符串。
content: ffifdyop hex: 276f722736c95d99e921722cf9ed621c raw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c string: 'or'6]!r,b
在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的,
比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,
也就相当于password=‘xxx’ or true,所以返回值就是true
ffifdyop被当做参数经过md5函数加密传入到数据库,这时有'or'6的存在,这是个永真式,就可绕过sql语句对password的校验。
传入得到一段php
$a = $GET['a']; $b = $_GET['b']; if($a != $b && md5($a) == md5($b)){ // wow, glzjin wants a girl friend.
md5 sha1等函数无法处理数组,传入数组时会返回null,但null是等于null的。或者是md5碰撞都可绕过
?a[]=1&b[]=2
加载到新的页面
<?php error_reporting(0); include "flag.php"; highlight_file(__FILE__); if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){ echo $flag; }
强制类型比较,无法利用md5碰撞,不会吧0e开头的当做科学技术法来比较,但是仍然可采用数组绕过。
post传参得到flag