文件包含系列
![75adcfa4e1f492271e4256b4e102deaf.png](https://i-blog.csdnimg.cn/blog_migrate/4cf64a5a8075fbdf93b7cbd58570685f.png)
Include stdio.h
Import request
很多网站的admin(管理员)入口和user(用户)入口是分开的,登陆过程所调用的函数可能都是同一个函数,最后操作的表不同。如果调用的是同一个函数,网站一般分开两个文件存储:admin目录和user目录。在不同文件中,如果没有使用“文件包含”这个操作,同一个函数就会出现在两个文件中增加重复工作的工作量。但是如果使用“文件包含”操作,直接调用函数就可以了。
![c0971bb5da64be9f879c800cd49b670b.png](https://i-blog.csdnimg.cn/blog_migrate/6fa79b2c425ead0f9a70babf80f64ae1.png)
如果不用文件包含需要重复写,所有的内容都写在一个文件里面,文件会非常大,维护起来也非常难。
文件包含产生了之后,相应的漏洞也是在特定几个条件下才会产生。
为了代码灵活将包含的文件设置成一个变量进行动态调用,但却导致用户可以去恶意调用,造成了文件包含漏洞。
比如说index.php?page=aaa&func=bbb调用.php?page=aaa中的func=bbb函数。
相关函数
![ca4d4c14ec0e9fbf1687bd6d232050e3.png](https://i-blog.csdnimg.cn/blog_migrate/bba3513b4b69635a682503911b2dc76f.png)
![0ed96fd5143283c4d6e867344ffc5d6d.png](https://i-blog.csdnimg.cn/blog_migrate/b6e2346b428d078e86306b2e3479d2a9.png)
![50a486086a4b2568a4dc77ab40e44041.png](https://i-blog.csdnimg.cn/blog_migrate/d340c52981f9d64878bdb039c051bbe1.png)
不一定要去包含这种php文件,只要里头包含完整的块就可以。我们可以控制被包含文件的内容,比如插入一段php代码, 或者压缩包,压缩包需要配合一些伪协议。
本地文件包含:
![a83bcb4ef5ce7d9200b06f0996e7cf3e.png](https://i-blog.csdnimg.cn/blog_migrate/07b8ee116dc566f5fb6cfb0e8ec0d05a.jpeg)
具体场景——上传的可控文件
![a7e20cda47ecdc1f9709c84209a506ea.png](https://i-blog.csdnimg.cn/blog_migrate/1288ba869df9c499942f2710eb545931.jpeg)
验证一下包含的效果:
![c266752a85be18286bd15e35c37e8315.png](https://i-blog.csdnimg.cn/blog_migrate/44dcfb2b9581bbe04e8bf5a03d540f2f.jpeg)
![726bd7705257773d80c70aff2bc7ffae.png](https://i-blog.csdnimg.cn/blog_migrate/00f9acd39d01e24145c300132c9236b5.jpeg)
![b15e72444a00368999a57b04eebec7c3.png](https://i-blog.csdnimg.cn/blog_migrate/5aee96a6409428db4c9ac0c5f63d565a.png)
远程文件包含
![27e0c28752d4d9a7cd5dbcb4d21753be.png](https://i-blog.csdnimg.cn/blog_migrate/afbb1d9369a9a04b14ab5082c70a1ac6.png)
?在请求过程中作为一个参数传递给http://aaa.com/1.txt?a.php,1.txt只要请求的东西不被这个参数影响,后面传什么参数进去,其实都没有关系。
![818fe32b19746b03c80fd4a9ffdce66e.png](https://i-blog.csdnimg.cn/blog_migrate/ad50dded299a36f48d3c9264873895e4.png)
如果是远程文件包含就可以做绕过,但你要注意到远程包含的时候,如果说你要去包含远程文件,http中支持的协议就是http https ftp这三个,问号绕过和之前%00截断的道理是有点类似的。HTTP文件包含用的最多的还是伪协议,比如file重点看一下。
具体场景——伪协议
![564e1245b741b6943e7a8e47e4fa099c.png](https://i-blog.csdnimg.cn/blog_migrate/15efbae948a6406a80d30003e75e1426.png)
举例子
up load看起来像一个文件名的前缀:
![536f22cbe609121e2de482f7e0e9033e.png](https://i-blog.csdnimg.cn/blog_migrate/244253ed09ff4abd39205f0f0037a71c.png)
它就会返回一个目录,这个目录的区包含文件,它支持伪协议,那可以用这个形式去试一下,后面跟上一个井号,这里存在一个编码问题,实际传的就是.php,要把他本来带的这个.php给去掉,再去这样执行,你就会发现它执行成功了,里面的文件换成一个我需要的后门就可以了,打包和部署可以免去大量的麻烦。
![369a4f7550160a1a2fae2df821fa34d6.png](https://i-blog.csdnimg.cn/blog_migrate/24db4c1577222e7c3dd956280bf45432.jpeg)
配合phar协议来,我们把zip换成phar这样来试试看,发现执行成功。
![c86aa4c396396e0e3136183e999bc18d.png](https://i-blog.csdnimg.cn/blog_migrate/ac1a0d312308a27c90a9239cc437384a.jpeg)
这就是phar的一个作用,如果说你在一个点上能够上传phar包,但是你又不知道如何去构造phar包,你就可以直接找个压缩包,改了后缀名改成phar上传,再配合phar伪协议就可以了。
![a3185bc24e1ed5e3296f779491042b87.png](https://i-blog.csdnimg.cn/blog_migrate/dc7c240e6baa06e1f8b52e3d6f80bc82.jpeg)
创立了一个phpinfor.php,然后把它压缩,压缩之后再改成jpg,上传这个文件后它属于哪种文件类型呢?
![80164eefd6c4ba431680064abe95669a.png](https://i-blog.csdnimg.cn/blog_migrate/78b5fe2abca91ca80da4ea853e2bd01e.jpeg)
还是可以成功的。