条件竞争变体题目

题目一

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 脚本在使用 includerequire 等语句包含文件时的优先搜索路径。

因为是优先,找不到还是要去其他路径找,并没有什么用。