if ( $_POST['param1'] !==$_POST['param2'] && md5($_POST['param1']) === md5($_POST['param2'])){
echo "yes";
}
这串字符好绕吗?答案是肯定的,php的md5函数处理数组时直接返回null,两个参数都为数组类型就好了
?param1[]=1¶m2[]=2
if ( (string)$_POST['param1'] !== (string)$_POST['param2'] && md5($_POST['param1']) === md5($_POST['param2'])){
echo "yes";
}
这串呢?一上来就把你传的参数转化为string类型,所以用数组的方法是不行了。
只能是MD5碰撞了,就是不相同的字符恰好有着一样的MD5。 fastcoll_v1.0.0.5.exe工具可以给我弄出来。
这个时候我们生成了两个不一样的txt文件,却有着相同的md5值。
文件的内容怎么传进去呢?
网上搜集到了很多姿势:
①直接在前端构造表单,input为file的输入框
②python脚本直接导入requests用post的方式提交f.read()的值
③burp
④直接把文件的内容url编码提交,这是因为服务器端会解码,解出原来的内容,而且不会受到特殊字符的干扰,比如啪来一个控制字符,截断字符的干扰。
⑤拖到winhex里面,复制出十六进制,然后用hackbar的hex转char,但是这个方法会受到影响,因为字符特殊直接在浏览器输入的话很有可能会出错,就是第四条说的。值得注意的是,不要直接从winhex里面复制出来,因为f.read()和hex转化为char和winhex里面是不一样的,一般的字符看起来是一样的,但是很多特殊字符都是不一样的。
总的来说,思路就是md5后的值相同,关键就是怎么把文件的内容没有差错的提交上去。
已经编码好的一个payload
param1=
%D89%A4%FD%14%EC%0EL%1A%FEG%ED%5B%D0%C0%7D%CAh%16%B4%DFl%08Z%FA%1DA%05i%29%C4%FF%80%11%14%E8jk5%0DK%DAa%FC%2B%DC%9F%95ab%D2%09P%A1%5D%12%3B%1ETZ%AA%92%16y%29%CC%7DV%3A%FF%B8e%7FK%D6%CD%1D%DF/a%DE%27%29%EF%08%FC%C0%15%D1%1B%14%C1LYy%B2%F9%88%DF%E2%5B%9E%7D%04c%B1%B0%AFj%1E%7Ch%B0%96%A7%E5U%EBn1q%CA%D0%8B%C7%1BSP
¶m2=
%D89%A4%FD%14%EC%0EL%1A%FEG%ED%5B%D0%C0%7D%CAh%164%DFl%08Z%FA%1DA%05i%29%C4%FF%80%11%14%E8jk5%0DK%DAa%FC%2B%5C%A0%95ab%D2%09P%A1%5D%12%3B%1ET%DA%AA%92%16y%29%CC%7DV%3A%FF%B8e%7FK%D6%CD%1D%DF/a%DE%27%29o%08%FC%C0%15%D1%1B%14%C1LYy%B2%F9%88%DF%E2%5B%9E%7D%04c%B1%B0%AFj%9E%7Bh%B0%96%A7%E5U%EBn1q%CA%D0%0B%C7%1BSP