逆向案例二十七——某社会信用平台滑块分析,简单滑块

网址:aHR0cHM6Ly94eGdzLmNoaW5hbnBvLm1jYS5nb3YuY24vZ3N4dC9uZXdsaXN0

访问这个网站,用谷歌浏览器似乎访问不了,只能用IE浏览器了。

进行搜索时,会弹出滑块验证码

一般来说,两个包最重要,一个是返回图片的包,一个是进行滑动验证的包。获取图片包,得到滑动距离x是我们的目标。

抓包分析,第一个包返回了一些a,b值(以后会有作用)以及滑块背景图和滑块的图片base64格式

 

再看看这个包的请求头和载荷,发现没有什么加密,因此写代码获取滑块图和a,b的值 

获取到滑块图后,用ddddocr库去得到x的值,用下面的代码可以获得x的移动距离。

万事俱备,我们现在去看查验包有哪些参数,滑动滑块,但不要成功

 

我们发现验证滑块有没有成功的包有a,b,c三个加密参数,注意a,b是不同于第一个包返回的a,b的值的。我们现在跟栈分析。找到参数加密的位置。

直接进slideup(这个包的名字就吸引我进去),一看就找到了,打上断点,看看是怎么个事。

 

可以看出,验证包里的a,b是对第一个包里的a,b进行encodedata加密得来的。c是由滑块移动距离进行$getRsaCode加密,再进行encodedata加密得来的。

 

现在就是去找encodedata这个函数,往上一翻就找到了

这里面一看就是u也没有定义,接着往上找,复制下来

 

现在去找 $getRsaCode,发现是个RSA的加密,直接调用库

 

解决细枝末节后的js代码为,运行了一下,没有错误:

 

再写一个调用函数

 

结果为:

 

现在我们已经获得了验证包中的载荷加密参数,可以直接访问这个包,通过滑块验证。

写一个函数访问这个包,带上加密载荷。

我们看一下结果 ,验证通过。

通过验证码之后,我们需要得到数据,找到数据包,发现数据包有三个参数,刚好是a,b,c就是滑动好的a,b,c

 

定义一个得到数据的函数

 

最终结果:

 

通过更改载荷中的关键词和页码,可以访问不同的数据。 

再次改进代码

 

完整python代码:

import requests
import base64
import ddddocr
import execjs
import pprint
def get_image():
    cookies = {
        'https_waf_cookie': '18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b',
        'SF_cookie_129': '12016923',
    }
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Connection': 'keep-alive',
        # 'Cookie': 'https_waf_cookie=18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b; SF_cookie_129=12016923',
        'Referer': 'https://xxgs.chinanpo.mca.gov.cn/gsxt/newlist',
        '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/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
    }
    response = requests.get('https://xxgs.chinanpo.mca.gov.cn/gsxt/PlatformSHZZFRKGSXT/slideCaptcha',cookies=cookies,headers=headers,).json()
    a = response['result']['a']
    b = response['result']['b']
    cutImage = response['result']['c']['cutImage']
    oriImage = response['result']['c']['oriImage']
    with open('cut.png', 'wb') as f1:
        f1.write(base64.b64decode(cutImage))
    with open('ori.png', 'wb') as f2:
        f2.write(base64.b64decode(oriImage))
    return a,b
def get_xcode():
    det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
    with open('cut.png', 'rb') as f:
        target_bytes = f.read()
    with open('ori.png', 'rb') as f:
        background_bytes = f.read()
    res = det.slide_match(target_bytes, background_bytes,simple_target=True)['target'][0]
    print(res)
    return res

def get_params(a,b,xcode):
    js_code = execjs.compile(open('全国社会信用平台滑块逆向.js','r',encoding='utf-8').read())
    result = js_code.call('get_params',a,b,xcode)
    print(result)
    return result

