某建设监督公共服务平台逆向分析

2023-12-18 20:36:02

目标网址

aHR0cHM6Ly95bmp6amdjeC5jb20vZGF0YVB1Yi9lbnRlcnByaXNl

分析目标网站

首次打开网址,会弹出滑块验证
在这里插入图片描述验证通过之后才显示数据
在这里插入图片描述点击查看下一页也会弹出滑块验证
在这里插入图片描述验证通过之后才会显示数据
打开浏览器开发者工具,查看浏览器抓的包
在这里插入图片描述
可以发现getVcode是去请求滑块验证的,它返回滑块图片的数据
在这里插入图片描述
findBaseEntDpPage返回的是滑块验证通过之后的网页所展示的数据
在这里插入图片描述通过对这个两个包进行分析,都可以发现它们的 共同点都是携带params这个参数
在这里插入图片描述
在这里插入图片描述这里就可以知道params就是我们要解密的加密参数
现在我们就要去寻找params的出处
先通过搜寻查看一下
在这里插入图片描述可以发现都是在同一个js文件中
进去查看
再次查询params最终确定出处如下
在这里插入图片描述为什么会确定出处是这行代码是因为 baseURL: “/prod-api”,在发送请求的URL中包含这个,可以打上断点去验证
在这里插入图片描述
在这里插入图片描述在这里插入图片描述这里我们不难看出这就是请求滑块验证码图片的所携带params的出处
现在我们就要去查看一下是怎么加密的
通过阅读代码

if (!n && (e.method === "post" || e.method === "put")) {
        if (console.log("no encrypt ", e.data),
        !H_e(e.data)) {
            const s = D_e().encrypt(typeof e.data == "object" ? JSON.stringify(e.data) : e.data)
              , a = {
                params: V_e(s)
            };
            e.data = a
        }

可以看出params的值由V_e(s)这个函数来生成的
s是由D_e().encrypt(typeof e.data == “object” ? JSON.stringify(e.data) : e.data)来生成的
通过阅读const s这行代码
可以知道s的生成与e.data有关
通过控制台打印e.data
在这里插入图片描述在这里插入图片描述发现e.data由两种结构

// 用于获取滑块验证码图片
{
    "key": "query", //用于发送请求滑块验证码图片
}

// 用于获取数据的
{
    "pageNum": 1, // 页码
    "pageSize": 10,
    "certificateType": "",
    "name": "",
    "slideId": "1186355937598767104", // 请求滑块验证码图片会返回数据中有
    "key": "query",
    "width": 227  // 滑块验证码的的距离(只有这个数值是正确的才会返回数据)
}

现在基本的思路研究清晰明了
首先先去构造如下结构的用于获取滑块验证码的结构体通过V_e()函数生成params参数向获取滑块验证码的URL发送请求获取滑块验证码的图片数据及slideId,在通过构造用于获取数据的结构体,通过V_e()函数生成params参数向获取数据的URL发送请求获取数据

扒代码

先把整个js代码复制下来
在这里插入图片描述

扒D_e()代码

新建一个新的js文件先把调用部分写出
在这里插入图片描述把有关D_e()函数的代码找出来并复制到这个文件
在这里插入图片描述在这里插入图片描述可以发现有很多e(数字)的部分,这些都可以去浏览器去打印出来
在这里插入图片描述替换
在这里插入图片描述
运行
在这里插入图片描述
根据报错信息去完整的js代码中找出来
在这里插入图片描述可以看出B_e就是k_e,复制下来
在这里插入图片描述运行,报错如下
在这里插入图片描述去原js代码找出来复制
在这里插入图片描述可以看出Sr就是C_e
在这里插入图片描述运行报错
在这里插入图片描述这是一个三元表达式可以通过直接修改代码
在这里插入图片描述运行,报错信息如下
在这里插入图片描述一样的查找复制
在这里插入图片描述
D6等于jc,查找jc
在这里插入图片描述发现与jc有关的有Zbe、Qbe、nxe
查找复制
在这里插入图片描述大致阅读发现这几个函数互相都有关系,那么我们直接复制从var jc = {};到function nxe(e)
在这里插入图片描述运行,没有报错
在这里插入图片描述

扒V_e()代码

一样的操作
先写调用代码
在这里插入图片描述
查找V_e()复制
在这里插入图片描述
发现有很多类似t(数字)的部分,控制台打印并替换
在这里插入图片描述
接下来的操作如扒D_e()代码步骤一样,就不再赘述了
成功如下图
在这里插入图片描述

滑块验证码的解决就办法(用dddocr解决)

这个办法不是特别完美,因为有时会识别不到位

import ddddocr

det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)

with open('xiao.jpg', 'rb') as f:
    target_bytes = f.read()

with open('da.jpg', 'rb') as f:
    background_bytes = f.read()

res = det.slide_match(target_bytes, background_bytes, simple_target=True)
print(res)

在这里插入图片描述只要取出数组的第一个数值即可。

测试是否能获取数据

成功截图

在这里插入图片描述

失败截图

出现如下图的原因就是dddocr识别不到位的原因
在这里插入图片描述

文章来源:https://blog.csdn.net/wstc2689784536/article/details/135065886
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。