首页 > 其他分享 >【web_逆向09】AES加密逆向实战

【web_逆向09】AES加密逆向实战

时间:2023-08-19 18:14:24浏览次数:60  
标签:逆向 AES return web replace mode import data

目标网站

寻找加密入口

  • 查看接口数据,发现入参、出参都是经过加密的,需要加密、解密
  • 查看Initiator中,发现promise。异步
  • 通过interceptors搜索,往回找不一定能找到,可以考虑正向搜索
  • 注意事项,固定逻辑
/**

 # 异步框架....固定的逻辑.
 # 执行过程
 #    next表示下一步执行哪里...
 #    return 语句表示给下一步传递的消息.  上一步return的东西是下一步. 接受到的东西
 #    sent 是接受上一步return回来的东西.
 #    abrupt 第一个参数如果是return. 表示该异步逻辑. 彻底结束. 第二个参数是真正的返回值.
 #    stop 终止该异步逻辑....
 # 该异步框架是对promise和async await 的封装.
 #
return tianwanglaozi.....wrap((function(e) {  # 事件循环...event loop
    for (; ; ) // 死循环
        switch (e.prev = e.next) { // switch
        case 0: // 第一次执行....
            e.next = 2 ; //  下一步是2
            // 百分之百是promise
            return me.search.getSearchSalaryList(pe(pe({}, y), {}, {
                pageNum: f.current,
                limit: 15
            }));
        case 2:
            t = e.sent,
            a = t.resdata,
            1 == t.rescode && a && (n = a.salarys,
            r = a.pageCount,
            c = a.totalCountStr,
            l = a.company,
            s = a.recCompany,
            x((function(e) {
                return (0,
                F.JO)(f.current, e, n)
            }
            )),
            z(+r || 0),
            K(c || ""),
            Z(l || null),
            D(s || []),
            J(!1));
        case 3:
            e.abrupt("return", xxx)  #  结束了...真的结束了.
        case 6:
        case "end":
            return e.stop()  # 彻底停止...
        }
}
), e)



a: 随机  -> 作为AES加密的IV
 mode: cbc模式
n: 参数(json字符串)

 */
  • 入口步骤

数组类型的key处理方式

如果见到的东西. 是这个样子的.
{
    "words": [
        1193550929,
        1635214187,
        1197891916,
        1111046002
    ],
    "sigBytes": 16
}
  • 1、先转换成字符串子

    • key.toString() => 16进制的数字....hex... => 字节....
  • 2、直接使用console转换成功字节

  • 3、使用python处理

import binascii
s = "472424516177636b4766614c42393772"

bs = binascii.a2b_hex(s)
print(bs)   #'G$$QawckGfaLB97r'

python代码完成加解密

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

def encrypt(data):
    aes = AES.new(key=b'G$$QawckGfaLB97r',mode=AES.MODE_CBC,iv=b'GKLqVnx1kHNt286G')
    data_json = json.dumps(data,separators=(',', ':'))
    data_bs = pad(data_json.encode('utf-8'),16)

    miwen = aes.encrypt(data_bs)
    b = base64.b64encode(miwen).decode()
    b.replace("/", "_").replace("+", "-").replace("=", "~")
    return b

def decrypt(s):
    aes = AES.new(key=b'G$$QawckGfaLB97r',mode=AES.MODE_CBC,iv=b'GKLqVnx1kHNt286G')
    bs_s = base64.b64decode(s)
    ming_bs = unpad(aes.decrypt(bs_s),16)
    data_dic = json.loads(ming_bs.decode())
    return data_dic

if __name__ == '__main__':
    data = {
        "cityCode": 7,
        "industryCode": "",
        "curPage": 1
    }

    session = requests.Session()
    session.headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    url = 'https://www.xxx.com/api_to/channel/salary/list.json'
    param = {
        "b" :encrypt(data),
        "kiv":'GKLqVnx1kHNt286G'
    }
    res = session.get(url=url,params=param).text
    # print(res)

    # 解密数据
    shuju = decrypt(res)
    print(shuju)

使用JS加解密,python调用

  • js代码,xxx.js
var CryptoJS = require("crypto-js");


var n = function() {
        var e, t, n, r, i = null;
        return i || (t = new RegExp("\\u200c","g"),
        n = new RegExp("\\u200d","g"),
        r = new RegExp(".{8}","g"),
        e = "‍‌‍‍‍‌‌‌‍‍‌‍‍‌‍‍‍‍‌‍‍‌‍‍‍‌‍‌‍‍‍‌‍‌‌‍‍‍‍‌‍‌‌‌‍‌‌‌‍‌‌‍‍‍‌‌‍‌‌‍‌‍‌‌‍‌‍‍‍‌‌‌‍‌‌‍‍‌‌‍‍‌‌‍‍‍‍‌‍‌‍‍‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌‌‌‍‍‌‍‍‌‌‍‌‌‌‍‌‌‌‍‍‌‍".replace(r, (function(e) {
            return String.fromCharCode(parseInt(e.replace(t, 1).replace(n, 0), 2))
        }
        )),
        i = {
        key: CryptoJS.enc.Utf8.parse(e),
        mode: CryptoJS.mode.CBC,
        pad: CryptoJS.pad.Pkcs7
    }),
    i
}();

var iv = "GKLqVnx1kHNt286G";

