[XNUCA2019Qualifier]EasyPHP

[XNUCA2019Qualifier]EasyPHP

考点

  • .htaccess修改PHP配置

wp

给了源码,第一段删除除了index.php之外的所有文件,再包含fl3g.php,不对啊fl3g.php应该没有了啊为什么不报错,并且代码可以顺利执行。需要GET传入两个参数content和filename

$files = scandir('./'); 
foreach($files as $file) {
    if(is_file($file)){
        if ($file !== "index.php") {
            unlink($file);
        }
    }
}
include_once("fl3g.php");
if(!isset($_GET['content']) || !isset($_GET['filename'])) {
    highlight_file(__FILE__);
    die();
}

第二段代码对传入的内容进行检查。content不能包含on,html,type,flag,upload,file ,filename必须由小写字母和. 组成

接着最后一段代码,删除除了index.php之外的所有文件,在把content写入到filename中

传入?content=123&filename=.aaa 再访问.aaa 可以看到内容

这里给的提示很明显了,文件名只由小写字母和. 组成,那就是.htaccess

第一种做法

.htaccess 中使用# 进行单行注释,由于在代码中使用. 对content进行拼接,如果content最后加上\ 就会把拼接的 给注释掉。再配合# 就可以注释掉拼接内容了。

接着是利用.htaccess写shell,将一句话写入到.htaccess的注释中,再利用它自动加载文件的特性加载.htaccess文件,从而加载一句话

content为

由于file被过滤,可以使用\ 绕过,就像Linux命令行那样,而换行可以使用%0A ,或者直接把下面这段进行URL编码

payload

第二种做法

利用.htaccess 自定义错误日志和默认包含路径进行getshell。首先设置错误日志为/tmp/fl3g.php ,再把默认包含路径设为一句话,这样在写入错误日志时就会把一句话也写入

但是在日志写入时,会把<> 这些字符进行编码,所以使用UTF-7编码绕过

将shell写入后,需要再写一个.htaccess设置默认包含路径为/tmp ,并且让其使用UTF-7的方式解码。这样在index.php中include_once("fl3g.php"); 时,就会包含一句话

payload

第三种做法

利用正则回溯,preg_match函数有prce回溯,如果超过回溯次数就会返回FALSE。而在本题,所有preg_match的判断都是是否为TRUE,所以可以使用这个方法绕过。

在.htaccess中设置回溯次数的方法是

但是这个方法是有问题的,要先写入修改正则回溯次数的内容到.htaccess中,但是当第二次向fl3g.php写入一句话的时候,上次上传的.htaccess已经被删除,所以会一直提示Hacker。

小结

  1. .htaccess 中使用# 进行单行注释

  2. .htaccess 中使用\进行多行拼接

  3. .htaccess 中使用php_value auto_prepend_file "1.jpg" 在脚本头部加载文件

  4. .htaccess 可以自定义错误日志路径

  5. .htaccess 可以自定义默认包含路径

  6. .htaccess 可以使用UTF-7编码绕过一些限制

  7. .htaccess 可以自定义preg_match函数prce回溯次数

  8. .htaccess利用方式

最后更新于