php 上传文件漏洞,PHP -- 文件包含、文件上传漏洞

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 上传文件漏洞,PHP -- 文件包含、文件上传漏洞_第1张图片

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 -- 文件包含、文件上传漏洞相关教程

你可能感兴趣的:(php,上传文件漏洞)