渗透基础知识ctfshow——Web应用安全与防护(第一章)

这里给大家简单写点渗透最基础的一些方法以及技能,主要来自于ctfshow 靶场;

文章目录


Base64编码隐藏

适合纯新手入门使用,难度极低。

知识点

这道题的核心考察点是前端源代码审计 。通过浏览器开发者工具(F12)查看网页源码,可以发现在 <script> 标签中直接硬编码了登录校验逻辑,这演示了将敏感逻辑或密钥放置在客户端脚本中所带来的安全风险。

另一个关键知识点是 Base64 编码与解码 。代码中的 btoa() 函数用于将字符串转换为 Base64 格式,解题时只需将对比用的字符串 Q1RGe2Vhc3lfYmFzZTY0fQ== 进行逆向解码,即可直接获取明文密码;


打开网页,看到如下页面:

这里打开页面源码,即可得到答案:

如下:

HTTP头注入

知识点

这道题的知识点可以总结为以下两点:

  1. HTTP 请求头的构成与伪造 :HTTP 头部(如 User-AgentReferer)是客户端向服务器传递的元数据。本题考察如何利用 Burp Suite、Hackbar 或浏览器插件,手动修改这些客户端完全可控的字段,以模拟特定的浏览器环境或绕过简单的环境检测。

  2. 服务端对 Header 信息的盲目信任 :此类考点揭示了服务端逻辑的安全缺陷------如果后端代码直接依赖 User-Agent 等 Header 信息来判断权限或返回数据,攻击者就可以通过篡改 Header 诱导服务器执行特定逻辑。这种"基于 Header 的访问控制"极易被绕过,是 Web 安全中典型的信任风险。


输入账号密码后,我们得到如下响应结果:

同理,打开页面,我们发现源码存在Base64编码 ,解密后得到结果:CTF{easy_base64}

随后输入账号密码,进入系统:

得到一个告警:You must use "ctf-show-brower" browser to access this page

既然是UA头无效,那就按上述要求进行修改:

bash 复制代码
User-Agent: ctf-show-brower

得到结果:

Base64多层嵌套解码

知识点

这道题目的知识点可以总结为以下两点:

  1. 算法逆向推导

    本题涉及 btoa(Base64 编码)、reverse(字符串翻转)、slice/substr(切片)以及固定干扰字符(如 xH7jKaB3qW9)的组合调用。解题过程需基于最终加密值 correctPassword,按代码逻辑的相反顺序进行逆向操作,包括使用 atob 解码、再次翻转字符串以及精确剔除特定位置的填充字符。

  2. 前端硬编码与审计风险

    校验逻辑完全运行在客户端。由于 JavaScript 源码对用户公开,所有加密步骤、偏移量和盐值均可通过浏览器开发者工具获取。这种设计展示了前端校验的脆弱性,即无论算法如何叠加混淆,只要核心逻辑硬编码在本地脚本中,即可被静态分析或控制台调试破解。


这里我们查看源码,发现并不是之前的Base64编码了,而是存在js脚本:

js 复制代码
<script>
        document.getElementById('loginForm').addEventListener('submit', function(e) {
            const correctPassword = "SXpVRlF4TTFVelJtdFNSazB3VTJ4U1UwNXFSWGRVVlZrOWNWYzU=";
            
            function validatePassword(input) {
                let encoded = btoa(input);
                encoded = btoa(encoded + 'xH7jK').slice(3);
                encoded = btoa(encoded.split('').reverse().join(''));
                encoded = btoa('aB3' + encoded + 'qW9').substr(2);
                return btoa(encoded) === correctPassword;
            }

            const enteredPassword = document.getElementById('password').value;
            const messageElement = document.getElementById('message');
            
            if (!validatePassword(enteredPassword)) {
                e.preventDefault();
                messageElement.textContent = "Login failed! Incorrect password.";
                messageElement.className = "message error";
            }
        });
    </script>
</body>
</html>

但好消息是:我们知道了该页面前端加密的过程,所以可以根据该脚本内容逆向出来,得到正确密码:

而加密后的密码为:SXpVRlF4TTFVelJtdFNSazB3VTJ4U1UwNXFSWGRVVlZrOWNWYzU=

所以这里编写脚本,成功逆向得到结果:

