代码审计笔记之未授权审计(缺失功能级别访问控制)

主题

1、未授权漏洞以及危害介绍
2、未授权漏洞的审计思路与方法

简介

大多数网络应用程序在用户使用功能之前,应用程序需要验证该用户是否有功能级的访问权限。如果请求未经应用程序的验证。攻击者讲通过伪造请求参数的手段,获取应用的业务响应。

危害

在未授权直接的危害是导致用户可以通过伪造请求使用本该受限的功能,访问本不该访问的数据。并且在日常利用中,其可以结合很多其他漏洞以完成更深层次的利用;
1、未授权访问+命令执行
2、未授权访问+反序列化
3、未授权访问+任意写+系统机制
4、未授权访问+SSRF+其他

未授权漏洞代码审计思路与方法

对于未授权的审计一定要,细心,细心,再细心!特别是随着目前系统的架构越来越复杂,对于权限的控制也越来越容易遗漏。

整体思路

梳理未授权之前,需要想清楚未授权的攻击链构成2个条件
1、攻击者可以访问到应用,即能够访问到对应服务的监听端口
2、攻击者伪造的请求,经过系统的层层处理成功响应,如下图示例。
![[未授权.drawio.png]]

明确了攻击链的构成条件整体审计流程基本就明确了,即我们需要以暴露端口为基础,层层梳理来判断请求处理的过程是否存在遗漏,具体如下;

一、端口梳理

此流程在于选择自己喜欢的工具对于服务的Ip进行端口扫描,这里使用NMAP演示

nmap -min-rate 10000 -p- ip1 ip2 > postscan.txt
参数说明:
 -min-rate 10000           扫描速录,每秒发送10000个数据包
-p-                        全端口扫描
 ip1 ip2                   待测试ip,试ip个数自增
 > postscan.txt            输出重定向到文件postscan.txt ,方便后续查看

![[Pasted image 20230531163848.png]]

二、服务梳理

1、在对应服务上查找端口对应服务,这里使用netstat命令进行演示

netstat -lnpt
参数说明:
l             显示监控中的服务器的Socket
n             直接使用IP地址,而不通过域名服务器。
t             显示TCP传输协议的连线状况
p             显示正在使用Socket的程序识别码和程序名称

![[Pasted image 20230531164751.png]]

2、根据端口对应的PID,查询“运行时”信息

cd /proc/4228/            进入PID为4228的运行时伪文件路径
ll                        查看所有文件

如图基本确认文件位置
![[Pasted image 20230531170400.png]]

3、进入文件查看对应服务配置,定位业务服务
以nginx为例,其配置文件的分析主要关注两个维度
第一、nginx配置文件会包含引用的情况,所以需要关注include关键字防止遗漏
第二、因为nginx是以反向代理的形式代理后端服务所以,需要关注proxy_pass关注其后端服务。
命令如下;

cat nginx.conf|grep -E 'proxy_pass|include'
参数说明
cat nginx.conf                       查看nginx.conf文件
|                                    管道符,将上一步结果交给下一个命令
grep -E 'proxy_pass|include'         以正则形式匹配含有proxy_pass或include关键字的行

第三、通过梳理配置,即可获取到对应的业务服务包,根据业务服务包获取源码,准备进行下一步分析。

三、认证梳理

因为第二部已经梳理出了我们所有对外暴露的服务,这一步主要对这些服务进行审计与测试,判断其是否存在未授权的情况,其中关注点有;
1、所以对外开发端口的服务(不局限与业务服务)均需要判断其是否存在认证,未授权情况,常见有一些服务的默认密码或者匿名登录等
2、业务服务是否每种协议类型的接口接口均进行了认证操作

如一个业务服务可能同时具有Http,WebService,WebSocket多种协议类型的接口,三种协议均需进行认证判断菜可以

3、服务引入的三方框架是否存在不需要认证即可直接访问的页面,如spring的swagger、actuator等

四、授权梳理

关注授权模块是否存在,以及授权规则的完整性有效性,场景关注点有
1、授权规则(或者授权框架)本身是否存在绕过可能,如常见的403 Bypass
2、授权规则是否有效覆盖服务的所有接口,是否会有一些接口因未被授权和认证规则包含导致可以直接访问

