渗透测试 | Sign 签名是什么

admin 2025年6月25日00:37:36评论12 views字数 2394阅读7分58秒阅读模式

Sign 签名是什么

  • 本地实现脚本
    • 客户端
    • 服务端
  • 实现效果
    • 不加入时间戳
    • 加入时间戳
  • 实现原理
  • Ending...

常用于判断参数完整性, 废话多了没用, 上代码以及思路图.

本地实现脚本

客户端

client.html:

<!DOCTYPE html>
<html>
<head>
<title>签名验证Demo</title>
<scriptsrc="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
<script>
// 签名生成函数(与PHP后端相同)
functiongenerateSign(data, signKey{
let result = signKey;
const sortedData = {};
Object.keys(data).sort().forEach(key => {
                sortedData[key] = data[key];
            });
for (const key in sortedData) {
if (key === 'sign'continue;
                result += key + sortedData[key];
            }
            result += signKey;
return md5(result).toUpperCase();
        }

functionsendRequest({
const username = document.getElementById('username').value;
const age = document.getElementById('age').value;
const timestamp = Math.floor(Date.now() / 1000);

const requestData = {
username: username,
age: age,
// timestamp: timestamp
            };

const signKey = 'mysecretkey';
const sign = generateSign(requestData, signKey);
            requestData.sign = sign;

document.getElementById('output').innerText = '发送请求中...';

            fetch('server.php?' + new URLSearchParams(requestData))
                .then(response => response.text())
                .then(data => {
document.getElementById('output').innerText = '服务器响应:n' + data;
                })
                .catch(error => {
document.getElementById('output').innerText = '错误: ' + error.message;
                });
        }
</script>
</head>
<body>
<h3>签名验证Demo</h3>

<label>用户名: <inputtype="text"id="username"value="test"></label><br>
<label>年龄: <inputtype="number"id="age"value="25"></label><br>
<buttononclick="sendRequest()">发送请求</button>

<preid="output"></pre>
</body>
</html>

服务端

server.php:

<?php

$sign_key = 'mysecretkey'// 定义一个 Key

$username = $_GET['username'];
$age = $_GET['age'];
// $_GET['timestamp'] = time();
$sign = $_GET['sign'];

functionsign(array $data_array, string $sign_key){
    $result = '';
    $result .= $sign_key;
    ksort($data_array);
foreach($data_array as $key => $value){
if($key == 'sign'){
continue;
        }
        $result .= $key . $value;
    }
    $result .= $sign_key;
return strtoupper(md5($result));
}

functionverifySign(array $data_array, string $sign_key){
global $sign;
    $trueSign = sign($data_array, $sign_key);
if($sign == $trueSign){
returntrue;
    }else{
returnfalse;
    }
}

if(verifySign($_GET, $sign_key)){
echo'Hello name: ' . $username . ' age: ' . $age;
}else{
echo'No! You Are Hack!';
}

客户端与服务端中都注释了时间戳的校验, 如果将注释打开则是加入时间戳的校验.

实现效果

不加入时间戳

正常使用:

抓包不修改内容:

抓包修改任意参数:

成功实现完整性检查.

加入时间戳

正常使用:

前端可以得到服务端所返回的数据信息, 但是 BP 抓包后过一秒后发送:

没做任何修改的情况下由于时间戳的变动请求失败了.

实现原理

设计思路如下:

Ending...

原文始发于微信公众号(Heihu Share):渗透测试 | Sign 签名是什么

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月25日00:37:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   渗透测试 | Sign 签名是什么http://cn-sec.com/archives/4173016.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息