首页 应用实战正文

通过ModSecurity检测JSON格式数据

王子 应用实战 2021-03-22 1480 0

本文主要介绍,如何通过编写规则,对提交到WEB服务器的JSON格式的数据进行检测。


前提:服务器中需要安装yajl-devel,且ModSecurity需要在其后再进行编译安装。


默认情况下,ModSecurity将使用URLENCODED和MULTIPART解析器分别处理application/x-www-form-urlencoded和multipart/form-data类型的请求体,如要对JSON格式的数据进行解析并检测,需要临时更改解析器,如下方规则所示:

SecRule REQUEST_HEADERS:Content-Type "application/json" \
    "id:100,phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"

上述规则表示,如果请求头中Content-Type的值为"application/json",则临时将请求体的解析器改为JSON解析器。


此时,我们可以修改Content-Type为"application/json",然后POST以下数据到服务器进行测试:

{
    "Image": {
        "Width": 800,
        "Height": 600,
        "Title": "View from 15th Floor",
        "Thumbnail": {
            "Url": "http://www.example.com/image/481989943",
            "Height": 125,
            "Width": "100"
        },
        "IDs": ["116", "943", "234", "ABC"]
    }
}

提交后,在ModSecurity的Debug日志中,我们可以观察到以下内容:

image.png

上图中表示,ModSecurity已成功解析JSON数据,并在内存中创建了对应的变量,如创建变量Image.Width为800、Image.Height为600,创建集合Image.IDs,集合中的值分别为"116","943","234","ABC"。


此时,我们可以编写规则对指定的参数进行判断:

#对Image.Width的值进行判断,如果大于200,则阻断此次访问
SecRule ARGS:Image.Width "@gt 200" "phase:2,log,id:101,deny,msg:'Json param image.width gt 200'"

#对Image.IDs集合中的值进行判断,如果存在不是数字的参数,则阻断此次访问
SecRule ARGS:Image.IDs.IDs "!@rx ^[0-9]*$" "phase:2,log,id:102,deny,msg:'ID is not number'"


版权声明

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