PHP日常代码简析1

最近在做各个PHP框架的代码代码的分析,然后偶然间发现了ripstech,就想到恰巧试一下做一次常见的问题代码分析。该网站提供的实例代码在墙内访问可能存在障碍,需要自备梯子访问。

Day 1 - Wish List

WIsh list
我们首先看一下这段代码的设计者原本用意,作者设计了一个Challenge类,用 F I L E S [ s o l u t i o n ] f i l e _FILES['solution']进行实例化 然后在对象的构造函数中,用成员变量file保存 _FILES[‘solution’]的值,并用range函数创建了一个1~24的数组保存为成员变量whitelist。
关键的代码在于这个对象的析构函数里,设计者的原本用意是使用in_array检查$_FILES[‘solution’]上传文件的文件名name是否在1~24的范围之内来选择是否执行move_uploaded_file,但是在这里in_array的第三个参数设计者却没有指定,这就导致了漏洞的产生
参考PHP官方手册in_array的说明
在这里插入图片描述
在未指定第三个参数的情况下,in_array的检查的将会采取宽松模式,这就导致了在比较过程中PHP的字符串类型到数字的转换
在这里插入图片描述
因此实际的执行过程中任何以1~24字符开头的字符串名称的上传文件名都将能通过in_array的检查从而绕过真实判断意图执行move_uploaded_file。
测试代码及结果如下:在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u010034358/article/details/84295602