function encrypt(data){
    let s = JSON.stringify(data);
    let r = CryptoJS.AES.encrypt(s, n.key, {
        iv: CryptoJS.enc.Utf8.parse(iv),
        mode: n.mode,
        padding: n.pad
    });
    return r.toString().replace(/\//g, "_").replace(/\+/g, "-").replace(/=/g, "~")
}

function decrypt(s){
    let r = CryptoJS.AES.decrypt(s, n.key, {
        iv: CryptoJS.enc.Utf8.parse(iv),
        mode: n.mode,
        padding: n.pad
    });
    return JSON.parse(r.toString(CryptoJS.enc.Utf8));
}
  • python代码
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')

import execjs
import requests

session = requests.session()
session.headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

f = open("xxx.js", mode='r', encoding="utf-8")
js = execjs.compile(f.read())
f.close()

url = "https://www.xxx.com/api_to/search/salary.json"

data = {
        "cityCode": 7,
        "industryCode": "",
        "curPage": 1
    }
params = {
    "b": js.call("encrypt", data),
    "kiv": 'GKLqVnx1kHNt286G'
}

resp = session.get(url, params=params)
print(resp.text)

# 数据解密....
print(js.call("decrypt", resp.text))

标签:逆向,AES,return,web,replace,mode,import,data
From: https://www.cnblogs.com/xwltest/p/17642820.html

相关文章

  • 利用text-generation-webui快速搭建chatGLM2-6b/LLAMA2-7B-chat大模型运行环境
    text-generation-webui 是一个基于Gradio的LLMWebUI开源项目,可以利用其快速搭建各种文本生成的大模型环境。一、安装text-generation-webui的readme其实已写得相当详细了,这里就不再重复,只说1个可能存在的坑:安装peft安装卡住requirements.txt中有一些依赖项,需要访问gith......
  • WebGL的剪裁空间
    推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景什么是WebGL的剪裁空间WebGL的剪裁空间(ClippingSpace)是在图形渲染过程中处理视图体积裁剪的一种特定空间。它是指定义在3D世界坐标系和屏幕窗口之间的虚拟空间,用于确定哪些图元将被渲染到屏幕上。WebGL使用了透视投......
  • WebGL和OpenGL之间的差异
    推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景WebGL和OpenGL是与图形处理有关的技术标准,它们在计算机图形中扮演着重要的角色。本文将介绍WebGL和OpenGL的区别,并重点介绍"WebGL"和"OpenGL"的特点。一、WebGL简介WebGL(WebGraphicsLibrary)是一种用于在Web浏览器中......
  • 2D应用开发是选择WebGL 还是选择Canvas?
    推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景在介绍WebGL和Canvas的区别和联系之前,需要先了解它们各自的定义和特点。WebGL是一种基于标准HTML5的技术,用于在Web浏览器中实时渲染3D图形。它是由KhronosGroup开发的一套API(ApplicationProgrammingInterface),允许开......
  • iwebsec-文件上传 06 文件截断上传
    01、题目分析02、文件上传如果直接在页面输入框直接输入%00截断符,会生成a.php%00_1319128057.jpg这样的文件,很明显不符合我们的预期然后采用burp抓个包,把包中的post表项中的%00进行url-decode编码,然后再在文件名上进行%00截断,即可实现文件截断上传03、源码分析<?phpif......
  • iwebsec-文件上传 04 文件头过滤绕过
    01、题目分析文件上传的文件头过滤,题目中已经告诉我们了,我们已经知道了过滤类型,但是出于学习和判断的目的,那么我们还是得判断一下文件上传的过滤类型02、文件上传既然文件头过滤,直接在木马文件中加上文件头GIF98a,然后直接上传即可,如果有文件类型过滤,那么就像上一关一样更改下文......
  • iwebsec-文件上传 05 .htaccess
    01、题目分析正常来讲应该先判断文件上传过滤是前端验证还是后端验证,但是这个地方因为是靶场,所以直接告诉你了是什么类型,因此就不用进行判断了,这里是.htaccess文件绕过,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们......
  • python+playwright 学习-72 设置window.navigator.webdriver属性为false 跳过网站反爬
    前言有些网站有反爬机制,比如用代码启动的浏览器会被检测到,需要人机验证,用脚本去点击或者滑动滑动虽然能滑动,但是会认证失败。用playwright和selenium启动的浏览器都会用个webdriver属性。浏览器会根据这个属性判断是否是人工正常操作。window.navigator.webdriver属性人......
  • JSON Web Tokens(JWT)
    JSONWebTokens(JWT)是一种用于身份验证和授权的开放标准。它可以在客户端和服务器之间安全地传输信息,并且非常适合以下场景:身份验证:JWT可以用于验证用户的身份。当用户登录后,服务器可以生成一个JWT并将其返回给客户端。客户端可以在后续的请求中将JWT作为身份验证凭证发送给服务器......
  • iwebsec-文件上传 03 Content-Type过滤绕过
    01、题目分析文件上传的文件类型过滤,题目中已经告诉我们了,我们已经知道了过滤类型,但是出于学习和判断的目的,那么我们还是得判断一下文件上传的过滤类型02、文件上传先用哥斯拉创建一个一句话木马命名为1.php然后尝试上传木马依旧是被拦截,但是这次burp抓到了数据包,说明是后......