首页 > 其他分享 >某招标投标平台滑块逆向

某招标投标平台滑块逆向

时间:2023-09-13 15:57:02浏览次数:43  
标签:逆向 AES code 滑块 distance self 投标 data

某通信工程建设项目招标投标管理信息平台滑块逆向

地址链接aHR0cHM6Ly90eHpicXkubWlpdC5nb3YuY24vIy9nYXRld2F5L2xpc3Q=
目前为最简单的逆向滑块,适合初级入门这上手
  • 触发条件:如图所示点击下一页或者点击页数触发滑块

  • 请求200参数:滑块通过请求列表页参数如图所示

  • 如上图所看到的一样,code参数是滑块成功通过所返回的值,而token值是请求滑块图片的接口https://txzbqy.miit.gov.cn/zbtb/captcha/slideCaptcha所返回的nonceStr 值,而且所返回的值中滑块的缺口图片的值是加密过的,需要逆向解密,如图所示

逆向步骤

  • 全局搜索code并没有确定出具体的位置,所以code为动态参数,需要跟栈确定位置,还有技巧方法通过解密关键字搜索AES.encrypt确定位置,如图我们看到并无没魔改,没混淆AES的JS算法,我们直接断点看传参,如图所示

  • 再通过canvasSrc关键字看图片的js解密过程,如图所示