bash 复制代码
{
    const correctPassword = "SXpVRlF4TTFVelJtdFNSazB3VTJ4U1UwNXFSWGRVVlZrOWNWYzU=";

    // 逆推 Step 5
    const step4 = atob(correctPassword);

    // 逆推 Step 4 (补全缺失的 'YU')
    const step3_padded = atob('YU' + step4);
    const step3 = step3_padded.slice(3, -3);

    // 逆推 Step 3
    const step2_reversed = atob(step3);
    const step2 = step2_reversed.split('').reverse().join('');

    // 逆推 Step 2 & 1 (爆破缺失的前 3 个 Base64 字符)
    const b64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    console.log("🏃 正在精准爆破...");

    // 给外层循环打个标签叫 outerLoop,方便后面直接跳出
    outerLoop: 
    for (let c1 of b64_chars) {
        for (let c2 of b64_chars) {
            for (let c3 of b64_chars) {
                try {
                    let testStr = c1 + c2 + c3 + step2;
                    let decoded = atob(testStr);
                    
                    if (decoded.endsWith('xH7jK')) {
                        let btoa_input = decoded.slice(0, -5); 
                        let flag = atob(btoa_input);
                        
                        // 过滤条件:确保解出来的 Flag 全部是正常的可见字符(ASCII 范围)
                        // 或者直接包含了 ctfshow 关键字
                        if (/^[\x20-\x7E]+$/.test(flag) && flag.length > 5) {
                            console.log("🎉 爆破成功!真正的 Flag 是: " + flag);
                            // 直接打断所有循环,结束战斗!
                            break outerLoop; 
                        }
                    }
                } catch (e) {
                    // 忽略无效 Base64
                }
            }
        }
    }
}

F12出现"控制台"------F5刷新一下------使用代码,回车------得到结果:

成功得到密码:#A7316

后面步骤与上一关一样,修改UA头即可:

HTTPS中间人攻击(wireshark导入ssl解密流量)

适合纯新手入门使用,难度极低。

知识点

  1. SSL/TLS 加密与密钥交换

    • HTTPS 在传输层通过 SSL/TLS 协议加密。其核心在于握手阶段 :客户端与服务器协商加密算法并生成会话密钥(Session Key)。由于后续数据传输使用对称加密,解密的逻辑关键在于获取该会话密钥。
  2. Wireshark 流量解密原理:Wireshark 无法直接破解加密报文,必须导入相关凭据:

    • 情况 A:如果你有密钥日志文件(最常见,如 sslkeylog.log
    • 情况 B:如果你有 RSA 私钥文件(.key.pem

这个解压后得到一个加密流量包以及ssllog文件(存储着SSL密钥):

未解密前:(都是加密流量)

解密步骤:Wireshark 配置Protocols -> TLS -> (Pre-)Master-Secret log filename

成功解密流量:

在POST包里找到flag:

Cookie伪造

适合纯新手入门使用,难度极低。

知识点

Cookie 伪造是攻击者通过非法篡改或预测客户端 Cookie 内容 ,从而绕过验证机制或实现权限提升 的行为。其原理在于服务端对凭证缺乏严格的完整性校验,或生成逻辑过于简单,导致攻击者能通过修改用户标识(如 guest 改为 admin)来冒充特定身份。

常见手段包括 Base64 解码重组、弱哈希碰撞或利用 XSS 漏洞窃取会话令牌。防御措施应包括服务端加密签名、设置 HttpOnly 属性以及完善 Session 管理机制,以确保凭证具备唯一性、不可预测性与安全性。


打开页面,发现默认为guest用户:

并且源代码也没有敏感信息;

这里尝试弱口令:

bash 复制代码
123456
admin
admin123
guest
...

简单尝试,发现密码为guest

抓包登陆后:

只能查看响应包源码

关键就在这一行:Set-Cookie: role=guest; expires=...

服务器非常直白地告诉了你它的鉴权逻辑:它通过一个名为 role 的 Cookie 来识别你的身份;既然现在是 guest(访客),我们要做的就是把它伪造成 admin(管理员)。

修改为如下Cookie:

bash 复制代码
Cookie: PHPSESSID=95c19a8b8364823f2329b9126f29002a;role=admin

修改后成功得到结果(可对照上图):

总结

知识点回顾:

  • JS 逆向:通过分析前端脚本的加密逻辑并编写逆向脚本,还原被隐藏的原始明文数据。

  • 流量解密:在 Wireshark 协议设置中导入密钥日志或私钥,将加密的 TLS 通信还原为可读明文。

  • Cookie 伪造:通过手动篡改浏览器请求中的身份标签(如角色、权限位),直接冒充高权限用户。

期待下次再见;

相关推荐
亚空间仓鼠2 小时前
OpenEuler系统常用服务(四)
linux·运维·服务器·网络
持续前行2 小时前
通过 npm 下载node_modules 某个依赖 ;例如 下载 @rollup/rollup-linux-arm64-gnu
前端·javascript·vue.js
郝学胜-神的一滴2 小时前
Socket实战:从单端聊天到多用户连接的实现秘籍
服务器·开发语言·python·网络协议·pycharm
昪彧翀忞2 小时前
dhcp小实验
linux·服务器·网络
Embrace9242 小时前
React Native + Realm 离线方案处理
javascript·react native·react.js·realm
信创DevOps先锋3 小时前
Gitee CodePecker SCA:开源安全治理的“标准答案“如何炼成
安全·gitee·开源
chenyingjian3 小时前
鸿蒙|能力特性-统一文件预览
前端·harmonyos
毛骗导演3 小时前
OpenClaw 沙箱执行系统深度解析:一条 exec 命令背后的安全长城
前端·架构
天才聪3 小时前
鸿蒙开发vs前端开发1-父子组件传值
前端