说明:本文主要是甲方视角的代码审计,作为常规的攻击对来讲更多的是以单个源码包或者是服务部署包为分析基础。没有端口扫描与服务梳理过程,直接对对源码或反编译后的源码进行认证与授权的分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个移动笔记系统的示例Python代码,包括笔记的添加、编辑、删除、查询、导出和数据挖掘等全部功能: ```python import pandas as pd import numpy as np import hashlib import os import csv import matplotlib.pyplot as plt from sklearn.cluster import KMeans # 笔记文件路径 NOTES_FILE = 'notes.csv' # 初始化笔记数据 if not os.path.exists(NOTES_FILE): notes_df = pd.DataFrame(columns=['id', 'title', 'content', 'tags']) notes_df.to_csv(NOTES_FILE, index=False) # 生成唯一ID def generate_id(title): return hashlib.md5(title.encode('utf-8')).hexdigest() # 添加笔记 def add_note(): title = input('Enter note title: ').strip() content = input('Enter note content: ').strip() tags = input('Enter note tags (comma-separated): ').strip() # 生成唯一ID note_id = generate_id(title) # 读取笔记数据 notes_df = pd.read_csv(NOTES_FILE) # 检查笔记是否已存在 if note_id in notes_df['id'].tolist(): print('Note already exists!') return # 添加新笔记 new_note = pd.DataFrame({'id': [note_id], 'title': [title], 'content': [content], 'tags': [tags]}) notes_df = pd.concat([notes_df, new_note], ignore_index=True) # 保存笔记数据 notes_df.to_csv(NOTES_FILE, index=False) print('Note added successfully!') # 编辑笔记 def edit_note(): note_id = input('Enter note ID: ').strip() # 读取笔记数据 notes_df = pd.read_csv(NOTES_FILE) # 检查笔记是否存在 if note_id not in notes_df['id'].tolist(): print('Note not found!') return # 编辑笔记 title = input('Enter new note title (leave blank to keep existing): ').strip() content = input('Enter new note content (leave blank to keep existing): ').strip() tags = input('Enter new note tags (comma-separated, leave blank to keep existing): ').strip() note_idx = notes_df.index[notes_df['id'] == note_id][0] if title: notes_df.at[note_idx, 'title'] = title if content: notes_df.at[note_idx, 'content'] = content if tags: notes_df.at[note_idx, 'tags'] = tags # 保存笔记数据 notes_df.to_csv(NOTES_FILE, index=False) print('Note edited successfully!') # 删除笔记 def delete_note(): note_id = input('Enter note ID: ').strip() # 读取笔记数据 notes_df = pd.read_csv(NOTES_FILE) # 检查笔记是否存在 if note_id not in notes_df['id'].tolist(): print('Note not found!') return # 删除笔记 note_idx = notes_df.index[notes_df['id'] == note_id][0] notes_df = notes_df.drop(index=note_idx) # 保存笔记数据 notes_df.to_csv(NOTES_FILE, index=False) print('Note deleted successfully!') # 查询笔记 def search_notes(): query = input('Enter search query: ').strip().lower() # 读取笔记数据 notes_df = pd.read_csv(NOTES_FILE) # 搜索笔记 search_results = notes_df[notes_df.apply(lambda x: query in x['title'].lower() or query in x['content'].lower() or query in x['tags'].lower(), axis=1)] # 显示搜索结果 if search_results.empty: print('No notes found.') else: print(f'{len(search_results)} notes found:') for _, row in search_results.iterrows(): print(f"{row['title']} ({row['tags']})") print(row['content']) print() # 导出笔记 def export_notes(): export_file = input('Enter export file name (CSV format): ').strip() # 读取笔记数据 notes_df = pd.read_csv(NOTES_FILE) # 保存笔记数据到CSV文件 notes_df.to_csv(export_file, index=False) print('Notes exported successfully!') # 笔记数据挖掘 def data_mining(): # 读取笔记数据 notes_df = pd.read_csv(NOTES_FILE) # 提取笔记的标题和标签 notes_data = notes_df[['title', 'tags']] # 将标签转换为二进制特征 tags_dummies = notes_data['tags'].str.get_dummies(sep=',') # 合并标题和标签特征 notes_features = pd.concat([notes_data['title'], tags_dummies], axis=1) # 使用K-Means聚类算法将笔记分为不同的主题群组 kmeans = KMeans(n_clusters=3) kmeans.fit(notes_features.iloc[:, 1:]) notes_data['topic'] = kmeans.labels_ # 可视化笔记主题分布 plt.pie(notes_data['topic'].value_counts(), labels=['Topic 0', 'Topic 1', 'Topic 2'], autopct='%1.1f%%') plt.title('Note Topics') plt.show() # 主程序 while True: print('1. Add note') print('2. Edit note') print('3. Delete note') print('4. Search notes') print('5. Export notes') print('6. Data mining') print('7. Exit') choice = input('Enter your choice: ').strip() if choice == '1': add_note() elif choice == '2': edit_note() elif choice == '3': delete_note() elif choice == '4': search_notes() elif choice == '5': export_notes() elif choice == '6': data_mining() elif choice == '7': break else: print('Invalid choice. Please try again.') ``` 这段代码实现了笔记的添加、编辑、删除、查询、导出和数据挖掘等全部功能。其笔记数据使用CSV文件保存,每个笔记包括唯一的ID、标题、内容和标签。笔记的ID使用MD5哈希算法生成。笔记的查询使用简单的关键字搜索。笔记的数据挖掘使用K-Means聚类算法将笔记分为不同的主题群组,并使用Matplotlib库将笔记主题分布可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方寸明光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值