冷静的点根烟,然后思考一番….
首先,file_put_contents()这个函数的作用是什么?
这是w3school给出的介绍
很明显它是给文件写入一个字符串..注意是文件!!!!!
那其实很明了了,例如如下代码
1 |
|
给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 |
成功执行
关于正则觉得有必要好好学习啊!!