首页 应用实战正文

通过ModSecurity检测并替换请求体及响应体当中的指定内容

王子 应用实战 2021-07-29 6186 0

本文主要介绍通过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的参数。

74378a0e-362e-46a9-9ff8-f4542f9304fe.png

开启规则后,程序返回内容如下图所示,参数a的数值被替换为abc,同时程序接收到了名为abc的参数,test的参数名称被替换。

69f38b10-2ad1-4b16-9589-e7b4c18651cb.png


对响应体数据进行替换

#该规则表示,对响应体当中的内容进行检测,将"共产党"替换为"***"
SecRule STREAM_OUTPUT_BODY "@rsub s/共产党/***" "phase:4,id:11000,nolog,pass"

规则开启前,网站显示内容如下:

772af41a-b351-4faa-a5ea-e46f8ca4e2ca.png

规则开启后,网站显示内容如下:

53b091ac-94ae-4a13-a76c-2417a5116c44.png


五、其他补充

1.对中文字符进行替换时,需要确保网站的编码、配置文件的编码一致,如网站使用UTF-8,则配置文件也要在UTF-8的编码格式下输入要替换的中文字符;

2.虽然对数据进行了替换,但ModSecurity的审计日志中记录的仍是替换前的原始数据。


版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。