代码安全审计经验集(下)

对HTTP加密请求参数的测试

对于HTTP请求体加密,如果直接使用明文的请求参数,是无法进行正常的安全测试的。但通常还是有办法分析出加解密的策略,如果能把加解密算法还原,就可以先将安全测试的payload添加到原始明文参数,再加密发送到服务端处理(可以编写对应的burp插件实现半自动化,因为逻辑漏洞还是要人工分析),好处就是可以绕过WAF这类防护设备,WAF可能具备解码BASE64编码的能力,但对这种自定义的加密一般识别不了。比如下面的案例。

HTTP请求体中的参数是分段加密的:

图片

接口使用了RSA和AES配合加密,每次会获得16位随机字符作为AES加密密钥。

图片

iv为固定的字符串(该系统中iv的分析相对是困难的)。

图片

加密模式为CBC,padding为Pkcs7,在加密入口设置断点获取某次加密的AES密钥。

图片

使用密钥和iv解密data参数中的密文,获得明文参数,给明文参数添加安全测试的payload,再用相同的算法加密重新发包。

图片

通过接口猜测实现越权

对于企业级系统,可用的后台服务不会是寥寥几个,通常会基于CURD组合成丰富的业务功能,用户在系统中看到的服务可能并不是该系统的全部服务。比如下面的案例。

下图是查看控制中心-用户管理的功能界面:

图片

该功能调用了以下接口,该接口能够返回角色信息。

/detection/api/user/findRoleListByUserId/24

图片

按照接口命名规则猜测,修改/findRoleListByUserId/为/findUserByUserId/,同时修改userid的数值为超管的userid(1),便返回了超级管理员的个人信息(如身份证、手机号、邮箱)。

图片

模糊测试发现隐藏接口

俗话说,有毒蛇出没的地方也会有解药。同理,在有新增功能的地方,通常也有删除功能。

比如某系统查看首页-公司公告的功能:

图片

查看其中一篇公告“集团公司公告测试”,发现可以进行评论。

图片

添加评论,查看添加评论的接口接口如下:

/cqeip-androidapp/form/articleDiscuss/addDiscuss

图片

 尝试删除评论,但是发现没有删除评论的接口,由于添加评论的接口是/cqeip-androidapp/form/articleDiscuss/addDiscuss,于是修改接口名称addDiscuss 为deleteDiscuss,提示不支持POST请求,但说明该接口存在。

图片

转为GET请求再尝试,提示PostgreSQL数据库执行时发生语法错误,SQL中带入括号导致SQL语法报错,排查括号来源即可定位注入点。

图片

从代码中找到越权入口

有时候业务功能和安全防护是冲突的,即便已经有意识对不同角色的用户划分权限。在某些情况下,研发人员“业务优先”的思维会在潜意识中使安全功能滞后,导致安全和业务冲突。如下面的案例。

对于已经做了鉴权的接口,尝试修改路径变量的数字id发现服务器不予处理。

图片

通过查看源码发现,用户级别(参数level)为3才能调用这个接口,当前用户的级别为1,所以调用api/user/userGrid/1提示未授权。

图片

上述代码在调用接口前进行鉴权,检查用户级别可以调用的数据集。

图片

但在最后返回的时候代码会自动增加了一个参数level是3,authSource参数为0的数据集(可能其他服务需要用户有这个level的级别)。

图片

该接口requireLevel是3,会提取出level大于等于3的数据集。由此判断,接口/userGrid/{datasetId}中的datasetId不在level大于等于3的数据集中,而经过校验返回的数据集中刚好存在level为3,值为0的数据集,由此导致安全和业务冲突。

图片

于是,通过请求/api/user/userGrid/0即可实现权限绕过。

绕过HTTP请求中的签名保护

经过了签名保护的HTTP请求包数据通常是明文,只是多了签名校验的参数,如果修改了参数重新发包,而对应的签名校验的参数没有正确生成,那么服务端将不会处理该请求。如下面的案例。

当前系统的账号下只有一个文件,查看这个文件的处理日志。

图片

获取日志的接口,URI中的数字22是当前H5文件的id:

/api/h5/encrypt/lookH5InfoLog/22

修改 id 为 21,查看其他文件的加固日志,提示接口签名校验错误。

签名校验参数sign的生成是在文件/static/js/app.42706fa77f33b048ba77.js中完成(如下图),其中clientid是固定字符串“admin”,timestamp是时间戳,拼接URI和字符串“admin”和时间戳,再通过MD5进行哈希即得到签名sign。

基于上述签名的生成方式,获取一个新的时间戳

修改URI中的id为21,再拼接字符串“admin”和新时间戳再通过MD5计算,便能得到一个合法的签名sign。

