逻辑越权--登录和支付数据篡改
本文主要内容
登录
暴力破解、本地加密传输
Cookie脆弱、Session劫持、密文比对认证业务
支付篡改、数量篡改
订单ID、手机号码、业务用户ID、商品ID
登录点
#登录应用功能点安全问题
检测功能点,检测,危害,修复方案等
1.登录点暴力破解
观察是属于哪种传输协议,分析出加密方式,然后针对admin账号进行密码暴力破解,使用bp插件,不仅可以加入口令字典,也能使用加密方式对字典数据加密进行爆破
2.HTTP/HTTPS传输
在使用bp工具抓包的时候,如果是http的抓包发现是密文,说明前端js进行加密的,我们在爆破的时候,需要知道,js加密是怎么样的,https基本上是加密的,这HTTPS的加密形式不知道能不能破解
3.Cookie脆弱点验证
部分网站,通过代码审计发现存在最最基础的cookie脆弱点,例如login和index两个页面,cookie内容如果存在uer就不进行过滤,此时删除掉原有内容,增加一个uer=1 就直接进入了index页面,还有一种就是针对cookie内容进行修改
4.Session固定点测试
5.验证密文比对安全测试
业务
#数据算改安全问题
原理,检测,危害,修复等
挖洞技巧:支付漏洞之总结 - SecPulse.COM | 安全脉搏https://www.secpulse.com/archives/67080.html
#商品购买流程:
选择商品和数量-选择支付及配送方式-生成订单编号-订单支付选择-完成支付
#常见算改参数:
商品编号D,购买价格,购买数量,支付方式,订单号,支付状态等
通过bp抓包修改以上参数信息
#常见修改方法:
替换支付,重复支付,最小额支付,负数支付,溢出支付,优惠券支付等
index.php?s=/wap/pay/wchatQrcodePay 微信支付
index.php?s=/wap/pay/alipay 支付宝支付
index.php?s=http://www.xiaodi8.com/alipay 调用其他的支付接口
$pay_name=$_GET['s'];
知识补充
每次访问网站的时候,发送的request都一样吗?
每次访问网站时发送的请求并不完全一样,具体取决于访问的页面、操作的类型以及网站的实现方式。以下是几个常见的例子,说明不同场景下请求的不同之处:
简单的GET请求:访问网站首页
请求行:GET / HTTP/1.1
请求头:
Host: www.example.com
User-Agent: Mozilla/5.0 ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: cookie1=value1; cookie2=value2
Upgrade-Insecure-Requests: 1
带有查询参数的GET请求:在网站上搜索
请求行:GET /search?q=query_string HTTP/1.1
请求头:
Host: www.example.com
User-Agent: Mozilla/5.0 ...
Cookie: cookie1=value1; cookie2=value2
Upgrade-Insecure-Requests: 1
3 .POST请求:用户注册或登录
请求行:POST /login HTTP/1.1
请求头:
Host: www.example.com
User-Agent: Mozilla/5.0 ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: cookie1=value1; cookie2=value2
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
请求体:
username=user123&password=pass123
AJAX请求:页面无刷新更新内容
请求行:GET /api/data HTTP/1.1
请求头:
Host: www.example.com
User-Agent: Mozilla/5.0 ...
Accept: /
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Cookie: cookie1=value1; cookie2=value2
文件上传请求:上传头像
请求行:POST /upload HTTP/1.1
请求头:
Host: www.example.com
User-Agent: Mozilla/5.0 ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: cookie1=value1; cookie2=value2
Content-Type: multipart/form-data; boundary=---------------------------boundary_string
请求体:
包含文件数据的多部分表单数据
每个请求都包含请求行、请求头和请求体(如果有的话)。不同的操作和不同的网站实现会导致请求内容的不同。请求头中的信息如Cookie、User-Agent、Referer等也会影响请求的唯一性。
cookie内容由什么决定?
解释cookie内容生成机制
首先,梳理一下 cookie 的基本概念和作用。cookie 是一种存储在客户端的小数据片段,主要用于会话管理、个性化设置和状态维护。它的内容是由服务器端生成并发送给客户端的,但客户端也可以通过一些方式(比如浏览器的开发者工具)查看或修改 cookie 的值。所以,cookie 的内容主要由服务器决定,但客户端也有一定的参与。
cookie 内容的来源和生成方式(服务器端如何设置 cookie)。
cookie 的组成部分(键值对、属性等)。
客户端对 cookie 的影响(如浏览器的处理、用户操作等)。
cookie 的作用和适用场景(比如会话管理、个性化推荐等)。
Cookie 内容主要由以下几个方面来决定:
服务器端设置
识别用户身份 :当用户登录网站后,服务器会创建一个与该用户相关的会话(Session),并生成一个唯一的会话标识符(Session ID)。服务器会将这个 Session ID 作为 cookie 的值发送给用户的浏览器,以便在后续请求中识别该用户的会话。例如,
PHPSESSID=abc123def456
,其中PHPSESSID
是键,abc123def456
是服务器生成的会话标识符。存储用户偏好设置 :网站可能会根据用户的个性化需求设置 cookie 来保存用户的偏好。比如,用户在电商网站选择了商品展示的排序方式(如按照价格从低到高),网站会将这个偏好设置存储在 cookie 中,如
sort_preference=price_low_to_high
,当用户下次访问时,网站就能根据该 cookie 提供个性化的商品展示。记录用户行为历史 :为了提供更好的服务或进行数据分析,服务器可能会设置 cookie 来记录用户的行为历史。例如,记录用户最近浏览过的商品或页面,如
recent_items=[item1,item2,item3]
,方便为用户推荐相关内容。客户端与服务器端的交互
会话管理 :在用户与网站进行交互的过程中,每次请求和响应都会涉及到 cookie 的发送和接收。浏览器会根据服务器设置的 cookie,自动将其包含在后续对该网站的请求中,直到 cookie 过期或被删除。例如,用户在网站上进行购物操作时,服务器通过 cookie 识别用户的会话,将商品添加到该用户的购物车中,购物车信息可能存储在服务器端,而 cookie 中的 Session ID 用于关联用户和购物车数据。
跨页面请求 :当用户在网站的不同页面之间跳转时,浏览器会将已有的 cookie 发送到服务器,使得服务器能够持续跟踪用户的会话状态和相关信息。比如,用户从网站首页进入商品详情页,再进入购物车页面,整个过程中服务器都通过 cookie 来识别用户的身份和会话,确保用户能够顺利地进行购物操作。
代码示例
以下是一些常见的服务器端设置 cookie 的代码示例:
PHP :
<?php // 设置一个简单的 cookie setcookie("username", "john_doe", time() + (86400 * 30), "/"); // 86400 = 1 day // 设置一个带有属性的 cookie setcookie("preferences", "theme=dark&language=en", time() + (86400 * 30), "/", "example.com", true, true); ?>
JavaScript :
// 设置一个简单的 cookie document.cookie = "username=john_doe; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/"; // 设置一个带有属性的 cookie document.cookie = "preferences=theme=dark&language=en; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/; domain=example.com; secure; samesite=Strict";
Python (Flask) :
from flask import Flask, make_responseapp = Flask(__name__)@app.route('/set-cookie') def set_cookie():resp = make_response("Cookie set")resp.set_cookie('username', 'john_doe', max_age=30*24*60*60)resp.set_cookie('preferences', 'theme=dark&language=en', max_age=30*24*60*60, domain='example.com', secure=True, samesite='Strict')return resp
这些代码示例展示了如何在不同的服务器端语言中设置 cookie,包括设置 cookie 的键值对、过期时间、路径、域名、安全属性等。通过这些设置,服务器能够决定 cookie 的内容和相关属性,以满足网站的不同需求。