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出来了


相关推荐
蓝之白2 小时前
Web12-变量1
web安全·ctf
七月七332 小时前
半小时搞定GitHub学生认证
笔记·github
蒙奇D索大2 小时前
【数据结构】排序算法精讲 | 交换排序全解:交换思想、效率对比与实战代码剖析
数据结构·笔记·考研·算法·排序算法·改行学it
客梦2 小时前
数据结构--队列
数据结构·笔记
colus_SEU2 小时前
【计算机网络笔记】第四章 网络层的数据平面
笔记·计算机网络
蒙奇D索大2 小时前
【数据结构】排序算法精讲 | 快速排序全解:分治思想、核心步骤与示例演示
数据结构·笔记·学习·考研·算法·排序算法·改行学it
iconball2 小时前
个人用云计算学习笔记 --29 华为云网络云服务
运维·笔记·学习·华为云·云计算
YJlio3 小时前
Contig 学习笔记(13.4):单文件碎片整理工具的原理与基本用法
笔记·学习·stable diffusion
大数据追光猿11 小时前
【大数据Doris】生产环境,Doris主键模型全表7000万数据更新写入为什么那么慢?
大数据·经验分享·笔记·性能优化·doris