EIS中有一道cms 后台getshell的实战类题目,其中写入配置文件从而getshell的方式很经典,这里简单一下这个getshell的原理,仅作学习
来看写入配置文件的逻辑,全局搜索file_put_contents就可以找到
1 | /** |
Config.php的内容如下
1 |
|
这里的逻辑是正则匹配出原config.php
文件的key=>value对,然后替换为新的配置。
这个cms存在全局过滤,过滤机制类似phpcms的过滤函数:
1 | /** |
可以看到我们想要的单引号被过滤了,没有办法直接拼接单引号来注入代码到config.php中。
然而可以注意到replacement的内容为:
1 | $replacement[$k] = "'".$k."' => \${1}".$v."\${2}\${3},"; |
再查看我们的匹配正则
1 | $pattern[$k] = "/'".$k."'\s*=>\s*([']?)[^']*([']?)(\s*),/is"; |
可以看到匹配到的${1}
正是单引号本身,因此我们只要添加值为${1}.phpinfo().${1}
即可重新引入被
过滤掉的单引号,从而逃逸出来成功注入任意代码。
参考文档