文件包含漏洞介绍
文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户知道路径的文件,然后将文件包含到当另一个文件里面形式如下;
http://127.0.0.1/pikachu-master/vul/fileinclude/fi_local.php?filename=被包含的文件路径
&submit=提交
原理
- 在通过PHP的相应函数(比如include()) include()等函数通过动态变量的方式引入需要包含的文件,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
- 本地包含:是包含本地的文件,且传入的文件路径是相对路径
- 远程包含:默认是不允许的,在php.ini管理php代码的文件里面打开可远程的配置allow_url_include中配置打开即可。打开这个配置就可以包含远程的文件,也就是绝对路径。
漏洞利用
一.伪协议
对于文件包含在不能包含远程文件的情况下如果不使用为协议直接包含服务器本地文件的话对于查看文件或者获取shell都会比较困难,所以需要灵活的应用php的为协议。
1.php://filter
用于读取文件,并把读取到的文件内容包含到当前页面里面如:
?file=php://filter/read=convert.base64-encode/resource=/flag
这端伪协议的作用是把读取到的内容进行base64加密再被包含到当前文件里面,这样做的目的是防止包含文件的内容有代理被编译了无法容易的查看到
2.php://input
这个伪协议是用于执行当时数据包里POST提交的内容,注意是执行一次就没了。并不能保存在当前页面。所以想通过php://input写入木马并不能像如下操作:
这样并不是把木马包含到了当前文件里面,只是简单执行了一下。所以如果想用php://input获取shell,执行的语句必须是写入文件的语句如下:
<?php fputs (fopen("2.php","w"),'<?php eval($_POST[cmd]);?>');?>
当然也可以执行系统命令如下:
<?php system("ls");?> #这是一类payload是有回显
3.data://伪协议
data://text/plain,hello ctf
上面这句的意思,是把hello ctf这个内容变成txt文件上传到当前目录下。
二.通过包含日志文件利用漏洞
我们访问的网站的内容都会被日志记录下来,那如果我们的数据包中含有一句话木马,通过访问被日志记录下来然后再把日志文件包含到脚本文件里面如php,则可以连接利用。
Nginx中的日志分两种,一种是error.log,一种是access.log。error.log可以配置成任意级别, 默认级别是error,用来记录Nginx运行期间的处理流程相关的信息;access.log指的是访问日志, 用来记录服务器的接入信息(包括记录用户的IP、请求处理时间、浏览器信息等)。
默认nginx日志是:/var/log/nginx/access.log 和 /var/log/nginx/error.log
对于Apache,日志存放路径:/var/log/apache/access.log
然后包含这个日志文件即可。
但是要记住access.log日志文件中的php代码是不会被解析的,之所以能够执行下列并被成功连接时因为日志里面的php木马被包含在了当前的index.php文件中,所以木马才成功被执行。