首页
前端开发

分类

当前位置: 云海天教程网 > 技术新闻 > 前端开发 >正文

成理信安协会第一届信安大挑战WEB题千反田很好奇WP

更新时间:2020-11-20  作者:佚名   来源:网络转载


	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]

就是试了个小坏嘛,不要打我

Step1

打开题目,映入眼帘的是这个:

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
肯定知道题目是被藏起来了,所以正常情况下就开始翻cookie啦,用burp抓啦,之类的。但是我在index.php里设置了302跳转,跳转去了start.php,你怎么刷新start.php发现不了index.php的。我在源码里提示

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
其实就是提醒大家开着控制台查看网络或者开着burp等着抓包。很容易发现

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
这个被跳转的index。

Step2

那么如何访问被跳转的网页呢?burp修改就可以。

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
然后转到Render,查看加载出的页面。

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
明显是一道反序列化问题,其中考察了wakeup魔术方法绕过漏洞与一道代码审计题。
代码审计的逻辑基本是,不能输入数字,但是要和3722304989相等。这个数字肯定有特殊性,打开程序员模式计算器,输入这个数字,发现

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]

十六进制下竟然是DDDDDDDD,没有一个数字。所以就是十六进制绕过。
给出反序列化脚本:

<?php
class CDUTSEC
{
    public $chitanda;
    public $eru;
}

$tr = new CDUTSEC();
$tr->chitanda="yesIamOKtoOVERCOMEallofthesepuzzles";
$tr->eru=0xDDDDDDDD;
echo urlencode(serialize($tr));

绕过wakeup的方法很简单,把序列化字符串对应成员个数的数字改大即可

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
改大。

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
拿到“真正”的主页

Step3

我承认我有点恶趣味了(滑稽

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
有点搞心态,实际上这里真的没有太恶心,burp抓下包

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
在响应头看到这一项(专门写的跟真的一样
简单base64,得到puzzle is in puzzle! 提示去访问puzzle.php

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
这里有个非预期,我本地不分大小写都可以访问,但部署之后必须为Puzzle.php首字母大写才行(悲 由于种种原因,没有再通知这个问题

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]

第一个考点,看似简单,实际上下划线被我ban掉了。下划线怎么替代?很简单,在php中用.或者+都可。
之后我们得到源码。

<?php
    $query = urldecode($_SERVER["QUERY_STRING"]);
    $puzzle_start = $_GET[‘puzzle_start‘];
    $a = $_GET[‘a‘];
    $b = $_GET[‘b‘];
    $c = $_GET[‘c‘];
    $d = $_GET[‘d‘];
    $file_name = $_GET[‘file_name‘];
    $content = file_get_contents("php://input");
    $filename = "upload/" . $file_name;

    if (strpos($query, ‘_‘) !== False)
        die("嘿嘿,‘_‘是不被允许的哟~");
    if ($puzzle_start == 1) {
        show_source(__FILE__);
    }
    if ($a != $b && md5($a) == md5($b)) {
        echo "通过第一个难题!不错!";
        if ($c !== $d && sha1($c) === sha1($d)) {
            echo "通过第二个难题!继续!";
            if (preg_match(‘/cat|system|passthru|exec|shell_exec|POST|<?ph.|.?>|flags/is‘, $content))
                die("看我最后挡不挡的住你吧!");
            if (file_put_contents($filename, $content))
                die("上传成功!");
        } else die("别气馁!");
    } else die(" 再试试!");
    ?>

其实就是两个简单的绕过加上一个看着难实际上有很大空子的一句话写入。
第一个比较:两变量弱类型比较不等,md5编码后弱类型比较相等,利用php弱类型比较中0exxx在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0(0e后面的必须是数字)从而通过验证。(具体看协会这篇文章https://cdutsec.gitee.io/blog/2020/04/06/php-weakphp/
第二个比较:两变量强类型比较不等,md5编码后强类型比较相等。这里就不能用弱类型的骚操作绕了,这里传入数组导致函数报错来绕过。
最后一个看似丧心病狂的正则,其实就是想让你不要写入直接读取flag的php语句了。就算用"",${IFS}等绕过空格等命令检测,写入php中可发挥不了作用。这里涉及四个点:?>标签其实不需要也可以;<?php的替换;GET形式的一句话马;GET形式的一句话马不能用菜刀蚁剑连接。
另外,当需要post变量的时候,可能会发现网页说的哪里不对劲是我ban掉了右键和f12工作台。其实也没啥,就是用burp。
最终payload:

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]

好了,万事俱备,最后get传参:

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]
结束。
其实就是简单web知识点的缝合怪罢了。

	成理信安协会第一届信安大挑战WEB题千反田很好奇WP
[web前端开发]

成理信安协会第一届信安大挑战WEB题千反田很好奇WP

原文地址:https://www.cnblogs.com/Riv3r1and/p/13974992.html

上一篇: 0x01 基本算法-位运算 a^b [编程语言教程] 下一篇: Java的内存区域划分 [编程语言教程]
小编推荐
快速导航更多>>
JavaScript 教程 HTML5 教程 CSS3 教程 jQuery 教程 Vue.js 教程 Node.js 教程 SQL 教程 C 教程 PHP 教程 Linux 教程 Docker 教程 Nginx 教程 Python 教程 Java 教程

云海天教程网 版权所有

陕ICP备14013131号-3