冷静的点根烟,然后思考一番….

首先,file_put_contents()这个函数的作用是什么?​

这是w3school给出的介绍

很明显它是给文件写入一个字符串..注意是文件!!!!!

那其实很明了了,例如如下代码

1
2
3
4
5
6
7
<?php

$text = $_GET['text'];

file_put_contents('config.php',$text);

?>

给php代码写入一个字符串. 写啥呢?任意!!! 因为它没做任何过滤..

所以我们可以写shell,可以写phpinfo();

当输入如下

1
http://localhost/test.php?text=%3C?php%20phpinfo();?%3E

我们查看一下同目录的config.php的内容

发现phpinfo()成功被写入,并且执行

当然开发人员又不是个傻子,肯定不可能毫无防备的让你输入可以执行的php代码啊!

按照我们正常,写入文件的一般只是普通的字母加数字,当然不排除需要一些特殊字符.

假设正则表达式是这样的

1
preg_match('[<>?]', $text)

测试一下正则的效果

那么怎么绕过这个正则呢?

回到开头的那张图片..php函数的用法.

其中它的data参数可以是数组.

当传入数组的时候,由于PHP的弱类型,数组会被强制转换成字符串,也就是Array.就不存在<>?这样的特殊字符.于是就满足了正则.

1
http://localhost/test.php?text[]=%3C?php%20phpinfo();?%3E

成功执行

关于正则觉得有必要好好学习啊!!