从0到1—POC编写基础篇(一)

news2024/10/6 20:32:24

POC编写基础篇


POC的概念


在网络安全领域中,POC的概念是指"Proof of Concept",也被称为"攻击验证"。它是指安全研究人员或黑客用来证明某个漏洞、弱点或安全问题存在的实证或演示。
网络安全研究人员经常通过开发POC来展示一个漏洞的存在和影响,从而向厂商或用户提供证据,并促使其采取必要的措施来修复或解决该问题。通过POC,研究人员可以演示如何利用漏洞来进行攻击、获取敏感信息或者破坏系统。
POC通常包括漏洞的利用代码、相关的技术细节以及攻击成功的证据。通过POC,安全研究人员可以向厂商或组织提供一个具体的案例,以加强对漏洞的重要性和紧迫性的认识,并促使其采取适当的补救措施。

简单理解就是:POC就是用来验证某个漏洞是否存在的一段代码。

POC 的编写流程


1、理解漏洞产生的原理
获取一个漏洞的详细情况后,确定影响范围。

2、漏洞环境搭建
通过官网下载受影响版本,搭建复现环境。或者使用现成的漏洞复现环境,如vulfocus.cn、vulhub,对应一些无害的漏洞,可以使用fofa 找对应版本环境进行复现。
3、漏洞复现
根据漏洞详情,检测漏洞是否存在,其中要尤其注意些参数、命令、函数及对应的提交方法,大概了解漏洞的原理、利用过程、判断漏洞是否存在的地方。方便在写poc 的时候对其进行匹配规则。
4、创建POC脚本
使用 python 写一个 http 请求模拟浏览器,替换上POC
5、发起漏洞验证请求(POC测试)
poc测试,这里有时候需要进行调试,可以配合burpsuite 进行调试。从响应中去找唯一的特征进行匹配是否存在漏洞。可以一个或者多个,主要更具漏洞情况而定。

POC编写流程演示

这里以jeecgBoot 前台SQL注入漏洞(CVE-2023-1454)为例
1、理解漏洞产生的原理
jeecg-boot 3.5.0 版本存在SQL注入漏洞,该漏洞源于文件 jmreport/qurestSql 存在安全问题, 通过参数 apiSelectId 导致SQL注入。影响范围 jeecg-boot 3.5.0版本。

2、漏洞环境搭建
这里直接使用fofa 环境进行演示

3、漏洞复现


使用poc,验证成功,存在该目标存在注入漏洞。这里可以观察响应包的状态、返回值、返回参数等。

4、创建POC脚本


使用 python 写一个 http 请求模拟浏览器,替换上POC,如URL、提交数据、提交方式

5、发起漏洞验证请求(POC测试)
这里有时候需要进行调试,去匹配结果。可以输出结果,也可以配合burpsuite 进行调试。

从响应中去找唯一的特征进行匹配是否存在漏洞。可以一个或者多个,主要更具漏洞情况而定。

POC编写基础知识


Python 中的循环函数


python 中有多个循环函数,这个在写poc 中常用到的则是for循环函数。
for 循环
for 循环是 Python 中最常用的循环方式之一,它可以对序列元素进行迭代。序列可以是一个列表、元组、字符串等。在poc 脚本中,经常会遇到使用多个payload进行拼接url进行多次请求。
示例:

for payload in payloads:
    print(payload)

# 迭代字符串中的字符
text = 'hello world'
for char in text:
    print(char)

# 在 for 循环中使用 range() 函数
for i in range(3):
      print(i)

Python中对文本的读写


我们使用poc脚本批量对目标进行测试的时候,通常会把存在漏洞的目标保存起来,此时就会用到pythond 读写功能了。
1、打开文件
Python 中打开文件的函数是 open(),它可接受一个文件名和打开模式作为参数,返回一个文件对象。
打开模式包括:

●"r":只读模式(默认)。    
●"w":写入模式,会覆盖原有内容。    
●"x":独占写入模式,如果文件已存在则会引发 FileExistsError 异常。    
●"a":追加模式,会在文件尾部添加新内容。    
●"b":二进制模式。    
●"t":文本模式(默认)。    
●"+":在原有功能基础上增加读写模式。

# 以只读模式打开文件
 file = open("test.txt", "r")

2、读取文件内容


读取文件内容的方法包括 read()、readline() 和 readlines()。
●read() 函数用于读取整个文件的内容,返回一个字符串。
●readline() 函数用于读取文件的一行内容,返回一个字符串。
●readlines() 函数用于读取文件的所有行,返回一个包含所有行的列表。
使用示例:

# 以只读模式打开文件
 file = open("test.txt", "r")
 # 读取整个文件内容
 content = file.read()
 print(content)
 # 读取一行内容
 line = file.readline()
 print(line)
 # 读取所有行
 lines = file.readlines()
 print(lines)

