(プログラム側で入力値チェックやエスケープしているものとする)
QUERY_STRING
に不正な文字が来たらサーバーのリソースを使わせるのはもったいないため
即座に終了させる。(毎分延々とアクセス来たりするため)
海外のサーバー50台からアクセス来てた。
必要に応じてブロックしたい文字を追加すること
// (, by ,' が来たらdie()
if(preg_match('/(\(|%28|%20[Bb][Yy]%20|\'|%27)/',$_SERVER['QUERY_STRING'])){
header("HTTP/1.0 404 Access denied.");
die("your access has been blocked.");
}
- %20 : 半角スペース
- %28 :
(
- %27 :
'
不正アクセス例
不正アクセス例
?hoge=fuga'
?hoge=fuga' AND BENCHMARK(2999999,MD5(NOW())) GrOup BY 20&
?hoge=fuga' And sLEEp(3)) #&
?hoge=fuga%27%20UNION%20SELECT%20CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45),CHAR(45,120,50,51,45,81,45),CHAR(45,120,50,52,45,81,45),CHAR(45,120,50,53,45,81,45)%20--%20/*%20order%20by%20%27as%20/*
?hoge=fuga%22%20or%20(1,2)=(select*from(select%20name_const(CHAR(111,108,111,108,111,115,104,101,114),1),name_const(CHAR(111,108,111,108,111,115,104,101,114),1))a)%20--%20%22x%22=%22x
- これらの共通点は
カッコ
があることだとわかった。(
と%28
をブロック。 - またIPAのpdfによると
シングルクォート
の例や、ネットの情報ではorder by
などの例を発見。 - 最新版のPDF71page
- We Analyze Web Hosting. IPアドレスから地域を特定
アクセス数多い順にIP表示
cat /var/log/httpd/access_log | awk -F " " '{print $1}' | sort | uniq -c | sort -n -r | head
ブラックリスト化
blacklist.php
<?php
$ip_blacklist = array(
// 2016-09-22 (Thu) SQL injection access.
'89.146.221.7',
'134.213.119.7',
'23.91.70.7',
//
);
if(in_array($_SERVER['REMOTE_ADDR'], $ip_blacklist)) {
die("blacklisted.");
}
unset($ip_blacklist);
?>