题目一
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php session_unset(); session_destroy(); if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file);
include($file); }else{ highlight_file(__FILE__);
|
session_unset()
: 清空 $_SESSION
数组( Session 文件/数据存在)。
session_destroy()
:删除 Session 文件/数据。
然而上面的函数不影响创建新的 Session 文件,且 PHP_SESSION_UPLOAD_PROGRESS
机制不依赖代码中的 session_start()
,而是由 PHP 内核在检测到上传进度跟踪时自动处理。
依旧是利用 PHP_SESSION_UPLOAD_PROGRESS
生成 Session 文件,后面就简单了。
题目二
1 2 3 4 5 6 7 8 9 10 11 12
| <?php if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file); system("rm -rf /tmp/*"); include($file); }else{ highlight_file(__FILE__); }
|
system("rm -rf /tmp/*");
删除所有 Session 文件。但脚本里留了后门,只删除 Session 文件没用。
题目三
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file); if(file_exists($file)){ $content = file_get_contents($file); if(strpos($content, "<")>0){ die("error"); } include($file); } }else{ highlight_file(__FILE__); }
|
该题会检查 Session 文件中 <
符号是否存在,存在的话它在不在第一个位置。
如果不存在,false
会被转换为整数 0
,最终 strpos($content, "<") > 0
这个条件判断结果会是 false
,执行 include($file)
;
如果存在但不在第一个位置,会立即结束当前脚本,反之则会继续执行 include($file)
。
但当大量线程上传文件时,不断重写唯一的 Session 的内容,导致可能有一段时间没有 <
符号,绕过检查;但在文件包含时又写入了 Payload ,导致读取到的文件包含恶意代码。
题目四
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php define('还要秀?', dirname(__FILE__)); set_include_path(还要秀?); if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file); include($file); }else{ highlight_file(__FILE__); }
|
**set_include_path
**:用于设置 PHP 脚本在使用 include
、require
等语句包含文件时的优先搜索路径。
因为是优先,找不到还是要去其他路径找,并没有什么用。