文件包含漏洞原理
文件包含在PHP中主要由4个函数构成:include, include_once, require, require_once,
当在PHP中使用上述4个函数去包含任意一个文件时,该文件的内容均会被当成PHP代码来执行,由此可以有效利用该漏洞进行恶意代码注入。
由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入
- include函数:会将指定的文件读入并且执行里面的程序;
- require函数:会将目标文件的内容读入,并且把自己本身代换成这些读入的内容;
- include_once 函数:在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次;
- require_once 函数:和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含
漏洞利用两种方式
本地文件包含
利用条件
php.ini 中 allow_url_fopen=On (默认开启)
用户参数可控且后台代码没有对包含的文件进行过滤
远程文件包含
利用条件
php.ini 中 allow_url_fopen=On (默认开启) 和 allow_url_include=Off (默认关闭)要开启
用户参数可控且后台代码没有对包含的文件进行过滤
利用前提:
(1)存在一个文件包含漏洞点
(2)我们有其他可控点可以写入到本地文件
(3)写入的本地文件路径可知或可预测
文件包含漏洞危害
1、敏感信息泄露 |
---|
2、获取Webshell |
3、任意命令执行 |
文件包含可以写入的位置
包含web日志
apche记录web日志的文件有 access.log和error.log
包含登录日志
Linux默认登录日志路径:/var/log/auth.log 或 /var/log/secure
包含mysql日志
包含上传文件
包含临时文件(条件竞争)
包含session文件
页面报错信息
文件包含漏洞进阶-PHP协议。
PHP伪协议利用
php中的伪协议常使用的有如下几个:php://input php://filter phar://
php://filter 伪协议
读取文件(allow_url_include和allow_url_fopen都不做要求)
通过指定末尾的文件,可以读取经base64编码后的文件源码,之后再base64解码一下就行。虽然不能直接获取到shell等,但能读取敏感文件危害也是挺大的。
php://input
此方法需要条件,即开启allow_url_include=On。实际上这相当于一个远程包含的利用。
php://打开文件流后,我们直接在流里面写入我们的恶意代码,此时包含既可执行代码。
然后在POST请求中输入恶意代码,执行包含既可实现恶意代码的执行,比如:
<?php phpinfo(); ?>
<?php system(ifconfig); ?>
phar://
主要是用于在php中对压缩文件格式的读取。这种方式通常是用来配合文件上传漏洞使用,或者进行进阶的phar反序列化攻击
用法就是把一句话木马压缩成zip格式,shell.txt -> shell.zip,然后再上传到服务器(后续通过前端页面上传也没有问题,通常服务器不会限制上传 zip 文件)
zip://
也是对压缩文件进行读取操作,原理与用法跟phar几乎一样。区别是:
1、zip只能包含单级目录,即不能 /shell.zip%23folder%23shell.txt,而phar支持多级。
2、在压缩文件内的目录符号,要改成#,且在浏览器中请求的话,还要进行url编码%23
data://
data://本身是数据流封装器,其原理和用法跟php://input类似,但是是发送GET请求参数。
文件包含漏洞防御。
设置白名单 | 代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。 |
---|---|
过滤危险字符 | 由于Include/Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini),在Linux环境中可以通过”…/…/”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP文件。 |
设置文件目录 | PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。 |
关闭危险配置 | PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。 |
文件上传漏洞原理
大部分的网站和应用系统都有上传功能,而程序员在开发文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端通过js进行后缀检验。
这时攻击者可以上传一个与网站脚本语言相对应的恶意代码动态脚本,例如(jsp、asp、php、aspx文件后缀)到服务器上,从而访问这些恶意脚本中包含的恶意代码,进行动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。
漏洞危害
可能会导致用户信息泄露,被钓鱼,甚至使攻击者可以直接上传WebShell到服务器,进而得到自己想要的信息和权限。最终达到对数据库执行、服务器文件管理、服务器命令执行等恶意操作,甚至完全控制服务器系统。
漏洞利用
文件上传漏洞利用条件:
(1)能够成功上传木马。
(2)上传的木马能够被web容器解析执行,所以上传路径要在web容器覆盖范围内。
(3)用户能够访问上传的木马,所以得知道上传的木马准确路径。
文件上传漏洞防御
代码层次:
- 前端检测(在前端用了JS 脚本做检测,如检测文件后缀名等)
- 服务器端检测:
①MIME类型检测(比如GIF图片MIME为image/gif,CSS文件的MIME为text/css)
②文件后缀名检测,如设置黑白名单。
③文件内容检测 - 图片二次渲染。(最变态的文件上传漏洞防御方式)
- 检查文件上传路径。(避免被0x00截断、IIS6.0文件夹解析漏洞、目录遍历)
- 文件重命名,包括文件名及其扩展名(利用随机字符串或时间戳等方式进行命名,防止攻击者得到WebShell的路径)
- 将其存放路径和文件名存放在数据库中,系统使用文件时,通过查询数据库动态获取。
- 检验是否存在条件竞争的逻辑漏洞。
管理层次:
- 部署WAF防火墙。
- 正确配置服务器请求类型。(禁止使用PUT请求方法)
- 及时更新系统、中间件、脚本、数据库、CMS或框架的漏洞补丁。(避免解析漏洞)
设置权限
- 限制上传目录下拥有的执行权限
文件上传绕过
1 黑名单(文件拓展名)绕过
Php除了可以解析php后缀 还可以解析php2,php3,php4 ,phtml
Asp可解析 asa,cer,cdx
Aspx可解析 ashx,asmx,ascx
Jsp可解析jspx、jspf
2 .htaccess文件绕过
概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
前提条件(1.mod_rewrite模块开启。2.AllowOverride All)
因此先上传一个.htaccess文件,内容如下:
SetHandler application/x-httpd-php
这样当前目录下的所有文件都会当成php来解析,无论是什么后缀名,与文件包含的效果类似
3 前端禁用JS,修改后缀然后通过Burp上传改回后缀,部分浏览器可以直接修改前端代码
4 大小写绕过
5 点 空格 点绕过
6 双写绕过
7 %00截断绕过
在url中%00表示ascll码的0 ,而ascii码的0,表示字符串结束,所以当url中出现%00时就会认为读取已结束
注:需满足 php 版本<5.3.4 才有可能存在此漏洞
文件下载漏洞原理
对前端用户的下载请求,没有对其所请求的文件类型、目录做合理严谨的规则进行过滤,导致用户通过路径回溯符…/等相关操作,跳出了程序本身的限制目录,然后再利用文件下载功能,使前端下载请求可以下载服务器中的任意文件。
危害
可以下载服务器的任意文件:
eg:
获得网站web源码,再对代码进行审计,以获得更多的漏洞
获得网站、服务器、系统、数据库等中间件配置文件
获得应用于系统配置文件
对内网的信息进行一个探测
下载各种.log文件,并寻找后台地址、文件上传点等地方
系统文件路径
Linux:
/etc/passwd
//保存了系统中所有的用户信息
/etc/shadow
//用户的密码信息
/root/.ssh/authorized_keys
//公钥文件
/root/.bash_history
//用户终端操作历史记录
/usr/local/app/apache2/conf/httpd.conf
//apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf
//虚拟网站设置
/usr/local/app/php5/lib/php.ini
//php相关设置
/etc/httpd/conf/httpd.conf
//apache
/etc/php5/apache2/php.ini
//ubuntu系统的默认路径
Windows:
C:\boot.ini
//查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml
//查看IIS虚拟主机配置文件
C:\windows\repair\sam
//存储Windows系统初次安装的密码
C:\Program Files\mysql\my.ini
//mysql配置,记录管理员登陆过的MYSQL用户名和密码
C:\Program Files\mysql\data\mysql\user.MYD
//mysql.user表中的数据库连接密码
C:\windows\php.ini php.ini
//php配置文件
C:\Windows\system.in
//winnt的php配置信息
C:\Windows\win.ini
//winnt的mysql配置文件
C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini
//存储虚拟主机网站路径和密码
C:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf
//查看WINDOWS系统apache文件
C:/Resin-3.0.14/conf/resin.conf
//查看jsp开发的网站resin文件配置信息.
C:\Windows\System32\drivers\etc\hostswinserver
//配置Telnet信息
文件下载的防护
(1)过滤特殊字符.(点),使用户在url中不能回溯上级目录;
(2)正则严格判断用户输入参数的格式;
(3)php.ini配置open_basedir限定文件访问范围;
(4)将文件路径保存于数据库中,通过 url?id=123的方式下载文件。
:\apache\conf\httpd.conf
//查看WINDOWS系统apache文件
C:/Resin-3.0.14/conf/resin.conf
//查看jsp开发的网站resin文件配置信息.
C:\Windows\System32\drivers\etc\hostswinserver
//配置Telnet信息
### 文件下载的防护
(1)过滤特殊字符.(点),使用户在url中不能回溯上级目录;
(2)正则严格判断用户输入参数的格式;
(3)php.ini配置open_basedir限定文件访问范围;
(4)将文件路径保存于数据库中,通过 url?id=123的方式下载文件。