定义
:
在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入。
危险函数
: include() , include_once() , require() , require_once().
解题思路
:
本地文件包含: 直接读取目标机上的Flag文件.
远程文件包含:指定第三方服务器上可运行的PHP木马,拿到webshell,查看Flag文件.
判断本地文件包含与远程文件包含方法:
查看php全局配置文件php.ini
1. allow_url_fopen =
on
/off 允许URLs像files对象一样被打开
2. allow_url_include =
on
/off 允许包含URL 对象文件. 才可以使用远程文件包含.
本地文件包含:
<1>直接包含内有Flag的文件.
利用:
http://www.example.com/demo1.php? file=
flag.php%00
这段代码相当于: include ‘/home/www/
flag.php%00
.php
‘
字符串截断技巧: 结束符的 \x00–>%00.
<2>通过PHP伪协议读取代码中的Flag.
PHP伪协议:
1.file://
访问本地文件系统,在CTF比赛中常用来读取本地文件.
用法: file:// [文件的绝对路径和文件名]
条件(php.ini) : allow_url_fopen = off/on
allow_url_include = off/on on off 都可.
eg: http://www.example.com/index.php?
file=file://D:/PhpStudy/WWW/flag.txt
2.php://
访问各个输入/输出流.
php://filter
用法:读取网页源代码
.
条件(php.ini) : allow_url_fopen = off/on
allow_url_include = off/on on off 都可.
ini无法获取的话,可以利用:(如果不是base64编码,就会当成php执行,就看不到原码了)
file=php://filter/read=convert.base-64-encode/resource=index.php
拿burp decode一下,就看见源码了。
前面文章buuctf web真题
1 里有此例题include。
PHP://input
用法: 可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行.
条件(php.ini) : allow_url_fopen = off/on
allow_url_include =
on
只要include 开启,就可以当成php代码执行.
例题:攻防世界 Web_php_include
通过对网站源码进行分析:
<?php
show_source(__FILE__);
echo $_GET[‘hello’]; //hello变量接受get传参,可以利用hello显示某些内容
$page=$_GET[‘page’];//page变量接受get传参
while (strstr($page, “php://”)) { //检查page变量中是否含有字符串“php://“
$page=str_replace(“php://”, “”, $page); //将page变量中的“php://”用空字符串代替
}
include($page);//文件包含,可以执行page变量中的代码。
?>
由include($page)看出本题的考点在于文件包含,而且通过源码得知php://被过滤了。
php://被过滤,strstr函数对大小写不敏感,因此我们可以使用PHP://来绕过。所以我们可以使用php://input 来post传递恶意代码,来输入命令给服务端。
发现了fl4gisisish3r3.php index.php phpinfo.php。
再传输一个指令,查询flag。<?php system(“cat fl4gisisish3r3.php”)?>,得到flag.
<3>写入PHP木马获取webshell,查看Flag.
这个可以直接看见源码的,可以查看一下php.ini,发现include on,fopen off.可用php伪协议
http://———-/index.php/file=php://input
后通过hackbar post我们的shell。
之后就可以利用菜刀链接shell了。
远程文件包含:
指定第三方服务器上可运行的php木马,拿到webshell,查看Flag文件。
例如查看源码可看见require_once.
访问php.ini发现,allow_url_fopen 和include都on,存在远程文件包含.