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


相关推荐
Amazing_Cacao5 小时前
CFCA精品可可工艺师初级校准:暴力破解机器黑盒,实现物理参数与最终风味的精准对齐
笔记·学习
阿米亚波5 小时前
【EVE-NG 实战】防火墙基础(VLAN · VRRP · NAT · ACL · 静态路由)
运维·网络·笔记·网络协议·计算机网络·网络安全·运维开发
ctrl_v助手7 小时前
HALCON 学习笔记1
笔记·数码相机·学习·算法·计算机视觉
丰锋ff7 小时前
Qt6.10.3安装教程
笔记
txg6667 小时前
网络安全领域简报(2026年7月3日—10日)
安全·web安全·网络安全
GLDbalala7 小时前
GPU PRO 5 - 4.5 Tiled Deferred Blending 笔记
笔记
a1117768 小时前
SLAM 学习笔记(三)视觉里程计2(VO) 特征点法
人工智能·笔记·学习
Yang_jie_038 小时前
笔记:数据结构(循环队列相关判断条件)
数据结构·笔记
三品吉他手会点灯8 小时前
嵌入式机器学习 - 学习笔记1.1.2 - 机器学习的局限性与伦理
人工智能·笔记·嵌入式硬件·学习·机器学习
Chengbei119 小时前
SoloXSS:一款现代化的自托管 XSS平台
人工智能·安全·web安全·网络安全·自动化·xss·安全架构