如果用Node.JS做Web服務,很多時候是會選擇Express的。
本文,將展示如何如何實現一個WAF中介軟體。
WAF有什麼用?WAF即Web Application Firewall,Web應用防火牆,防攻擊、防黑客的。
小提示:npm上,目前還沒有專業的express中介軟體WAF,這可是稀缺的技術!先看完整示例程式碼:
var express = require('express');var app = express();//當訪問根目錄時觸發app.get('/', function (req, res) { res.send('Hello Jshaman.com');})//WAF中介軟體app.use(function(req, res, next) { var path = req.url; console.log(path); if(waf_detect(path) == false){ next(); } //console.log(req.cookies); //console.log(req.headers['user-agent']);});//使用正則表示式,檢測字串是否含有攻擊特徵,檢測到攻擊特徵返回true,沒檢測到返回falsefunction waf_detect(str_to_detect){ var regexp_rule =[ /select.+(from|limit)/i, /(?:(union(.*?)select))/i, /sleep\\((\\s*)(\\d*)(\\s*)\\)/i, /group\\s+by.+\\(/i, /(?:from\\W+information_schema\\W)/i, /(?:(?:current_)user|database|schema|connection_id)\\s*\\(/i, /\\s*or\\s+.*=.*/i, /order\\s+by\\s+.*--$/i, /benchmark\\((.*)\\,(.*)\\)/i, /base64_decode\\(/i, /(?:(?:current_)user|database|version|schema|connection_id)\\s*\\(/i, /(?:etc\\/\\W*passwd)/i, /into(\\s+)+(?:dump|out)file\\s*/i, /xwork.MethodAccessor/i, /(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\\(/i, /\\<(iframe|script|body|img|layer|div|meta|style|base|object|input)/i, /(onmouseover|onmousemove|onerror|onload)\\=/i, /javascript:/i, /\\.\\.\\/\\.\\.\\//i, /\\|\\|.*(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv)/i, /(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv).*\\|\\|/i, /(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\\:\\//i ]; for(i=0; i< regexp_rule.length; i++){ if(regexp_rule[i].test(str_to_detect) == true){\t\t\tconsole.log("attack detected, rule number:", "("+i+")", regexp_rule[i]);\t\t\treturn true; } } return false;}var server = app.listen(8000, function () { var host = server.address().address var port = server.address().port console.log(host, port);})
本示例,是一個帶有WAF功能的Web應用。
內建的中介軟體部分,實現WAF的防護功能:
//WAF中介軟體app.use(function(req, res, next) { var path = req.url; console.log(path); if(waf_detect(path) == false){ next(); } //console.log(req.cookies); //console.log(req.headers['user-agent']);});
即,對發起的請求進行過濾,判斷請求中是否有惡意行為。如果有,則不讓中件間進行next(),請求也就被中斷,達到防止攻擊者入侵的目的。
WAF防護規則攻擊檢測使用的是正則表示式,這是WAF常用的攻擊檢測方式。
這套規則來自ShareWAF,ShareWAF是專業、強大的WAF商業產品。
//This rule from:www.sharewaf.comvar regexp_rule =[ /select.+(from|limit)/i, /(?:(union(.*?)select))/i, /sleep\\((\\s*)(\\d*)(\\s*)\\)/i, /group\\s+by.+\\(/i, /(?:from\\W+information_schema\\W)/i, /(?:(?:current_)user|database|schema|connection_id)\\s*\\(/i, /\\s*or\\s+.*=.*/i, /order\\s+by\\s+.*--$/i, /benchmark\\((.*)\\,(.*)\\)/i, /base64_decode\\(/i, /(?:(?:current_)user|database|version|schema|connection_id)\\s*\\(/i, /(?:etc\\/\\W*passwd)/i, /into(\\s+)+(?:dump|out)file\\s*/i, /xwork.MethodAccessor/i, /(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\\(/i, /\\<(iframe|script|body|img|layer|div|meta|style|base|object|input)/i, /(onmouseover|onmousemove|onerror|onload)\\=/i, /javascript:/i, /\\.\\.\\/\\.\\.\\//i, /\\|\\|.*(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv)/i, /(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv).*\\|\\|/i, /(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\\:\\//i ];
規則邏輯暫且不詳細探討,因為它是正則表示式,如果詳細講述起來,恐怕得另多寫三五篇文章了。
執行效果:
模擬訪問發起攻擊:
http://127.0.0.1:8000/index.html
即在url中傳入select*from admin語句,這是一句常見的SQL注入攻擊語句。
可以看到,網站無法開啟。在後臺輸出了攔截資訊,並提示出觸發了哪條WAF防護規則。
本文只做演示,僅檢測了url路徑。
那麼本程式碼是可以括展的,可以檢測cookie、user-agent、post資料等常見攻擊點。
寫成一個Express模組是完全可以的。
更多本系列文章:
最新評論