整个过程就是:

  • 1、首先请求了滑块图片的url接口返回了数据(滑块图片背景图 blockSrc、滑块图片加密值 canvasSrc、nonceStr的值)
  • 2、使用AES解密算u(i.canvasSrc, i.nonceStr)得到滑块图片
  • 3、使用`ocr获取滑块缺口的距离 distance
  • 4、再使AES用加密算法d(distance, nonceStr)得到code的值

代码实现

#!/usr/bin/env python
# coding=utf-8

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


class TxzbqyMiitSlider:

    def __init__(self):
        self.det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
        self.session = requests.session()
        self.headers = {
            "Accept": "application/json, text/plain, */*",
            "Accept-Language": "zh-CN,zh;q=0.9",
            "Connection": "keep-alive",
            "Content-Type": "application/json;charset=UTF-8",
            "Origin": "https://txzbqy.miit.gov.cn",
            "Referer": "https://txzbqy.miit.gov.cn/",
            "Sec-Fetch-Dest": "empty",
            "Sec-Fetch-Mode": "cors",
            "Sec-Fetch-Site": "same-origin",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
            "sec-ch-ua": "\"Chromium\";v=\"110\", \"Not A(Brand\";v=\"24\", \"Google Chrome\";v=\"110\"",
            "sec-ch-ua-mobile": "?0",
            "sec-ch-ua-platform": "\"Windows\""
        }
        self.cookies = {
            "jsessionid": "rBQxShroZP7e6hCSvAaYpEgHr4JRnH6gNcUA",
            "wzws_sessionid": "gjFiM2ZlM4AxMTcuNjEuMjEuMjEwgTJjZTFmZKBk/t7g"
        }

    @staticmethod
    def decrypt_aes(ciphertext, key):
        ciphertext = base64.b64decode(ciphertext)                           # 使用base64解码密文
        cipher = AES.new(key.encode(), AES.MODE_ECB)                        # 创建AES对象并指定使用ECB模式和PKCS7填充
        plaintext = cipher.decrypt(ciphertext)                              # 解密密文
        plaintext = unpad(plaintext, AES.block_size)                        # 去除填充数据
        return plaintext.decode('utf-8')

    @staticmethod
    def encrypt_aes(plaintext, key):
        cipher = AES.new(key.encode(), AES.MODE_ECB)                        # 创建AES对象并指定使用ECB模式和PKCS7填充
        padded_plaintext = pad(plaintext.encode(), AES.block_size)          # 对明文进行填充
        ciphertext = cipher.encrypt(padded_plaintext)                       # 加密明文
        encrypted_text = base64.b64encode(ciphertext).decode()              # 使用base64进行编码
        return encrypted_text

    def captcha_request(self):                                              # 请求图片验证数据接口
        url = "https://txzbqy.miit.gov.cn/zbtb/captcha/slideCaptcha"
        data = {
            "canvasWidth": 320, "canvasHeight": 155, "blockWidth": "65", "blockHeight": "55", "blockRadius": 10
        }
        data = json.dumps(data, separators=(',', ':'))
        response = self.session.post(url, headers=self.headers, cookies=self.cookies, data=data)
        res_data = json.loads(response.text)
        return res_data

    def img_info(self, response_data):
        block_img = response_data['data']['blockSrc']                       # 保存背景图片
        block_img = base64.b64decode(block_img.split(',')[-1])
        with open('./block.png', 'wb') as f:
            f.write(block_img)
        canvas_src = response_data['data']['canvasSrc']                     # 加密的滑块文本
        nonce_str = response_data['data']['nonceStr']
        canvas_img = self.decrypt_aes(canvas_src, nonce_str)                # 解密滑块文本
        canvas_img = base64.b64decode(canvas_img.split(',')[-1])            # 保存滑块图片
        with open('./canvas.png', 'wb') as f:
            f.write(canvas_img)

    def get_distance(self):                                                 # 使用ocr识别滑块距离
        with open('./block.png', 'rb') as f:
            target_bytes = f.read()
        with open('./canvas.png', 'rb') as f:
            background_bytes = f.read()
        res = self.det.slide_match(target_bytes, background_bytes, simple_target=True)  # target 的四个值就是缺口位置的左上角和右下角的左边位置
        distance = res['target'][0]
        return distance

    def get_code(self, distance, nonce_str):                                # 得到 code
        code = self.encrypt_aes(str(distance), nonce_str)
        return code

    def verify_function(self):
        res_data = self.captcha_request()
        nonce_str = res_data['data']['nonceStr']
        self.img_info(response_data=res_data)
        distance = self.get_distance()
        code = self.get_code(distance=distance, nonce_str=nonce_str)
        return {'token': nonce_str, 'code': code}


if __name__ == '__main__':
    TxzbqyMiitSlider().verify_function()

测试代码及结果

from txzbqy_miit_slider import TxzbqyMiitSlider
import requests
import json


headers = {
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "keep-alive",
    "Content-Type": "application/json;charset=UTF-8",
    "Origin": "https://txzbqy.miit.gov.cn",
    "Referer": "https://txzbqy.miit.gov.cn/",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
    "sec-ch-ua": "\"Chromium\";v=\"110\", \"Not A(Brand\";v=\"24\", \"Google Chrome\";v=\"110\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\""
}
cookies = {
    "jsessionid": "rBQl5RroZQEZ1zVgT0ecpkm3umIwl-AbpQcA",
    "wzws_sessionid": "gjFiM2ZlM4AxMTcuNjEuMjEuMjEwgTJjZTFmZKBk/t7g"
}
url = "https://txzbqy.miit.gov.cn/zbtb/gateway/gatewayExpert/getBidInformationList"

verify_data = TxzbqyMiitSlider().verify_function()
print("验证参数:", verify_data)

data = {
    "totalSize": 0,
    "page": 2,
    "limit": 15,
    "bidProjectName": "",
    "supervisorName": [],
    "occupationBeginDate": "",
    "occupationEndDate": "",
    "nationFlag": None,
    "bidType": None,
    "bidSubtype": None,
    "acceptanceBidder": "",
    "unitRestrict": [],
    "bidAcceptanceNotificaiton": [],
    "flag": 2,
    "isPublic": "0",
    "code": f"{verify_data['code']}",
    "token": f"{verify_data['token']}"
}
data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, cookies=cookies, data=data)

print(response.text)
  • 结果如图所示

标签:逆向,AES,code,滑块,distance,self,投标,data
From: https://www.cnblogs.com/wyh0923/p/17699889.html

相关文章

  • 安卓逆向 -- 常用的ADB命令
    ADB(AndroidDebugBridge)是安卓开发工具包中的一个命令行工具,它为我们提供了与安卓设备进行通信和调试的能力。在安卓逆向过程中,ADB命令是必不可少的工具之一。通过使用ADB命令,我们可以连接设备、安装应用程序、查看日志等。在这篇技术博客中,我们将介绍一些安卓逆向中常用的ADB命令......
  • 软件开发文档大全(项目管理、开发、实施、交付、评审、投标支撑)
    前言:在软件开发过程中,项目管理、开发、实施文档是至关重要的一部分。这些文档不仅为项目提供了清晰的规划和指导,还有助于确保项目按时、按质量完成。本文将详细介绍这些文档的内容及其在软件开发过程中的作用。软件开发全文档获取:Q+:262086839一、项目管理文档项目背景和目标......
  • 不再担心正向还是逆向查询,Vlookup函数的救星Index+Match组合!
    1职场实例我们在日常使用Excel时,遇到最多的场景便是“查找”问题,一提到“查找”,我们脑海里首先想到的肯定就是“Vlookup函数”了,但是“Vlookup函数”也有其自身的小短板,比如说遇到逆向查找的时候,使用Vlookup函数的基本语法公式时便会立马失效。那么有没有一种方法,不管正向还是逆向......
  • .Net8 AOT+VMP简单的逆向分析
    1.前言测试下VMP加密.NET的强度,选了最新的.Net8+AOT编译,用VMP给它加壳。最后逆向下,简单的分析,本篇看下。2.概述一.前奏首先一段简单的C#代码:namespaceTest_{internalclassProgram{staticvoidMain(string[]args){Console.WriteLine("hello,......
  • 李跳跳使用、逆向、脱壳和原理介绍
    前言你可以独善其身但你不能兼济天下简介其实这部分是使用教程,github上面有备份的下载链接,只是可能不更新了,V2.2安装之后一把快刀,很简洁的界面点击界面里面的开启按钮即可,我这里就是在无障碍里面设置了现在打开淘宝京东之后就只会看到一闪而过或者没有开屏广告的情况了反编......
  • 逆向通达信Level-2 续四 (调试level2数据接口)
       ......
  • 喜马拉雅 网页 滑块 简单
     functionpostveri(){leto=+newDate,W="xm_"+o.toString(36)+Math.random().toString(36).substr(2,6);return{'bpId':'139','sessionId':W,}}V=functionV(){......
  • JS逆向实战22——某政府采购网简单cookie反爬
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!目标网站网站:aHR0cDovL3d3dy55bmdwLmNvbS8=目标类似于这种进入前检查浏览器...如何跳转页面分析我......
  • require在vite不能用的问题(做手机短信弄滑块验证时候碰到)
    第一步:yarnadd-Dvite-plugin-require-transform或  npm ivite-plugin-require-transform --save-dev第二步:在vite.config.js中配置import{defineConfig}from'vite'importrequireTransformfrom'vite-plugin-require-transform';exportdefault......
  • 【web_逆向13】ob混淆及实战
    什么是ob混淆?OB混淆和变量名混淆是常用的代码混淆技术。OB混淆是指在代码中添加一些无用的代码和函数,以增加代码的复杂度和难以理解性,从而增加代码的保护性。变量名混淆是指将变量名替换为无意义的字符串,增加代码的难度和防止代码的逆向分析。ob混淆的特点它会把常规的......