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比赛中的总结并不全面,如果大家在做题的过程遇到了新的套路和绕过姿势,欢迎一起交流哦~

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我杨某人的青春满是悔恨

《编程的智慧(初稿)》读后感

王垠更新了文章,加入了Optional跟Union比较的内容,所以我也来更新一下。垠神认为Optional并没有什么卵用,Java8的Optional我不是很了...

12520
来自专栏码洞

天下无难试之HashMap面试刁难大全

HashMap的结构无疑是Java面试中出现频率最高的一道题,这个题是如此之常见,应该每个人都会信手拈来。可是就在我经历过的无数【允许我夸张一下】面试当中,能完...

11120
来自专栏从流域到海域

《笨办法学Python》 第35课手记

《笨办法学Python》 第35课手记 本节课讲函数和分支的,实际上是一次综合练习,代码有点长,请先纠正代码中的错误使脚本能够运行。 原代码中使用三个空格来进行...

225100
来自专栏程序人生

来来来,咱们元编程入个门

前一篇文章竟然被很多人批「干货太少」 —— 一看你们就没有看过 Rich 他老人家的 Hammock Driven Development(我很久前推荐过滴),...

352100
来自专栏阿杜的世界

《Scala程序设计》阅读书摘

JVM上的语言越来越多了,从前几年的groovy、Scala和Clojure,现在又听说一门Kotlin。对于前三种语言,groovy算是JVM平台上的动态脚本...

9720
来自专栏技术墨客

Java函数式开发——优雅的Optional空指针处理

    在Java江湖流传着这样一个传说:直到真正了解了空指针异常,才能算一名合格的Java开发人员。在我们逼格闪闪的java码字符生涯中,每天都会遇到各种nu...

14020
来自专栏鹅厂优文

Python 工匠:善用变量来改善代码质量

我一直觉得编程某种意义上是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目。

1K100
来自专栏企鹅号快讯

Python模块知识2:时间日期日历模块Time、Datetime、Calendar

1、time模块 时间为什么从1970年开始:因为Linux系统那一年开始使用;通常由以下几种方式表示时间: 时间戳:1970年1月1日之后的秒,即:time....

29250
来自专栏iKcamp

翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 6 章:值的不可变性

原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 第 6 章:值的不可变性 在第 ...

22050
来自专栏take time, save time

你所能用到的数据结构(八)

十一、不能被应用的理论不是好研究 前面介绍了堆栈的一些小小的理论模型,那么这样一个东西有什么作用呢?实际中不可能有那么一辆停在站台前方堵死的火车的,即使有,也...

28540

扫码关注云+社区

领取腾讯云代金券