如何从日志中识别可能的XSS攻击并生成威胁情报?

永景的笔记 阅读 68

最近在审计公司前端项目时,发现访问日志里频繁出现带标签的请求参数,但不确定怎么系统化分析这些威胁。比如用户提交的评论里有<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指标。有没有更好的日志分析工具或规则可以推荐?

我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
シ淑丽
シ淑丽 Lv1
这个问题的关键是需要从日志中提取潜在的XSS攻击特征,并通过规则和上下文分析来区分误报和真实攻击。我们可以分几个步骤来解决。

第一步,我们需要对日志中的请求参数进行解码和标准化处理。攻击者往往会使用URL编码、HTML实体编码等方式来绕过简单的正则匹配。我们可以通过一个预处理函数来统一格式:

function normalizeInput(input) {
// 先进行URL解码
let decoded = decodeURIComponent(input);
// 再进行HTML实体解码
const textArea = document.createElement('textarea');
textArea.innerHTML = decoded;
return textArea.value;
}


第二步,建立一个更全面的XSS特征检测机制。单纯靠正则确实容易漏掉变形写法,这里推荐结合词法分析和语法分析的方法。可以参考OWASP的XSS过滤规则,我给你写个基础版本:

const xssPatterns = [
/<scriptb[^>]*>[sS]*?</script>/gi, // script标签
/javascripts*:/gi, // javascript伪协议
/onw+s*=s*["'][sS]*?["']/gi, // 事件处理器
/&#x?[0-9a-f]{2,6};/gi // HTML实体编码
];

function detectXSS(payload) {
for (let pattern of xssPatterns) {
if (pattern.test(payload)) {
return true;
}
}
return false;
}


第三步,设计威胁情报提取逻辑。这里需要注意的是,不能简单地把所有匹配到的内容都当作攻击。我们要结合几个维度来判断:

1. 请求频率:同一个IP在短时间内多次尝试不同payload
2. 载荷复杂度:简单的<script>可能只是测试,复杂的混淆代码更可疑
3. 响应状态码:如果服务器返回了200,说明可能成功执行

可以用这样的结构来记录IOC指标:

function analyzeLogEntry(entry) {
let normalizedBody = normalizeInput(entry.body);
if (detectXSS(normalizedBody)) {
return {
timestamp: new Date(),
source_ip: entry.ip,
request_method: entry.method,
target_url: entry.url,
payload: normalizedBody,
user_agent: entry.user_agent,
severity: calculateSeverity(normalizedBody)
};
}
}

function calculateSeverity(payload) {
let score = 0;
// 复杂度越高,分数越高
score += payload.length > 50 ? 2 : 0;
score += /eval|document.|window./.test(payload) ? 3 : 0;
return score >= 5 ? 'high' : 'medium';
}


第四步,关于工具选择。ELK(Elasticsearch+Logstash+Kibana)是个不错的选择,但如果你想要更专业的安全分析工具,建议考虑Splunk或者Graylog。这些工具支持复杂的查询语句和告警规则。

举个例子,在ELK里你可以这样写查询规则:
payload.keyword:*<script>* OR payload.keyword:*javascript:*


最后说下生成威胁情报报告的部分。建议采用STIX/TAXII标准来组织数据,方便后续和其他安全系统集成。一个基本的STIX对象示例:

{
"type": "indicator",
"spec_version": "2.1",
"id": "indicator--12345678",
"created": "2023-01-01T00:00:00Z",
"modified": "2023-01-01T00:00:00Z",
"name": "Possible XSS Attack",
"description": "Detected potential XSS payload",
"pattern": "[url:value LIKE '%