替换之前请求中的时间戳和sign,再次请求就能越权查看当前账号中看不到的文件id为21的处理日志。

绕过 jsonp 跨域限制

对于使用了随机数进行请求校验的功能,最简单的方法是尝试删除随机数。

登录站点A后,选择手机号码修改业务

之后进入信息审核页面,按 F12 进入浏览器开发者模式,选择“网络”, 刷新页面,查看请求,发现在三个回调函数调用中会返回用户的敏感信息(用户名,资金账号,手机号等)

可以看到,回调函数名都是采用了长的随机数命名,这样每次调用都是一次性的,下次调用又是新的随机函数名,再次访问该jsonp接口将不会返回数据:

https://a.com/hall/biz/judge/login?callback=jQuery112406353168200498462_1596181627657&_=1596181627658

由于同源策略限制,其他站点想要获取到该站点下的这些用户敏感数据可以尝试使用jsonp进行跨域获取。

这里尝试将回调函数后面的随机数删掉,再进行跨域获取,原始回调函数调用包含蓝色标记的随机数:

https://a.com/hall/biz/judge/login?callback=jQuery112406353168200498462_1596181627657&_=1596181627658 

将蓝色标记的随机数删掉,只保留“jQuery”:

https://a.com.cn/hall/biz/judge/login?callback=jQuery

jsonp跨域主要是利用<script>标签src属性可以进行跨域访问这一点,先创建一个html文件,用<script>标签的src属性去调用上面站点中返回用户敏感数据的那三个回调函数,接着在接收函数中将获取到的数据在控制台打印出来。

登录状态下在浏览器打开该页面,按F12查看控制台,发现成功在控制台中打印出了用户敏感数据,说明删掉随机数后可以正常调用jsonp接口,算是函数随机数命名的简单绕过,最后诱骗已登陆系统的用户去访问该构造好的URL即可获取对方的敏感信息(用户名,资金账号,手机号等)。

作者:RoShine

2024年2月2日 

洞源实验室 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学习_win32 实现模拟键盘输入或者鼠标移动的方法

1.方法一 参考文档 https://blog.csdn.net/qq_45664055/article/details/123573468ctypes 是一个 Python 库&#xff0c;它提供了调用 C 代码的功能。使用 ctypes 可以调用 Windows API 函数&#xff0c;包括鼠标和键盘的操作。 1.1模拟鼠标操作&#xff1a; from ctypes im…

SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常

目录 拦截器:是Spring框架提供的核心功能之一&#xff0c;主要用来拦截用户的请求&#xff0c;在指定方法前后&#xff0c;根据业务需要执行预先设定的代码: 自定义拦截器 统一数据格式&#xff0c;要包含状态码&#xff0c;错误信息​编辑 出现针对String类型的错误​​​…

【Linux C | 网络编程】netstat 命令图文详解 | 查看网络连接、查看路由表、查看统计数据

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

MBP 2015安装Ubuntu 22.04.3系统后摄像头驱动问题解决

# 表示root用户, 如果更喜欢 sudo 也可以使用 sudo$ 表示普通用户 安装缺失的Ubuntu依赖以解压固件 (# apt install xz-utils curl cpio make)解压和安装固件请参考 Firmware extraction.安装依赖: (# apt-get install linux-headers-generic git kmod libssl-dev checkinsta…

【Java万花筒】选择你的武器:移动开发的多面利器大揭秘

Java移动开发全景图&#xff1a;从Android SDK到跨平台框架一网打尽 前言 移动应用开发正迎来飞速发展的时代&#xff0c;选择合适的开发库成为开发者关注的焦点。本文深入探讨了多个Java库&#xff0c;涵盖Android SDK、RoboVM、Codename One、Xamarin、Flutter以及React Na…

【AI数字人-论文】Geneface论文

文章目录 前言pipelineaudio-to-motionMotion domain adaptation可视化 Motion-to-imageHead-NeRFTorso-NeRF 结果对比 前言 语音驱动的说话人视频合成旨在根据一段输入的语音&#xff0c;合成对应的目标人脸说话视频。高质量的说话人视频需要满足两个目标&#xff1a; &#…

Redis简介和数据类型

简介 Redis是完全开源&#xff08;BSD许可&#xff09;的内存数据结构存储&#xff0c;是一个高性能的 key-value 数据库&#xff0c;用作数据库、缓存、消息代理和流式处理引擎。 Redis 提供数据结构&#xff0c;例如字符串、哈希、列表、集、带有范围查询的排序集、位图、超…

【INTEL(ALTERA)】内部错误:子系统:QHD,文件:/quartus/comp/qhd/qhd_design.cpp

