TOP16之文件包含 -- 小黑超细详解+案例说明<宝藏文>

  前言:

         文件包含是通过PHP相应函数(比如include($-REQUEST[666]))引入文件时,由于传入的文件名没有经过经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。

         在文件包含中的文件,任意类型的文件都会被当作PHP文件执行。

         理解漏洞才能掌握漏洞,重在理解中实践。

目录

一、理解文件包含的方式

        1、条件:

        2、文件包含的方式 

       3、常见的文件包含漏洞函数

二、判断是否存在文件包含

     举例说明:

    文件包含的表达式:

       常见的敏感目录:

 windows

 linux

 三、DVWA案例实践

        LOW

            本地文件包含(LFI)

                    案例1:

                    案例2:

拓展:                          

          远程文件包含(RFI)

medium级别

HIGH级别

 php伪协议


一、理解文件包含的方式

        1、条件:

                 (1)、include()等函数通过动态变量的方式引入需要包含的文件                                       (2)、用户能够控制这个动态变量

        2、文件包含的方式 

             本地文件包含:  读取或执行本地文件的漏洞,本地文件指的是将目标服务器的文件信息。配合文件上传使用,通过知道文件上传的路径从而解析上传的木马文件。

           

              远程文件包含:  如果php.ini的配置选项为allow_url_include为ON的话,可以加载远程文件,就是可以跳转到其它地方加载远程文件,直接可以远程加载其它地方的文件,达到直接执行任意命令。

       3、常见的文件包含漏洞函数

(1)require      找不到被包含的文件会产生致命错误,并停止脚本运行

(2)include     找不到被包含的文件1只会产生警告,脚本继续执行

(3)require_once   和require类似,区别是该文件的代码已经被包含,则不会再次包含

(4)include_once   和include类似,区别是该文件的代码已经被包含,则不会再次包含

二、判断是否存在文件包含

      举例说明:

                 DVWA中的文件包含page参数可以打开对应的文件,所以对于page参数是不可控的存在,可尝试打开一些私密文件,无限本地文件包含的效果,因此也会形成目录遍历的效果。

    文件包含的表达式:

             发现有文件包含的存在,但是没地方上传脚本,那首先判断目标主机是windows还是linux主机,然后对敏感目录进行信息搜集,访问不了则是没有访问的权限(相对路径是通过知道绝对路径的层次,来表达如

 储存表达为       C:/phpstudy/www/dvwa/xxx

 URL表达为        http://127.0.0.1/dvwa/xxx

相对路径表达为     ../../../dvwa/xxx  

注:没有权限是打不开对应文件的

       常见的敏感目录:

 windows

C:\boot.ini    查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml IIS 配置文件
C:\windwos\repair\sam    存储windows系统初次安装的密码
C:\ProgramFiles\mysql\my.ini      Mysql配置
C:\ProgramFiles\mysql\data\user.MYD       root密码
C:\windows\php.ini  php配置信息

linux

/etc/password  账户信息
/etc/shadow    账户密码信息
/usr/local/app/apache2/conf/httpd.conf   APAche2配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf   虚拟网站配置
/usr/local/app/php5/lib/php.ini      PHP相关配置
/etc/httpd/conf/httpd.conf   Apache配置文件
/etc/my.conf     mysql配置文件

 三、DVWA案例实践

            LOW

            本地文件包含(LFI)

                    案例1:

                        配合文件上传得到脚本文件的路径,然后再进行连接。首先通过文件上传的功能,将文件上传到目标服务器,得到上传后的文件路径。

 

                         将文件路径包含到page参数的后面,跳转执行。

                          利用任何文件都会被当作php执行特性,最后利用菜刀进行连接即可。

                        案例2:

                                  apache日志进行文件包含

                           当发现有文件包含漏洞,但是没有地方上传文件的时候,可以利用apache日志进行文件上传。首先在web的URL后面构造getshell,在burpsuite里面将URL编码改回原来的getsehll代码。【apache的日志文件路径以apache的版本进行参考】

 

                                在apache的access.log日志或者error日志中就可以看到记录下的getshell语句,然后通过文件包含访问access.log日志,触发PHP被动,最后菜刀或者其它工具连接即可。

 

 

拓展:                          

                                    文件包含会按照php格式读取apache文件,也会触发xss跨站脚本攻击(或许还有更多操作空间),但是遇到外部引入的函数(如<svg /οnlοad=alert(1)>),则不会将所有内容全部反馈到前端页面(如phpinfo),但里面所有内容会默认按照php脚本执行,所以可以进行getshell

 

          远程文件包含(RFI)

            条件:

                 php的配置选项allow_url_include、allow_url_fopen状态为ON的话,则include/require函数是可以加载远程文件的。

                  比如http://www.baidu.com/dvwa/1.txt ,存在一个脚本文件,那么可以远程访问并执行它,又或者自己开一个web服务,上传到服务器上一个getshell,让远程文件包含漏洞执行它,不过远程文件包含条件比较苛刻,所以不是所有都可以。       

                  简单的验证方式就是在参数后面拼接百度地址,实现跳转则证明有远程包含。  

medium级别

             原理上是一样的,只是添加了一些过滤条件。

             可以利用双写绕过,00截断的方式(条件magic_quotes_pgc=OFF  php版本<5.3.4),路径长度截断(条件window OS),对远程文件包含有影响,本地文件知道绝对路径没有什么影响,相对路径的../被屏蔽了,利用双写的方式可绕过

LFI

RFI 

    HIGH级别

         只支持file文本传输协议对本地文件进行读取,不支持远程文件执行,需要知道文件的绝对路径。

 php伪协议

file://      访问本地文件系统,不受allow_url_fopen与allow_url_include的影响
http://  访问http网址
ftp://  访问FTP(s)URLs
php://   访问各个输入\输出流(1/0 streams)
zlib://   压缩流
data://  数据
glob://  查找匹配的文件路径模式

猜你喜欢

转载自blog.csdn.net/G_WEB_Xie/article/details/129725561
今日推荐