如何从日志中识别可能的XSS攻击并生成威胁情报?
最近在审计公司前端项目时,发现访问日志里频繁出现带标签的请求参数,但不确定怎么系统化分析这些威胁。比如用户提交的评论里有<script>alert('xss')</script>这种内容,我尝试用正则匹配标签,但总漏掉变形写法。
现在用Nginx日志记录了所有POST请求,里面有很多类似这样的条目:
{
"method": "POST",
"url": "/api/comments",
"body": "content=%3Cscript%3Ealert(document.cookie)%3B%3C%2Fscript%3E",
"user_agent": "Mozilla/5.0 ..."
}
之前写了个中间件用DOMPurify.sanitize()过滤输入,但领导要求生成威胁情报报告。现在卡在如何区分误报和真实攻击,以及怎么提取攻击特征生成IOC指标。有没有更好的日志分析工具或规则可以推荐?
识别思路
你那个日志样本里的content参数,明显是URL编码后的
。先解码再检测,这是第一步。但这只是最基础的,变形写法太多了:大小写混合:
、事件属性:onerror=、onload=,编码绕过:%3Cscript%3E、、利用标签:img src=x onerror=1、svg/oncick=,还有javascript:伪协议。我的建议是别自己造轮子,直接用现成的规则库。OWASP ModSecurity Core Rule Set(CRS)里专门有XSS检测规则,能覆盖大部分变形写法。配合ModSecurity或者直接用日志分析工具加载这些规则。
区分误报和真实攻击
这个确实头疼。几个判断维度:
一是看业务场景。如果/api/comments这种用户生成内容的接口,允许部分HTML是合理的(富文本评论)。这时候你需要结合业务逻辑:允许的标签白名单、标签属性限制等。DOMPurify的输出可以做二次校验——如果日志中出现的payload被DOMPurify拦截了,那基本就是攻击尝试。
二是看攻击是否被执行。光有payload不算,得看后续有没有利用这个输入的输出点。比如日志里出现
,但响应里没有回显,那可能是误报或者盲打。三是看频率和来源。单个IP短时间大量尝试肯定是扫描行为,直接封禁就完事儿。
IOC提取
这个比较直接,结构化一下就行:
攻击特征:原始payload、攻击类型(存储型/反射型)、目标参数名
攻击者信息:源IP、User-Agent、请求时间
上下文:目标URL、HTTP状态码、响应长度(判断是否成功)
给你个Python提取的例子,大概这么写:
工具推荐
生产环境我建议用这些:
ELK + ModSecurity:日志收集+规则检测一条龙
Splunk:有自带的XSS检测规则库,付费但好用
GrayLog:开源方案,配合规则也能打
最后说一嘴,你提到用DOMPurify做过滤。务必记住这是前端防护,服务端必须再做一次验证和过滤。攻击者可以直接绕过前端直接发请求到后端,你那条防线形同虚设。服务端用bleach(Python)或HTMLPurifier(PHP)这类库做白名单过滤更稳妥。
第一步,我们需要对日志中的请求参数进行解码和标准化处理。攻击者往往会使用URL编码、HTML实体编码等方式来绕过简单的正则匹配。我们可以通过一个预处理函数来统一格式:
第二步,建立一个更全面的XSS特征检测机制。单纯靠正则确实容易漏掉变形写法,这里推荐结合词法分析和语法分析的方法。可以参考OWASP的XSS过滤规则,我给你写个基础版本:
第三步,设计威胁情报提取逻辑。这里需要注意的是,不能简单地把所有匹配到的内容都当作攻击。我们要结合几个维度来判断:
1. 请求频率:同一个IP在短时间内多次尝试不同payload
2. 载荷复杂度:简单的<script>可能只是测试,复杂的混淆代码更可疑
3. 响应状态码:如果服务器返回了200,说明可能成功执行
可以用这样的结构来记录IOC指标:
第四步,关于工具选择。ELK(Elasticsearch+Logstash+Kibana)是个不错的选择,但如果你想要更专业的安全分析工具,建议考虑Splunk或者Graylog。这些工具支持复杂的查询语句和告警规则。
举个例子,在ELK里你可以这样写查询规则:
最后说下生成威胁情报报告的部分。建议采用STIX/TAXII标准来组织数据,方便后续和其他安全系统集成。一个基本的STIX对象示例: