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