65 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PHP SSRF
{{#include ../../../banners/hacktricks-training.md}}
### SSRF PHP fonksiyonları
**file_get_contents(), fopen(), file(), md5_file()** gibi bazı fonksiyonlar, kullanıcı veriyi kontrol edebilirse **SSRF zafiyetlerini mümkün kılacak** URL'leri girdi olarak kabul eder:
```php
file_get_contents("http://127.0.0.1:8081");
fopen("http://127.0.0.1:8081", "r");
file("http://127.0.0.1:8081");
md5_file("http://127.0.0.1:8081");
```
### Wordpress SSRF via DNS Rebinding
As [**bu blog yazısında açıklandığı gibi**](https://patchstack.com/articles/exploring-the-unpatched-wordpress-ssrf), hatta Wordpress fonksiyonu **`wp_safe_remote_get`** DNS rebinding'e karşı savunmasızdır ve bu da onu SSRF saldırılarına karşı potansiyel olarak savunmasız hale getirir. Çağırdığı ana doğrulama **wp_http_validate_url**'dir, bu da protokolün `http://` veya `https://` olduğunu ve portun **80**, **443** ve **8080**'den biri olduğunu kontrol eder, ancak **DNS rebinding'e karşı savunmasızdır**.
Yazıya göre diğer savunmasız fonksiyonlar şunlardır:
- `wp_safe_remote_request()`
- `wp_safe_remote_post()`
- `wp_safe_remote_head()`
- `WP_REST_URL_Details_Controller::get_remote_url()`
- `download_url()`
- `wp_remote_fopen()`
- `WP_oEmbed::discover()`
### CRLF
Ayrıca, bazı durumlarda önceki fonksiyonlardaki CRLF "açıkları" aracılığıyla keyfi başlıklar göndermek bile mümkün olabilir:
```php
# The following will create a header called from with value Hi and
# an extra header "Injected: I HAVE IT"
ini_set("from", "Hi\r\nInjected: I HAVE IT");
file_get_contents("http://127.0.0.1:8081");
GET / HTTP/1.1
From: Hi
Injected: I HAVE IT
Host: 127.0.0.1:8081
Connection: close
# Any of the previously mentioned functions will send those headers
```
> [!WARNING]
> Bu CRLF açığı hakkında daha fazla bilgi için bu hatayı kontrol edin [https://bugs.php.net/bug.php?id=81680\&edit=1](https://bugs.php.net/bug.php?id=81680&edit=1)
Bu fonksiyonların, isteklerde keyfi başlıklar ayarlamak için başka yöntemleri olabileceğini unutmayın, örneğin:
```php
$url = "";
$options = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n" . // check function.stream-context-create on php.net
"User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad
)
);
$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);
```
{{#include ../../../banners/hacktricks-training.md}}