def get_check(code):
    cookies = {
        'https_waf_cookie': '18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b',
        'SF_cookie_129': '12016923',
    }
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Connection': 'keep-alive',
        # 'Cookie': 'https_waf_cookie=18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b; SF_cookie_129=12016923',
        'Referer': 'https://xxgs.chinanpo.mca.gov.cn/gsxt/newlist',
        '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/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
    }
    params = {
        'a': code['a'],
        'b': code['b'],
        'c': code['c'],
    }
    response = requests.get('https://xxgs.chinanpo.mca.gov.cn/gsxt/PlatformSHZZFRKGSXT/slide_captcha_check',params=params,cookies=cookies,headers=headers,
    )
    print(response.json())
    return response.json()
def get_data(code):
    cookies = {
        'https_waf_cookie': '18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b',
        'SF_cookie_129': '12016923',
    }
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Connection': 'keep-alive',
        'Content-Type': 'application/json;charset=UTF-8',
        # 'Cookie': 'https_waf_cookie=18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b; SF_cookie_129=12016923',
        'Origin': 'https://xxgs.chinanpo.mca.gov.cn',
        'Referer': 'https://xxgs.chinanpo.mca.gov.cn/gsxt/newlist',
        '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/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
    }
    json_data = {
        'pageNo': 1,
        'pageSize': 10,
        'paramsValue': '阿里',
        'ssfw': '1',
        'aaae0127': '',
        'xyzk': '',
        'aaae0129': '',
        'aaae0105': '',
        'aaae0123': '',
        'aaae0114': '',
        'aae15having': '',
        'aaae0145': '',
        'aaae0110': '',
        'aaae0137': '',
        'aaae0149': '',
        'aaae0136': '',
        'aaae0139': '',
        'a': code['a'],
        'b': code['b'],
        'c': code['c'],
    }
    response = requests.post(
        'https://xxgs.chinanpo.mca.gov.cn/gsxt/PlatformSHZZFRKGSXT/biz/ma/shzzgsxt/a/gridQuery.html',
        cookies=cookies,
        headers=headers,
        json=json_data,
    ).json()
    data = response['result']['data']
    for item in data:
        compyname = item['aaae0103'].strip()
        code = item['aaae0113'].strip()
        aaae0113 = item['aaae0113'].strip()
        aaae0123 = item['aaae0123'].strip()
        print(compyname,code,aaae0113,aaae0123)
if __name__ == '__main__':
    a,b = get_image()
    xcode = get_xcode()
    code = get_params(a,b,xcode)
    get_check(code)
    get_data(code)

完整js代码:

const JSEncrypt = require('node-jsencrypt');
var u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function get_RSAcode(t) {
    var e = new JSEncrypt;
    e.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCsYUGHMhjSzdMqn9JzPfKs9JbxXTPtHofTv7reV0HrEz4brnE6ZJpNn5s934KO3L4QDF7ELHysIiounhhpF1bewW9jKdcpZA5M1CkGHKcwpLA2liaqOlt/0Mf3ui9jxR9AHxUMFVGfJ6Q4+cEmDBUAEOXlxqk4ZjGpubwGNk9XQIDAQAB");

    result =  e.encrypt(t.toString())
    return result
}
var encodedata=function(t) {
                    var a, i, e, s, n, l = "", c = "", o = "", r = 0;
                    do {
                        e = (a = t.charCodeAt(r++)) >> 2,
                        s = (3 & a) << 4 | (i = t.charCodeAt(r++)) >> 4,
                        n = (15 & i) << 2 | (c = t.charCodeAt(r++)) >> 6,
                        o = 63 & c,
                        isNaN(i) ? n = o = 64 : isNaN(c) && (o = 64),
                        l = l + u.charAt(e) + u.charAt(s) + u.charAt(n) + u.charAt(o),
                        a = i = c = "",
                        e = s = n = o = ""
                    } while (r < t.length);
                    return l
                };
function get_params(avalue,bvalue,moveX) {
    a = get_RSAcode(parseInt(moveX) + "");
    i = {
        a: encodedata(avalue),
        b: encodedata(bvalue),
        c: encodedata(a)
    };
    return i;
};
// console.log(get_params('1','2',56))

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习各种软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值