一,在不改动现有系统任何代码的前提下,防止SQL注入
比如下面这个场景:服务器中难免有些安全性比较差的程序,比如使用了老版本的dedecms。或者某个程序引用的第三方插件,在SQL处理上,没有使用参数绑定,而是直接拼接字符串,还没有类型检查。 这时可以考虑使用WAF (Web Application Firewall)。
二,如何选择
市面上的WAF有三种形态,硬件Web防火墙、Web防护软件和云Waf。 最为灵活的方案是选择Web防护软件。
三,安装配置
服务器环境Windows server 2008, Apache是PHP官方推荐的Windows二进制版 http://www.apachelounge.com/ 。
首先安装好Apache 2.4,下载对应版本的mod_security http://www.apachelounge.com/download/ 。
我下载的是 mod_security-2.9.2-win64-VC15.zip 解压后,里面有两个文件夹,mod_security和mlogc中readme.txt,有安装过程。
### mod_security中Readme.txt的大致内容: 安装mod_security-2.9.2 拷贝 mod_security2.so 到你的 apache/modules 文件夹 拷贝 yajl.dll and libcurl.dll 到你的 apache/bin 文件夹 配置文件 httpd.conf: 取消注释, LoadModule security2_module modules/mod_security2.so LoadModule unique_id_module modules/mod_unique_id.so # 快速开始: SecRuleEngine On SecDefaultAction "deny,phase:2,status:403" ## -- 规则-- SecRule ARGS "\.\./" "t:normalizePathWin,id:50904,severity:4,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,msg:'Drive Access'"
重启apache,在浏览器打开如下地址,会提示403拒绝访问
http://www.xxxx.com/?abc=../../
四,安全防护
添加规则要参考,http://www.modsecurity.org/rules.html ,官网推荐 https://github.com/SpiderLabs/owasp-modsecurity-crs
下载规则,解压到 |apache\conf\modsecurity-crs下。
设置配置文件httpd.conf
LoadModule security2_module modules/mod_security2.so # Rules and documentation : http://www.modsecurity.org/ SecRuleEngine On SecDefaultAction "deny,phase:2,status:403" ## -- rule -- SecRule ARGS "\.\./" "t:normalizePathWin,id:50904,severity:4,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,msg:'Drive Access'" <IfModule security2_module> Include conf/modsecurity-crs/crs-setup.conf Include conf/modsecurity-crs/rules/*.conf </IfModule>
五,安全防护日志
mlogc可以记录所有被规则拦截的日志。配置如下:
<IfModule security2_module> Include conf/modsecurity-crs/crs-setup.conf Include conf/modsecurity-crs/rules/*.conf # mlogc.exe 配置文件 SecDataDir logs SecAuditEngine RelevantOnly SecAuditLogRelevantStatus "^(?:5|4\d[^4])" SecAuditLogType Concurrent SecAuditLogParts ABCDEFGHZ SecAuditLogStorageDir logs/mod_security/ SecAuditLog "${SRVROOT}/bin/mlogc.exe" </IfModule>
六,测试
下面是安全狗的防护日志,可以用来测试一下mod_security和OWASP
/?ac=digg&ac2=&id=1&tab=vod union select null,md5(1231412414) 拦截原因:防止SQL联合查询,可疑内容:Union /?ss=x and 1=1,拦截原因:防止简单的and or 方式注入 /?ss=information_schema。。。,拦截原因:非法访问information_schema数据库 /?typeArr[1' or `@\'`=1 and (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(substring((Select pwd from dede_admin limit 1,1),1,62)))a from information_schema.tables group by a)b) and ']=11&&kwtype=0&q=1111&searchtype=title,拦截原因:防止对数据库进行数据查询操作,可疑内容:Select pwd from dede_admin limit /?typeArr[1' or `@\'`=1 and (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(substring((Select uname from dede_admin limit 1,1),1,62)))a from information_schema.tables group by a)b) and ']=11&&kwtype=0&q=1111&searchtype=title,拦截原因:防止对数据库进行数据查询操作,可疑内容:Select uname from dede_admin limit /?aid=1&_FILES[type][name]&_FILES[type][size]&_FILES[type][type]&_FILES[type][tmp_name]=aa\'and char(@`'`) Union*/ SeLect*/ 1,2,3,group_concat(userid,0x23,pwd),5,6,7,8,9 from `#@__admin`#,拦截原因:防止SQL联合查询,可疑内容:Union SeLect 1,2,3,group_concat(userid,0x23,pwd),5,6,7,8,9 from `#@__admin`#
都可以被拦截到,现在apache/logs/mod_security下面生成的防护日志如下:
--4d070000-A-- [28/Apr/2018:16:24:53 +0800] WuQv1aUHpaQ0n2CMGvixFAAAAJE 171.14.39.141 56190 122.114.245.230 443 --4d070000-B-- GET /?ss=information_schema HTTP/1.1 Host: javascript.net.cn ... --4d070000-F-- HTTP/1.1 403 Forbidden Content-Length: 209 Keep-Alive: timeout=5, max=99 Connection: Keep-Alive Content-Type: text/html; charset=iso-8859-1 --4d070000-E-- --4d070000-H-- Message: Warning. Pattern match "(?i:\\b(?:m(?:s(?:ysaccessobjects|ysaces|ysobjects|ysqueries|ysrelationships|ysaccessstorage|ysaccessxml|ysmodules|ysmodules2|db)|aster\\.\\.sysdatabases|ysql\\.db)\\b|s(?:ys(?:\\.database_name|aux)\\b|chema(?:\\W*\\(|_name\\b)|qlite(_temp)?_master\\b) ..." at ARGS:ss. [file "D:/ap/apache/conf/modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "100"] [id "942140"] [rev "3"] [msg "SQL Injection Attack: Common DB Names Detected"] [data "Matched ... Response-Body-Transformed: Dechunked Producer: ModSecurity for Apache/2.9.2 (http://www.modsecurity.org/); OWASP_CRS/3.0.2. Server: Apache/2.4.33 (Win64) OpenSSL/1.1.0h PHP/7.2.4 mod_evasive2/1.10.2 Engine-Mode: "ENABLED" --4d070000-Z--
修改时间 2018-04-29