Python-LDAP 过滤字符转义绕过漏洞分析

本文详细分析了python-ldap库中ldap.filter.escape_filter_chars方法存在的 sanitization 绕过漏洞。当使用escape_mode=1模式并传入精心构造的列表或字典时,特殊字符不会被正确转义,可能导致LDAP注入攻击。

CVE-2025-61911:python-ldap 过滤字符转义绕过漏洞

漏洞概述

python-ldap 库中的 ldap.filter.escape_filter_chars 方法存在 sanitization 绕过漏洞。当使用非默认的 escape_mode=1 配置并传入精心构造的列表或字典作为 assertion_value 参数时,该方法会跳过对特殊字符的转义处理。

受影响版本

  • 受影响版本:< 3.4.5
  • 已修复版本:3.4.5

技术细节

ldap.filter.escape_filter_chars 方法支持三种不同的转义模式:

  • escape_mode=0(默认)和 escape_mode=2:当传入列表或字典对象作为 assertion_value 参数时会抛出异常
  • escape_mode=1:不会对返回值执行充分的转义逻辑

漏洞验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
>>> import ldap.filter

# 可被利用的情况
>>> ldap.filter.escape_filter_chars(["abc@*()/xyz"], escape_mode=1)
'abc@*()/xyz'
>>> ldap.filter.escape_filter_chars({"abc@*()/xyz": 1}, escape_mode=1)
'abc@*()/xyz'

# 不可被利用的情况
>>> ldap.filter.escape_filter_chars("abc@*()/xyz", escape_mode=1)
'abc@\\2a\\28\\29\\2fxyz'
>>> ldap.filter.escape_filter_chars(["abc@*()/xyz"], escape_mode=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib64/python3.12/site-packages/ldap/filter.py", line 41, in escape_filter_chars
    s = assertion_value.replace('\\', r'\5c')
        ^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'list' object has no attribute 'replace'

影响分析

如果应用程序依赖此易受攻击的方法来转义不受信任的用户输入,攻击者可能利用此漏洞发起 LDAP 注入攻击,从而泄露或操纵本应无法访问的 LDAP 数据。

由于 Python 是动态类型语言,且常用的 JSON 格式支持列表和字典,Python 应用程序可能会经常将未经检查的、潜在恶意的列表和字典对象传递给此易受攻击的清理方法。

修复建议

ldap.filter.escape_filter_chars 方法的开始处添加类型检查,当传入的 assertion_value 参数不是字符串类型时抛出异常。

参考链接

安全评分

  • 严重程度:中等
  • CVSS 评分:5.5
  • EPSS 评分:0.059%(第18百分位)

相关弱点

  • CWE-75:未能将特殊元素清理到不同平面(特殊元素注入)
  • CWE-843:使用不兼容类型访问资源(类型混淆)
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计