PHP弱类型在CTF中的应用

PHP作为世界上最好的语言(然而人生苦短,我用python),在CTF web题中大放异彩,深受出题人的喜爱。P神在对web题出题套路总结的第三条指出,出题人喜欢花式玩弄php的特性,包括弱类型、反序列化、\0截断、iconv截断。那么今天我们就php弱类型这一特性,总结一下相关出题的套路。

在Bugku WEB Write Up(二)《矛盾》这题中我们已经初步领略了PHP弱类型的魅力

也明白了为什么“test”会等于0

这里再举几个例子,加深一下理解

“1test”与1相比较时,会先将“1test”转换成数值1,从而相等

而“0e123456”与“0e654321”相比较时,会将其转换为科学计数法的数字。0的多少次方都为0,从而相等。

这里要注意这种情况:

当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值在整形的范围之内,

则该字符串被当作int来取值,其他所有情况下都被作为float来取值

也就是说,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0

所以“test1”在比较时被先转换成了0,从而相等不成立

MD5绕过入门

这段代码的大意是接收两个参数v1和v2,v1要为字母,v2要为数字或数字字符串,并且v1和v2的md5值要相同,才能获得flag

两个不同字符串最后能得到相同MD5值?

这个时候就需要弱类型登场了。上面已经提到,“0e123456”与“0e654321”相比较时,会将其转换为科学计数法的数字。而0的多少次方都为0,所以成立

所以我们的目标就是找两个“0e”开头的字母和数字字符串

MD5绕过进阶

也许上面套路你已经学会了

所以来试试下面这种新姿势,看看你学到了几成呢?

看到这么多md5,是不是已经有点晕了?

所以先缕清代码的逻辑:接收一个“md5”的参数,然后对这个参数进行md5计算,如果计算的md5值与输入的参数相等,就可以通过验证。

那么思路是这样的:我们输入一个特殊的以“0e”开头的数字字符串,这个字符串经过md5计算后的值也为以“0e”开头的数字字符串,最终要达到的效果类似这样:

"0e123456"="0e+30位数字"

从而可以拿到flag

Talk is cheap,show me the code.

它经过md5计算后为0e291242476940776845150308577824

符合要求

JSON绕过

代码逻辑是接收一个POST方法的数据,然后调用json_decode将数据解码,如果解码后的key值等于预先定义好的变量$key值,就可以拿到flag。

虽然我们并不知道$key的值,但是可以利用“test”==0这种方式进行绕过

所以payload为:message={"key":0}

以POST方法提交即可得到flag

strcmp绕过

在《Bugku WEB Write Up(四)》之《前女友》这道题中,对strcmp函数的绕过进行了详细讲解,同时对php中md5()函数(sha1()函数类似)无法处理数组类型的数据从而可以绕过进行了讲解。

这篇文章对php弱类型在CTF比赛中的总结并不全面,如果大家在做题的过程遇到了新的套路和绕过姿势,欢迎一起交流哦~

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171215G0ZPSE00?refer=cp_1026

相关快讯

扫码关注云+社区