本文主要介绍通过ModSecurity检测并替换请求体及响应体当中的指定内容。
一、应用场景
1.特殊符号替换。通过对请求体内容进行过滤,可以对一些特殊符号进行替换,如空格、单双引号、斜杠、注释符等,降低网站被成功入侵的概率;
2.避免信息泄露。通过对响应体内容进行过滤,可以避免网站在访问出错时,服务器或网站的一些信息被暴露出去,如网站目录等。
3.违法信息监测。通过对响应体内容进行过滤,可以检测网站中是否存在违法信息,但一般对于服务商来说,更多的方式还是购买违法信息监测系统,在网络出口对所有业务进行监控。
二、原理
对请求体/响应体的内容进行检测并替换,主要用到ModSecurity中的rsub指令,该指令支持通过正则表达式,对请求体及响应体的内容进行替换,语法如下:
@rsub s/regex/str/[id]
s为固定字符,代表要进行替换操作;
regex代表正则表达式,用于捕获要替换的字符串,也可直接输入要替换的字符串;
str代表替换后的字符串;
id为可配置项,其作用目前不明,个人原以为其代表替换次数,如id设置为1,要替换响应体当中的test数据,如果test出现两次,则只将第一个test进行替换,第二个test不进行替换,但实际测试效果并未达到预期效果。
三、前提工作
首先需要开启SecContentInjection配置项,然后根据自身需求,分别开启SecStreamInBodyInspection与SecStreamOutBodyInspection,在modsecurity.conf文件中进行配置即可。
#开启内容注入 SecContentInjection On #开启请求体内容注入,根据实际需求进行开启 SecStreamInBodyInspection On #开启响应体内容注入,根据实际需求进行开启 SecStreamOutBodyInspection On
四、规则配置
对请求体数据进行替换
#该规则表示,对请求体当中的所有test数据进行替换(包括参数名与参数值),将其替换为abc SecRule STREAM_INPUT_BODY "@rsub s/test/abc" "phase:2,id:11002,nolog,pass"
编写对应PHP脚本进行测试,脚本内容如下:
<?php echo "参数a的数值为:".$_REQUEST['a']."</br>"; if(array_key_exists('test', $_REQUEST)){ echo "接收到了test参数"; } if(array_key_exists('abc', $_REQUEST)){ echo "接收到了abc参数"; } ?>
通过POST提交a=test&test=b进行测试,开启规则前,程序返回内容如下图所示,参数a的数值test,同时程序接收到了名为test的参数,并没有收到名称abc的参数。
开启规则后,程序返回内容如下图所示,参数a的数值被替换为abc,同时程序接收到了名为abc的参数,test的参数名称被替换。
对响应体数据进行替换
#该规则表示,对响应体当中的内容进行检测,将"共产党"替换为"***" SecRule STREAM_OUTPUT_BODY "@rsub s/共产党/***" "phase:4,id:11000,nolog,pass"
规则开启前,网站显示内容如下:
规则开启后,网站显示内容如下:
五、其他补充
1.对中文字符进行替换时,需要确保网站的编码、配置文件的编码一致,如网站使用UTF-8,则配置文件也要在UTF-8的编码格式下输入要替换的中文字符;
2.虽然对数据进行了替换,但ModSecurity的审计日志中记录的仍是替换前的原始数据。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。