接上一篇文章《文件包含漏洞1 | iwebsec》。
本关卡的源码
$filename = $_GET['filename'];include($filename . ".html");}else{exit();}
?>
看到源码,就想起了文件上传漏洞的绕过方法——%00截断。
适用条件:
magic_quotes_gpc = Off
PHP版本 < 5.3.4
符合条件要求,截断成功。假设shell.png
是通过文件上传漏洞上传的木马图片,包含木马图片。
蚁剑连接
上一篇文章的包含日志文件原理:先想办法把恶意代码写入日志(日志内容可控)中,再利用文件包含漏洞包含日志(日志路径可知),并执行日志里的恶意代码。
session文件包含原理:当可以获取session文件路径并且session文件的内容可控的的时候,就可以通过包含session文件进行攻击。
整体思路:通过可控的session值,传入恶意代码,找到session文件地址、文件名,通过文件包含漏洞包含session文件,达到getshell的目的。
session_start();$iwebsec=$_GET['iwebsec'];$_SESSION["username"]=$iwebsec; //将获取的值存入到Session中,内容可控echo 'SESSION["username"]的内容是'. $_SESSION['username'];}else{exit();}
?>
写入一句话木马
Linux系统下的session文件路径:
因此我们可以猜测本靶场的session文件默认存放的位置为/var/lib/php/session
。也可以通过phpinfo
查询。
session
文件名的构造:sess_
+ sessionid
, sessionid
在cookie
中可以查看。
通过上面可以知道session文件名为/var/lib/php/session/sess_fifbf701gg8gdi4a643r5lrti0
,因此可以利用第一关的文件包含漏洞包含session文件。
蚁剑连接
远程文件包含(remote file include,RFI)是指包含文件的位置并不在本地服务器,而是通过URL的形式包含到其他服务器上的文件,以及执行文件中的恶意代码。条件:
allow_url_fopen=On
allow_url_include=On
假设远程服务器有一个文件:test.txt
的内容为。
在正常情况下访问远程服务器URLhttp://8.134.148.36/test.txt
,包含在test.txt
中的phpinfo
函数不会当做PHP代码执行,但是通过远程文件包含漏洞,包含在test.txt
的phpinfo
函数会被当做PHP代码执行。
远程服务器的一个文件。
远程包含远程服务器的一个文件。
getshell。
但是如果包含php文件则不能执行。
包含的php文件不能执行。
$filename = $_GET['filename'];include($filename . ".html");}else{exit();}
?>
协议 | 作用 | 用法 |
---|---|---|
file:// | 用于访问本地文件系统(绝对路径、相对路径、网络路径) | |
php://input | 执行POST数据中的php代码 | |
data:// | 通常可以用来执行php代码,一般需要用到base64编码传输。 | |
php://filter | 读取源代码并进行base64编码输出 |
$filename = $_GET['filename'];include($filename);}else{exit();}
?>
上面代码输出file_get_contents
函数获取的php://input
数据。测试时在POST处传入字符串,会在页面回显出字符串。
我本来用hackbar
插件发送POST数据的,但是它无法执行成功,因此用burpsuite
。
$filename = $_GET['filename'];include($filename);}else{exit();}
?>
通过php://input传入了一句话木马');?>
,并在当前目录下建立了shell.php文件。
参考《PHP伪协议总结》
需要用url编码对+
进行编码。
一句话木马:
对+
进行url编码
检查配置文件
检查 php 中的 php.ini ,其中 allow_url_fopen、allow_url_include 这两个选项与 php 伪协议紧密关联。allow_url_fopen默认是开启的,allow_url_include 默认是关闭,最好根据网站需求,对这两个选项进行合理配置。
过滤特殊符号
服务器可以过滤掉执行文件包含操作的符号,例如:\,// 等,以及 php 伪协议常用字符,例如input,output,filter 等,将这些字符进行有效过滤,可以减少恶意文件操作的可能。
指定包含的文件
建立一个白名单。当用户创建文件时,将该文件名插入到记录中,以便其请求文件时,站点可以在执行任何包含之前验证文件名。