引入
$_REQUEST['file']
是 PHP 中的一个超全局变量,用于获取客户端提交的请求数据。它是一个数组,包含了通过 GET、POST 或 COOKIE 方式提交的变量。
直接使用 $_REQUEST['file']
存在严重的安全风险,可能导致路径遍历攻击(Directory Traversal Attack)。攻击者可以通过提交特殊字符(如 ../
)来访问服务器上的任意文件。
$whitelist
是一个关联数组,用于定义允许访问的文件及其对应的路径。它的作用是限制用户只能访问白名单中指定的文件,从而提高代码的安全性。
mb_strpos
是 PHP 中的一个多字节字符串处理函数,用于查找字符串中某个子字符串的位置。它是 strpos
的多字节安全版本,适用于处理非 ASCII 字符串(如 UTF-8)。
题目
题目:warmup(攻防世界)
题号:NO.GFSJ0743
打开题目发现只有一个笑脸,f12查看,源码提示source.php
url中输入source.php找到真正的题目,其中发现其有一个类emmm,其中有一个静态方法,同时需要从提交的请求数据中获取一个file变量,需要不为空、为字符串、能通过checkFile的检测,细看checkFile函数,其中设置了白名单source和hint,看看hint文件
其说明了flag文件的名称为ffffllllaaaagggg
回到checkFile方法
checkFil
checkFile
方法
- 参数:
$page
是用户请求的文件名。-
功能:验证
$page
是否在白名单中,或者经过处理后是否在白名单中。-
定义了一个白名单数组
$whitelist
,只允许source.php
和hint.php
。 -
检查
$page
是否为空或不是字符串,如果是则拒绝访问。 -
直接检查
$page
是否在白名单中。 -
去掉
$page
中的查询参数(从?
开始的部分),再次检查是否在白名单中。 -
对
$page
进行 URL 解码,再去掉查询参数,最后检查是否在白名单中。
-
-
因此外面需要对?进行二次url编码构造payload得
?file=source.php%253f/../../../../../ffffllllaaaagggg