3、写入文件


写入文件的操作通常是在只写模式下打开文件,并使用 write() 函数向文件中写入内容。
使用示例:

# 以写入模式打开文件
 file = open("output.txt", "w")
 # 写入内容
 file.write("This is the first line.\n")
 file.write("This is the second line.\n")
 # 关闭文件
 file.close()

4、追加内容到文件


使用追加模式打开文件后,可以使用 write() 函数将内容追加到文件末尾。
使用示例:

# 以追加模式打开文件
 file = open("test.txt", "a")
 # 在文件尾部追加内容
 file.write("This is test\n")
 # 关闭文件
 file.close()

5、关闭文件


使用完打开的文件后,需要使用 close() 函数来关闭文件,以释放系统资源。
使用示例:

# 打开文件
 file = open("test.txt", "r")
 # ... 一些读写操作 ...
 # 关闭文件
 file.close()

6、功能实现


写一个保存目标结果的函数

def write(urlpath):
    curr_dir = os.getcwd()
    vuln_file = '/vuln_' + datetime.now().date().strftime('%Y%m%d') + '.txt'
    f = open(curr_dir + vuln_file, 'a+', encoding='utf-8')
    f.write("漏洞存在:%s " % urlpath + "\r")
    f.close()

写一个批量读取的函数

def write(url):
	with open(url, "r", encoding="utf-8") as file:
    for line in file:
          url = line.strip()
          poc()

Python中对URL处理


如果一大堆目标没有统一的格式的时候,则需要对url 进行统一处理
url处理包括:识别url前缀,没有http&https的添加http或者https删除url路径部分url结尾有/ 则去掉/

import sys
def process_url(url):
    # 添加http或https前缀
    if not url.startswith('http://') and not url.startswith('https://'):
        url = 'http://' + url

    # 删除URL路径部分
    url_parts = url.split('/')
    url_without_path = '/'.join(url_parts[:3])

    # 去掉URL末尾的斜杠
    if url_without_path.endswith('/'):
        url_without_path = url_without_path[:-1]

    return url_without_path


# 主函数
if __name__ == "__main__":
    url = sys.argv[1]
    processed_url = process_url(url)
    print("处理后的URL:", processed_url)

Python中对文本内容去重


使用set 集合对文件内容进行去重

 def remove_duplicate(file):
     with open(file, 'r') as f:
         lines = f.read().splitlines()
 
     lines = set(lines)
 
     with open(file, 'w') as f:
         for line in lines:
             f.write(line + '\n')
 
 remove_duplicate('data.txt')

Python删除开头 https:\\:

def remove_prefix(file):
     with open(file, 'r') as f:
         lines = f.read().splitlines()
 
     for i in range(len(lines)):
         if lines[i].startswith('https:\\'):
             lines[i] = lines[i][8:]
 
     with open(file, 'w') as f:
         for line in lines:
             f.write(line + '\n')
 
 remove_prefix('data.txt')

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

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

相关文章

泛微 E-Office UserSelect接口存在未授权访问漏洞

声明: 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 简介 老洞 泛微e-office系统是标准、易用、快速部署上线…

在vscode上面进行分支merge的记录

前言:在我们的项目中,有两个分支:master和liutielong。现在要将liutielong分支的改动merge到master分支中。 如果master分支已经更改了,所以要先pull(这是在git bash里面的命令)。 git pull origin master…

探索ChatGPT在提高人脸识别与软性生物识准确性的表现与可解释性

概述 从GPT-1到GPT-3,OpenAI的模型不断进步,推动了自然语言处理技术的发展。这些模型在处理语言任务方面展现出了强大的能力,包括文本生成、翻译、问答等。 然而,当涉及到面部识别和生物特征估计等任务时,这些基于文…

vue项目启动npm install和npm run serve时出现错误Failed to resolve loader:node-sass

1.常见问题 问题1:当执行npm run serve时,出现Failed to resolve loader: node-sass,You may need to install it 解决方法: npm install node-sass4.14.1问题2:当执行npm run serve时,出现以下错误 Fa…

QML 不同风格和主题的切换

Quick程序提供了方便的用于切换不同风格和主题的配置文件,如果没有设计稿,又想界面没那么丑,那么可以用这套配置,让应用看起来相对专业一点。 一,在 qrc 资源文件中添加 qtquickcontrols2.conf 文件。 二,…

iOS - 多线程的安全隐患

文章目录 iOS - 多线程的安全隐患1. 卖票案例2. 多线程安全隐患的解决方案2.1 iOS中的线程同步方案2.2 同步方案的使用2.2.1 OSSpinLock2.2.1.1 使用方法:2.2.1.2 案例 2.2.2 os_unfair_lock2.2.2.1 使用方法:2.2.2.2 案例 2.2.3 pthread_mutex2.2.3.1 使…

