Bugku CTF web27(Web)

0、打开网页,只提示输入变量a,而没有源代码

此题缺失源代码,如果没有源代码,无法正常解答。

题目来源:南京邮电大学网络攻防训练平台 Web题 md5 collision

我们从网上找到了该题的源代码

1、查看并分析源代码(MD5弱碰撞)

$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
    if ($a != 'QNKCDZO' && $md51 == $md52) {
        echo "nctf{*****************}";
    } else {
        echo "false!!!";
    }
}
else{
    echo "please input a";
}

变量md51的值是经过md5加密的字符串QNKCDZO,字符串QNKCDZO经过md5加密之后的值为:0e830400451993494058024219903391。

分析源代码可知,如果变量a的值不为QNKCDZO,并且a的md5值也为0e830400451993494058024219903391,则会输出flag。

很显然,这在计算上是难以实现的。

不过源代码当中的比较方式是"=="而不是"==="

Tips:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。

例如:123abc转换后是123,而abc转换后则为0,0==0成立。因此,0 ==’abc’是成立的。当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。

如果md5的值是以0e开头的,那么就与其他的0e开头的md5值是相等的,这里给大家列举一些:

0e开头的md5和原值:
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020

总结:

1、php使用==比较数字和字符串时,将字符串转换成数字后与数字进行比较。
2、php字符串转换成数字的规则是:
字符串以数字开头:取前面的数字
字符串不以数字开头:0
3、如果==两侧的字符串都是以0e开头,并且后面还是数字,就会被解释成科学计数法,也就是0的多少多少次幂,也就是后面的数字无论是多少,最后结果都为0.
4、上一点也是这道题的另一种思路。找到另一个字符串,这个字符串的md5值也以0e开头。
5、以0e开头的字符串很危险!!!
 

2、构造并上传payload:http://114.67.246.176:14391/?a=s878926199a(之前举例的md5值以0e开头的字符串均可作为本题的payload)

3、得到flag:flag{0ea6e2f2d552ad96aa6bcbf0285e4c4f}

猜你喜欢

转载自blog.csdn.net/ChaoYue_miku/article/details/114641920