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 签名是什么
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论