【嵌入式】Arduino IDE + ESP32开发环境配置

一 背景说明 最近想捣鼓一下ESP32的集成芯片,比较了一下,选择Arduino IDE并添加ESP32支持库的方式来开发,下面记录一下安装过程以及安装过程中遇到的坑。 二 下载准备 【1】Arduino IDE ESP32支持一键安装包(非常推荐&#xff0…

Linux RTC驱动深入解析

目录标题 实时时钟(RTC)基础Linux内核中的RTC框架RTC设备类设备树(Device Tree) 编写Linux RTC驱动1. 初始化和注册2. RTC设备操作函数3. 清理函数 测试RTC驱动驱动开发的挑战总结 在许多嵌入式系统和服务器上,实时时钟…

安全小课堂丨什么是暴力破解?如何防止暴力破解

什么是暴力破解? 暴力破解也可称为穷举法、枚举法,是一种比较流行的密码破译方法,也就是将密码进行一一推算直到找出正确的密码为止。比如一个6位并且全部由数字组成的密码,可能有100万种组合,也就是说最多需要尝试10…

STM32系统参数和结构

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 基本参数 2. 片上资源(外设) 3. STM32系列命名规则 4. 系统结构 5. 引脚定义 6. 启动配置 7. 最小系统电路 8. 型号分类和缩写 1. 基本参数 STM32F103C8T6 系列&#…

【工具】录屏软件Captura安装使用及ffmpeg下载配置

开启技术视频创作,录屏软件林林总总,适合的、习惯的最好。 录屏软件Captura的使用及ffmpeg下载配置 1.Captura下载、安装2.FFmpeg下载、配置3.Captura屏幕录制试用、录制视频效果 1.Captura下载、安装 Captura主要是一个免费开源的录屏软件&#xff0c…

动态创建链表 与头插法 和头插法的优化

1.代码一 思想:在main函数中实行三次头插法,在insertFromHead()函数中,主要创建新的节点new,开辟空间,输入想要增加的data;根据头节点的情况来判断插入, 如果head NUL…

DSPy入门:告别指令提示,拥抱编程之旅!

原文:intro-to-dspy-goodbye-prompting-hello-programming 2024 年 2 月 27 日 DSPy框架如何通过用编程和编译代替提示来解决基于LLM的应用程序中的脆弱性问题。 目前,使用大型语言模型(LLMs)构建应用程序不仅复杂而且脆弱。典型的pipelines通常使用pr…

Xinlinx FPGA内的存储器BRAM全解

目录 一、总体概述1.7系列FPGA的BRAM特点2.资源情况 二、BRAM分类1.单端口RAM2.简单双端口RAM3.真双端口RAM 三、BRAM的读写1、Primitives Output Registers读操作注意事项2.三种写数据模式(1)Write_First(2)Read_First&#xff0…

梯度,hesse阵与Jacobi矩阵

分清楚三个量的含义和计算方法。 梯度 表征的是一个列向量,是相对于某个方向而言的,但是某个方向上可能有多个变量,所以梯度不是简单的直接求偏导,并且说了,它是一个列向量,所以, 我们设 f : …

从0到1—POC编写基础篇(二)

接着上一篇 POC常用基础模块 urllib 模块 Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。 urllib 包 包含以下几个模块: ●urllib.request - 打开和读取 URL。 ●urllib.error - 包含 urllib.request 抛出的异常。 ●urllib.parse - …

Access2019直接将数据导入SQL Server数据库中,再直接链接回来

Access2019 的数据表等,除了通过 SSMA 导入数据库外,还可以利用access2019 自身的外部数据导出功能来达到目的。本文将详细介绍这一操作过程。 一、命令行操作阶段 1.以SA这一超级用户登录SQL Server,创建一个数据库,例如“个人…

【java毕业设计】 基于Spring Boot+mysql的高校心理教育辅导系统设计与实现(程序源码)-高校心理教育辅导系统

基于Spring Bootmysql的高校心理教育辅导系统设计与实现(程序源码毕业论文) 大家好,今天给大家介绍基于Spring Bootmysql的高校心理教育辅导系统设计与实现,本论文只截取部分文章重点,文章末尾附有本毕业设计完整源码及…

C++中的list类模拟实现

目录 list类模拟实现 list类节点结构设计 list类非const迭代器结构设计 迭代器基本结构设计 迭代器构造函数 operator()函数 operator*()函数 operator!()函数 operator(int)函数 operator--()函数 operator--(int)函数 operator()函数 operator->()函数 list…

MATLAB 数据类型

MATLAB 数据类型 MATLAB 不需要任何类型声明或维度语句。每当 MATLAB 遇到一个新的变量名,它就创建变量并分配适当的内存空间。 如果变量已经存在,那么MATLAB将用新内容替换原始内容,并在必要时分配新的存储空间。 例如, Tota…