ctfshow Web应用安全与防护系列

_Web应用安全与防护系列

ctfshow平台的_Web应用安全与防护系列个人做题记录

1.《Base64编码隐蔽》

打开靶机是一个登录页面,提示词是base64

Username已给,让我们输入密码

F12看看代码,'查看器'里没有什么,去看看'调试器里',有个(index),进去

密码在js中暴露

稍微写过一点代码的应该都能推出来


2.《HTTP头注入》

跟上一题一样,继续试试

大致意思就是UA头错误,应该是要用 "ctf-show-brower"来当UA头的内容

抓包这个页,抓到的数据包传到Repeater

这个就是UA头

现在把它的内容(:后面的内容)替换成 ctf-show-brower

点击发送


3.《Base64多层嵌套解码》

这个是上面的代码

js 复制代码
 function validatePassword(input) {
                let encoded = btoa(input); //第一次base64编码
                encoded = btoa(encoded + 'xH7jK').slice(3);//加东西再次base64编码,去掉前3字符
                encoded = btoa(encoded.split('').reverse().join(''));//先分成单个字符组成一个数组,然后反转数组元素顺序,将反转后的数组重新拼成字符串,再base64编码
                encoded = btoa('aB3' + encoded + 'qW9').substr(2);//前面和后面都加东西,然后base64编码,最后从第三个开始提取到最后(从0开始算,提取的字符串包含该位置的字符)
                return btoa(encoded) === correctPassword;//最后还有一次base64
            }
复制代码
知识点--->JS
	1.btoa():是内置函数,用于将字符串编码为Base64格式,只能处理ASCII字符范围内的字符串
	
	2.slice():用于提取一部分元素/字符并返回新的字符串,不改变原对象
// 对于字符串
string.slice(startIndex, endIndex)
// 对于数组
array.slice(startIndex, endIndex)
参数startIndex是提取的起始位置,包含该位置
参数endIndex是提取的结束位置,不包含该位置(可省略)

	3.split():对字符串进行分割处理,参数就是用的什么分隔符,encoded.split(''):将字符串 encoded 拆分成单个字符的数组。
例如:如果 encoded 是 "abc",则结果为 ["a", "b", "c"]
	
	4.reverse():将数组中的元素反转顺序
	
	5.join():拼接字符串,参数就是拼接处用的符号
	
	6.substr():在JS中,substr()用于从指定位置开始提取指定长度的子字符串,返回新的字符串,不会修改原字符串
从0开始
python 复制代码
import base64

# 已知的substr(2)结果
known_result = "IzUFQxM1UzRmtSRk0wU2xSU05qRXdUVVk9cVc5"

# Base64字符集
base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

# 前缀和后缀
prefix = "aB3"
suffix = "qW9"

# 尝试所有可能的前两个字符组合
for c1 in base64_chars:
    for c2 in base64_chars:
        # 构建完整的Base64编码字符串
        full_b64 = c1 + c2 + known_result
        
        try:
            # 解码Base64
            decoded = base64.b64decode(full_b64).decode('utf-8')
            
            # 检查是否符合格式
            if decoded.startswith(prefix) and decoded.endswith(suffix):
                # 提取encoded部分
                encoded = decoded[len(prefix):-len(suffix)]
                print(f"找到匹配的encoded: {encoded}")
                print(f"完整解码字符串: {decoded}")
                print(f"使用的前缀字符: {c1}{c2}")
                exit()  # 找到后退出
            
        except (UnicodeDecodeError, base64.binascii.Error):
            # 忽略解码错误的情况
            continue

print("未找到匹配的encoded字符串")

4.《HTTPS中间人攻击》

给了一个流量包和sslkey.log

复制代码
sslkey.log是一个与SSL/TLS密钥(Session Key)相关的日志文件,核心用途是记录SSL/TLS会话过程中生成的临时密钥(预主密钥、主密钥),以便后续解密HTTPS等加密流量

这道题用wires hark打开流量包,但是发现都加密了,无法直接看内容

这里就需要其密钥(sslkey.log)

复制代码
用wireshark打开流量包---->编辑---->首选项---->左侧选择Protocols---->找到TLS---->(Pre)-Master-Secret log filename选项,是让你选文件的那个(其实就是最底下的)---->选择sslkey.log文件

这样就会显示出原本内容了,会发现多出来了两个http协议的包

追踪http流


5.《Cookie伪造》

登录页面,账号给了一个guest。

根据题目提示与cookie有关,看看f5的存储。

只有一个名称是PHPSESSID的cookie并且看到其值。

试试密码也是guest

登录成功,但是没有直接显示其他的

再看看f5存储

登录成功会多一个名称为role的cookie

猜测根据这个来判断是否是管理员登录

现在role的值是guest (意思是测试,也就是这个账号是测试用的)

试试把值改成admin

再重新登录,flag出来了


6.《一句话木马变形》

打开有一个输入框和按钮

可以输入php代码,但是对输入有些限制

(错误:检测到无效字符!只允许使用字母、数字、下划线、括号和分号。)

试试system(phpinfo());

有回显,函数正常运行

再试试system(ls);

返回了两个文件,flag.php就是目标

因为有限制,

复制代码
getcwd()获取当前路径
scandir()扫描指定的路径
print_r(scandir(getcwd()));

array_reverse()数组元素逆序
show_source()查看文件内容
next()指向下一个

这现在是一个数组了,我们先把它的元素逆序

print_r(array_reverse(scandir(getcwd())));

如果现在直接用show_source()只能读取第一个文件,可以用next函数指向下一个。

show_source(next(array_reverse(scandir(getcwd()))));

flag出来了


相关推荐
新手小新1 小时前
通信工程师学习笔记5-通信系统
笔记·学习
鸽芷咕2 小时前
把 SQL 编辑器用顺:KSQL Developer 从补全到事务的实战笔记
笔记·sql·编辑器
LuminousCPP2 小时前
数据库学习笔记(二):MySQL 基础操作入门|在 CentOS Stream 10 上连接、建库与建表
数据库·经验分享·笔记·学习·mysql·centos
cao233314 小时前
关于 y0 y1 yn 变量名冲突说法的指正
笔记
~patience~1 天前
WAV 逆向分析工具使用笔记
笔记
滴啦嘟啦哒1 天前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身
xier_ran1 天前
【infra之路】AI 编译器学习笔记(十三):AI 编译器全景——TVM、XLA、IREE 与其他
人工智能·笔记·学习
连山齐名1 天前
ai应用开发的学习笔记
服务器·笔记·学习
乔旭伟1 天前
中小厂生产管理系统选型笔记:驱动方式、主线链路与成本结构
笔记·需求分析·规格说明书
xier_ran1 天前
【infra之路】AI 编译器学习笔记(十四):为什么要 tiling,以及矩阵计算单元的“固定“
人工智能·笔记·学习