[限时投稿]攻防世界web进阶区writeup1-6

yxy_   ·   发表于 2022-02-24 13:16:45   ·   CTF&WP专版

攻防世界XCTF writeup(001-006)

baby_web

image-20220221182944221

image-20220221183016416

一进入没什么功能点,根据提示,初始页面,那就访问下index.php,发现自动跳转到1.php,抓个包试试,发现这是个302跳转,在返回包中找到了flag

image-20220221183623888

Training-WWW-Robots

image-20220221183844842

发现这道题应该是和robots.txt协议相关,而且题目中还提示说有时这些文件会显示目录结构,我们尝试访问下robots.txt

image-20220221184307324

发现存在一个fl0g.php,尝试访问,发现flag

image-20220221184437458

PHP2

image-20220221185407158

没什么信息,进行目录扫描没什么结果,也没有发现什么传参,触及到知识盲区了,看了看别人的writeup,发现是有一个index.phps的文件,之前没有接触过.phps,感觉和php文件有着某种联系,查了下资料:

phps文件就是php的源代码文件(php source),通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。 它的MIME类型为:text/html, application/x-httpd-php-source, application/x-httpd-php3-source。
image-20220221201636879

看这段代码,想要输出flag,需要满足两个条件:

  • get传参传入的id不能和”admin”的类型以及值同时相当,即id值不是字符串或者不是admin
  • get传参传入的id在进行url解码后值为admin

那么我们可以对admin进行二次url编码(id=%2561dmin / id=%2561%2564%256d%2569%256e),由于get传参本身就会进行一次url解码(id=%61dmin / id=%61%64%6d%69%6e),那么第一个条件满足,接着代码本身会再次进行一次解码(id=admin),第二个条件满足

image-20220221203730793

Web_php_unserialize

很明显,这是一道php反序列化的题

image-20220221203907909

分析代码,在初始化对象时需传入$file的值,当对象正常销毁时会调用__wakeup(),将$file的值指向index.php。我们需要做的是将$file的值设为fl4g.php并进行序列化

要绕过两个点:

  • 将序列化的数据个数从1改为2,大于真实的数据个数,可绕过__wakeup()
  • 将O:4换成O:+4,可绕过preg_match(‘/[oc]:\d+:/i’, $var)的匹配

构造我们所需的传参值

file = $file; 
    }
    function __destruct() { 
        echo <span class="label label-primary">@highlight_file($this-</span>&gt;file, true); 
    }
    function __wakeup() { 
        if ($this-&gt;file != 'index.php') { 
            //the secret is in the fl4g.php
            $this-&gt;file = 'index.php'; 
        } 
    } 
}
$a = new Demo('fl4g.php');
$q = serialize($a);
echo $q.'<br>';
 $q = str_replace('O:4','O:+4',$q);
 $q = str_replace(':1:',':2:',$q);
echo $q.'<br>';
$q = base64_encode($q);
echo $q;
?&gt;

image-20220221205948517

得到了我们所需的值,进行传参,得到flag

image-20220221210132046

在这里要注意一点,由于flie变量是私有变量(protected也类似),所以序列化之后的字符串开头结 尾各有一个空白字符(O:4:”Demo”:1:{s:10:”%00Demo%00file”;s:8:”fl4g.php”;})这也是为什么长度是10而不是8

image-20220221210407950

php_rce

这道题明显是一道关于thinkphp框架rce漏洞的题,容易得知是v5版本

image-20220222134625794

我们信息收集一波,看看这个版本有什么可以利用的漏洞,上github看看

image-20220222134817102

https://github.com/SkyBlueEternal/thinkphp-RCE-POC-Collection.git

我们随便选一个试试

image-20220222135051564

image-20220222135204848

发现存在命令执行漏洞

利用漏洞看看目录中的内容

image-20220222135532480

image-20220222135608130

发现了一个flag文件,查看一下

image-20220222135706364

发现了flag

关于漏洞原理,这里引用一位师傅的文章

https://blog.csdn.net/mochu7777777/article/details/104842420

Web_php_include

这道题从题目看应该是一道文件包含的题

image-20220222141526435

相关知识点:

  • strstr(string,search,before_search)

    • 搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE
    • 该函数是区分大小写的。(srtistr不区分大小写)
    • before_search=>默认值为 “false” 若设置为 “true”,将返回 search 参数第一次出现之前的字符串部分。
  • str_replace(find,replace,string,count)

    • 替换字符串中的一些字符(区分大小写)
  • php://input

    • 访问请求的原始数据的只读流 ,即直接读取到POST没有经过解析的原始数据,当传入的参数作为文件名打开时,PHP执行时会将POST内容当成文件内容执行

    • 在enctype=”multipart/form-data” 的时候php://input 是无效的。

    • 需要设置allow_url_include = On
  • data://text/plain / data://text/plain;base64

    • 与php://input类似,只不过是将”data://text/plain,”后面的值作为数据流输入,不需要利用$_POST传参

方法一:利用data://text/plain绕过php://检测

image-20220222160651803

image-20220222160959911

image-20220222161950105

image-20220222162005003

方法二:用Php://input 大小写绕过php://检测

image-20220222164948614

image-20220222165027747

用户名金币积分时间理由
春天11 0.01 0 2022-03-01 16:04:12 <script>alert(1)</script>
春天11 0.02 0 2022-03-01 16:04:34 一个受益终生的帖子~~
春天11 0.01 0 2022-03-01 16:04:15 一个受益终生的帖子~~
春天11 0.01 0 2022-03-01 16:04:29 一个受益终生的帖子~~
Track-劲夫 25.00 0 2022-02-26 11:11:59 活动奖励
Track-劲夫 50.00 0 2022-02-26 11:11:49 一个受益终生的帖子~~

打赏我,让我更有动力~

0 条回复   |  直到 2022-2-24 | 633 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.