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


相关推荐
laplace012334 分钟前
# 第六章 agent框架开发实践 - 学习笔记
人工智能·笔记·学习·语言模型·agent
坚持不懈的大白1 小时前
Leetcode学习笔记
笔记·学习·leetcode
中屹指纹浏览器2 小时前
双GAN网络驱动的动态指纹生成技术深度解析——原理、实现与抗检测优化
经验分享·笔记
JeffDingAI2 小时前
【Datawhale学习笔记】基于Gensim的词向量实战
人工智能·笔记·学习
FakeOccupational4 小时前
【电路笔记 PCB】Altium Designer : AD使用教程+Altium Designer常见AD操作命令与流程
开发语言·笔记
Hello_Embed5 小时前
RS485 双串口通信 + LCD 实时显示(DMA+IDLE 空闲中断版)
笔记·单片机·学习·操作系统·嵌入式·freertos
小乔的编程内容分享站5 小时前
C语言指针相关笔记
c语言·笔记
逐步前行5 小时前
SolidWorks2024_装配体实例(桌下抽屉)
笔记
轻造科技5 小时前
设备点检系统+移动端APP:替代纸质点检表,漏检率降为0
网络·安全·web安全
_ziva_5 小时前
Miniconda 下载 + 安装 + VS Code 集成使用教程
笔记