利用file_put_contents()函数写shell的小trick 技术文章

首先不了解PHP的file_put_contents()函数的自己去这里看一下官方给出的解释:

http://php.net/manual/zh/function.file-put-contents.php

 shot_20170920_210309.png

思路大致如下:

file_put_contents()在写入文件时的第二个参数可以传入数组,如果是数组的话,将被连接成字符串再进行写入。在正则匹配前,传入的是一个数组。得益于PHP的弱类型特性,数组会被强制转换成字符串,也就是ArrayArray肯定是满足正则\A[ _a-zA-Z0-9]+\z的,所以不会被拦截。这样就可以绕过类似检测“<?”之类的waf。

下面是测试的代码:

<?php
header("Content-type: text/html; charset=utf-8");
/*
测试file_put_contents数组写shell
modify:Mrxn
Blog:https://mrxn.net/
*/
echo "just a shell test!";
$text = $_GET['text'];
if (preg_match('[<>?]', $text)) {
die('erro!');
}
echo '<br>'.'下面就是text的内容:'.'<br>';
echo $text;
echo '<br>';
var_dump($text) ;
file_put_contents('config.php', $text);
?>

我们访问后,通过自己定义text可以实时得到反馈,便于测试:

shot_20170920_212134.png

代码检测了写入的内容是否存在“<”“>”“?”等字符。根据上面的trick,我们可以通过传入一个数组来达到写入shell的目的。可以看到虽然有个警告。但config.php确实被写入了。<? php phpinfo(); 如下所示:shot_20170920_212202.png

注:这个不是我发现的,是在P牛的小蜜圈发现的.只是自己亲自测试了一下,将代码略作修改,便于新手理解!)_我就是说我自己是个新手-_- 囧| 逃 :)

我们下次再见...

ps:友情链接里面,有看到的自己帮忙加上,一个月后没有加的我就删除了.

标签: shell php 函数

admin 发布于  2017-9-20 20:55