天命:好像也挺实用的题目,也是比较经典吧
天命:把php的MD5漏洞都玩了一遍
第一关:MD5绕过
先声明一下:这题的MD5是php,不是mysql的MD5,把我搞迷糊了
一进来题目啥也没有,那么就要看源码和抓包了
在响应头发现sql语句
经分析,这sql语句半真半假,应该是这样子的
$sql = "select * from test.admin where password='".md5($str,true)."'";
大坑:里面的md5函数是php的
参加加个true就是输出16位的二进制,正常显示绝逼是乱码的,所以也不需要echo看了
这里就是需要经过md5加密后,依旧可以进行sql注入
网上说:ffifdyop 的MD5加密结果是 276f722736c95d99e921722cf9ed621c
经过MySQL编码后会变成'or'6xxx,使SQL恒成立,相当于万能密码,可以绕过md5()函数的加密
其实一开始还不理解,然后自己写了一个测试真假
现在mysql测试
然后放入php代码测试
居然是真的,原理就是这样子,只要有东西,就算是true,那就忽略密码直接判断为true
这里好像说是MySQL特性,只有数字在开头才算有东西,字母在前面是没东西的,所以6xxx刚好算是有东西,判定为 true
所以只需要把 ffifdyop 输入进去就完事
第二关:弱比较MD5绕过
来到第二个页面,啥也没有,照旧两步骤,看源码和抓包
看到了隐藏的php源码
$a = $_GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
echo "wow, glzjin wants a girl friend";
}
这里难点就是不一样的情况下都采用md5加密,并比较,还好有个漏洞,就是弱比较大漏洞
两个等号的情况下 == ,只要是0e开头,都会当成科学计数法,无论是0的多少次方,通通都是0
那么找两个md5加密后是0e开头的内容就可以了
一搜一大堆,搞掂,下一关
第三关:php特性绕过MD5
这关已经超出我认知范围了,原来MD5这个函数只比较字符串,其他一律不管
我们传进去的是数组,那么两个变量就肯定不相等,但md5函数识别不了数组,当成是同一个数组进行加密,那得到的结果肯定一样啊,这个属于php的md5漏洞了吧
flag{a2a7fba8-9c7d-4ffa-8d1f-47781db64c89}