说明 由于英特尔 Quartus Prime 专业版软件 23.2 及更早版本存在问题&#xff0c;在使用 GUI 对设计进行完整编译后&#xff0c;您可能会看到此内部错误。 此错误仅发生在 GUI 中&#xff0c;在命令行中不会发生。此问题也仅出现在面向 Intel Agilex 7 设备的设计中。 解决方法…

ele-h5项目使用vue3+vite开发:第二节、search 搜索框组件开发

如何设计一个组件 需求分析 布局 content left-iconbodyinput-controlright-iconaction 功能 使用 defineEmits 定义组件的事件 在组件的script setup 里如何定义事件 使用defineEmits&#xff08;&#xff09;定义先声明事件接口 <script setup lang"ts"> int…

儿童护眼台灯怎么选择?一文教你如何选择儿童护眼台灯

护眼台灯是家长最常为孩子购买的用品之一&#xff0c;但是大部分人对它的了解并不多&#xff0c;很多人购买之后反而会觉得眼睛更容易疲劳&#xff0c;有不适的情况&#xff01;最主要的原因是因为挑选的台灯不够专业&#xff0c;次要原因则是使用方法不正确。所以今天跟大家讲…

yyyy与YYYY、dd与DD、mm与MM、hh与HH的区别

yyyy与YYYY、dd与DD、mm与MM、hh与HH的区别: Date now = new Date(); // 2024-02-02 14:26:xx、Fri Feb 02 14:26:xx CST 2024小写y是指Year、大写Y是指Week year(Week year是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年) Sys…

Android.bp入门指南之浅析Android.bp文件

文章目录 Android.bp文件是什么&#xff1f;Android.bp的主要作用模块定义依赖关系构建规则模块属性插件支持模块的可配置性 为什么会引入Android.bp语法例子 Android.bp文件是什么&#xff1f; Android.bp 文件是 Android 构建系统&#xff08;Android Build System&#xff…

JavaScript基础五对象 内置对象 Math.random()

内置对象-生成任意范围随机数 Math.random() 随机数函数&#xff0c; 返回一个0 - 1之间&#xff0c;并且包括0不包括1的随机小数 [0, 1&#xff09; 如何生成0-10的随机数呢&#xff1f; Math.floor(Math.random() * (10 1)) 放大11倍再向下取整 如何生成5-10的随机数&…

科普类——进行基线设计、系统测试和优化的立体视觉软件与工具(七)

科普类——进行基线设计、系统测试和优化的立体视觉软件与工具&#xff08;七&#xff09; 在立体视觉领域&#xff0c;有许多立体视觉软件和工具可以帮助工程师进行基线设计、系统测试和优化。以下是一些常用的立体视觉软件和工具&#xff1a; Meshroom&#xff1a;这是一个基…

element-ui icon 组件源码分享

今日简单分享 element-ui 源码中的 icon 组件&#xff0c;主要从以下两个方面来分享&#xff1a; 一、源码中 icon 设计思想是什么呢&#xff1f;主要从页面结构、数据、 icon 样式三个方面来分享。 1.1 源码中 icon 组件的页面结构&#xff0c;可以在 package 目录下找到 ico…

python爬虫实战——获取酷我音乐数据

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 开发环境: 版 本&#xff1a; python 3.8 编辑器&#xff1a;pycharm 2022.3.2 模块使用: requests >>> pip install requests 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命令 pip install…

k8s kubeadm部署安装详解

目录 kubeadm部署流程简述 环境准备 步骤简述 关闭 防火墙规则、selinux、swap交换 修改主机名 配置节点之间的主机名解析 调整内核参数 所有节点安装docker 安装依赖组件 配置Docker 所有节点安装kubeadm&#xff0c;kubelet和kubectl 定义kubernetes源并指定版本…

【Java】【SSE】【VUE】实现调用千帆大模型,实现打字效果

没有废话。只有演示、和源码地址 效果演示 源码地址 qianfan-sse-demo: 基于https://gitee.com/codinginn/chatgpg-sse-demo-springboot-vue改动

Vue入门基础语法概要

文章目录 一、Vue框架基础语法vue文件构成 二、脚手架执行流程三、vue组件四、css样式写法其他实例以及解释&#xff0c;随便写写 一、Vue框架基础语法 el挂载点data数据对象标签 V-text 纯文本V-html 解析htmlV-on&#xff08;可替换为&#xff09; 为元素绑定事件&#xff0…

QT SQL

QT SQL模块提供数据库编程的支持&#xff0c;支持多种常见的数据库&#xff1a;MySQL\Oracle\MS SQL Server\SQLite等。SQL模块包含多个类&#xff0c;可以实现&#xff1a;数据库连接、SQL语句执行、数据获取与界面显示 等功能。数据 与 界面间用Model\View架构。 一、 二、Q…