20252302 2025-2026-2 《Python程序设计》实验四报告

20252302 2025-2026-2 《Python程序设计》实验4报告

课程:《Python程序设计》
班级: 2523
姓名: 邢城瑜
学号:20252302
实验教师:王志强
实验日期:2026年6月13日
必修/选修: 公选课

一、实验内容概述

CTF Web探测工具webscan
(课程要求:Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。)

二、实验分析与分工构思

2.1 需求分析

CTF比赛中,Web类题目要求选手在目标网站上发现并利用漏洞获取Flag。有效的信息收集是解题第一步。市面上现有dirsearch等专业工具,但它们通常需要安装额外环境(如Go运行时),且功能庞杂、指纹识别、目录扫描等功能并未集成在一个软件中。
需要说明的是:尽管当今AI agent在CTF领域已经广泛使用,但“手搓”扔然不可不练,一是部分高级CTF比赛(如长城杯网鼎杯)限制使用AI,二是“手搓”也更锻炼网安技能。因此,本工具旨在实现一个轻量快捷集成化的ctf初步探测工具,以减少人工解题中机械化的时间浪费。

但必须说明的是,受限于作者有限的编程能力qwq(例如,GUI编程不熟悉、高阶网络知识尚不充足),本次实验借助了AI agent书写部分代码并进行部分核心技术修复,但作者亦在能力范围内完成了部分代码与其他工作。
注:api使用deepseekV4pro,未涉及可能涉密的信息,无违法违纪风险。

核心功能需求:

  1. 目录/文件枚举:探测敏感路径(.git/泄露、备份文件、管理后台等),支持递归扫描
  2. HTTP响应头分析:识别服务器类型、框架指纹,检查安全配置缺陷,检测WAF/IPS
  3. 参数模糊测试:发现后端可接收的GET/POST参数
  4. 常见漏洞探测:SQL注入、LFI、SSTI、命令注入的半自动化检测
  5. 页面信息提取:HTML注释、隐藏字段、表单、JSON配置、敏感关键词
  6. 图形用户界面:降低使用门槛,实时彩色日志,扫描结果可视化总结

2.2 人工队与机器队分工构思

我的贡献:项目需求构思(CTF实战经验)、内置字典与Payload手工搜集、系统性人工功能测试与Bug发现、部分代码编写(_fmt_size/_status_icon/_get_body_str等工具方法)、实验报告撰写。AI agent贡献:其他代码实现(HTTPClient、CTFScanner模块、HTMLCommentParser、CTFScannerGUI)、架构设计、bug原因分析与Bug修复。

因此,本次报告很多模块都分为了两个子模块,分别针对“我自己完全手写的部分_fmt_size/_status_icon/_get_body_str”和“我调试AI的部分”。

三、具体架构概览

3.1:项目文件结构

webscan/
├── webscan.py (1808行) [AI agent]     ├── webscan_gui.py (738行) [AI agent]
    ├── Color (ANSI终端颜色)            │   ├── Theme (浅色主题系统)
    ├── 内置字典+Payload [作者]         │   ├── LogRedirect (stdout→队列)
    ├── HTMLCommentParser              │   ├── CTFScannerGUI (主窗口)
    ├── HTTPClient (Handler链+缓存)    │   │   ├── _append_colored_text
    ├── CTFScanner (5大模块+递归)      │   │   ├── _poll_log (每100ms)
    └── main() + argparse CLI         │   │   ├── _finish_scan (双重保障)
                                      │   │   └── _start/_stop_scan

3.2 命令行接口

python webscan.py -u <URL> [选项]
扫描模式: --full / --scan-dirs / --scan-headers / --scan-params / --scan-vulns / --scan-content
配置: -w 字典 -t 线程 --timeout --delay --max-depth -m GET/POST -c Cookie -x 代理 -a UA -o JSON --no-color
GUI: python webscan_gui.py

四、具体实验实现过程 Part1————人工书写的部分代码

1. _status_icon — 状态码图标

位置:webscan.py

def _status_icon(self, code: int) -> str:
    """根据状态码返回图标 (ASCII安全)"""
    if 200 <= code < 300:
        return f"{Color.GREEN}[+]{Color.RESET}"
    elif 300 <= code < 400:
        return f"{Color.YELLOW}[>>]{Color.RESET}"
    elif code == 403:
        return f"{Color.YELLOW}[403]{Color.RESET}"
    elif code == 401:
        return f"{Color.YELLOW}[401]{Color.RESET}"
    elif 500 <= code < 600:
        return f"{Color.RED}[{code}]{Color.RESET}"
    else:
        return f"{Color.DIM}[-]{Color.RESET}"

实现逻辑

这是一个将 HTTP 状态码映射为带颜色的可视化图标的方法,分别将不同的HTTP码对应到不同的图标、颜色一优化可视度。

设计关键点

-不使用 Unicode 符号(如 ✓/✗),避免了在某些终端中显示乱码的问题。

  • 403 和 401 被单独列出而非归入 400 范围,因为它们在安全扫描中具有特殊意义:
    • 403 说明路径存在(可能是隐藏目录或敏感路径)
    • 401 说明需要认证,暗示存在受保护区域
  • 使用了 ANSI 颜色转义码(Color.GREEN 等)并通过 Color.RESET 重置,防止颜色"泄漏"到后续输出中。

2. _get_body_str — 安全获取响应体字符串

位置:webscan.py

def _get_body_str(self, resp: dict) -> str:
    """安全获取响应体字符串"""
    body = resp.get("body", "")
    if isinstance(body, bytes):
        try:
            body = body.decode("utf-8", errors="replace")
        except Exception:
            body = str(body)
    return body or ""

实现逻辑(分层防御)

dict → resp.get("body", "")
        │
        ▼
   是 bytes 吗? ──否──▶ 直接使用原始值
        │
       是
        ▼
   decode("utf-8", errors="replace")
        │
        ▼
   解码成功? ──否──▶ str(body)  回退(得到 "b'...'" 形式)
        │
       是
        ▼
   body or ""   (防止 None/空)
        │
        ▼
      返回字符串

3. _fmt_size — 格式化文件大小

位置: webscan.py:1493

@staticmethod
def _fmt_size(size: int) -> str:
    """格式化文件大小"""
    if size < 1024:
        return f"{size}B"
    elif size < 1024 * 1024:
        return f"{size / 1024:.1f}K"
    else:
        return f"{size / (1024 * 1024):.1f}M"

实现逻辑

size (int)
    │
    ├── < 1024 ──────────────▶ f"{size}B"               例: 512 → "512B"
    │
    ├── < 1024×1024 (1M) ───▶ f"{size/1024:.1f}K"       例: 1536 → "1.5K"
    │
    └── ≥ 1M ──────────────▶ f"{size/(1024*1024):.1f}M" 例: 2097152 → "2.0M"

.1f 格式保证了统一的显示精度,避免输出像 1.53333333333K 这样的浮点数。


总结

这三个函数均有防御性编程的思想:

函数 防御策略
_status_icon ASCII 安全避免终端乱码;Color.RESET 防止 ANSI 颜色错误
_get_body_str .get() 防 KeyError;errors="replace" 防解码崩溃;try/except 兜底;or "" 防 None
_fmt_size @staticmethod 隔离副作用;int 类型暗示,调用方传入正确类型

它们都是辅助函数,为 webscan 的安全扫描核心逻辑(漏洞探测)提供可靠的格式化支持,让上层调用代码可以专注于漏洞检测逻辑本身,而关不需要心边界情况的处理。


五、具体实验实现过程 Part2————人工调试AI的路径

5.1 创建工程时需求的描述

通过反复交互,明晰需求。
image

5.2 调试阶段总览(具体图片在5.3后

阶段一:逐模块功能测试         阶段二:边界与集成测试        阶段三:最终验收
(每个扫描模块独立勾选运行)     (模块组合+异常路径)         (全功能完整扫描)
        │                           │                          │
        v                           v                          v
  发现界面显示BUG              发现逻辑/崩溃BUG           发现静默失败BUG
  · 彩色输出消失                · 参数扫描崩溃          · 扫描日志完全空白
  · 日志双倍空白行              · 中止按钮无效          · 汇总双重调用
                               · 汇总信息丢失          · 递归死代码
                               · 暗色主题迁移 

5.3 调试方法:表象→定位→复现→总结

Step 1 — 观察表象:逐模块、逐功能点手动操作GUI,记录异常现象。

Step 2 — 缩小范围(CLI/GUI对比法):当GUI出现异常时,首先用CLI模式验证同一功能。若CLI正常而GUI异常,则问题在GUI层(stdout重定向/ANSI渲染/队列通信);若CLI也异常,则问题在引擎层。这个方法在Bug 6排查中起到关键作用——CLI正常排除引擎问题,队列消息计数(仅2条)将问题定位到扫描器构造阶段。

Step 3 — 构造最小复现步骤:精确描述触发条件。例如报告参数扫描崩溃时:"仅勾选'参数模糊测试'→点击开始→GUI无响应→控制台显示AttributeError: 'CTFScanner' object has no attribute '_extract_params_from_html'"。

Step 4 — 报告+验证循环:向AI agent提交精确Bug报告(含复现步骤与三层证据链),AI agent定位根因并实施修复,作者验证修复效果后关闭。

例如:我在运行GUI文件时发现日志毫无回显,如下图
image

就可以向AI agent描述后让其调试bug,过程截图:
image

同时,也可以很方便地复现bug,毕竟AI agent搭环境也是一把好手
d4e1a226d5a0406a0d93bfdb7c80cdc8

上面的只是一个bug的调试过程,实际中还遇到各种奇奇怪怪的bug,但基本方法与上面大致相似。共计修复了十余个bug,其中包含彩色回显丢失、回显毫无内容等极其严重的bug。


六、实验成果呈现

功能视频——bilibili

命令行界面

--help输出
image
命令行扫描结果
image
GUI扫描中~
image

七、实验中遇到的问题与解决方法

7.1 过程中的困难

7.1.1 (Part1)人工书写的_fmt_size/_status_icon/_get_body_str这几个函数书写时的困难

问题一:_fmt_size第一版时没用.1f格式化,然后输出了很多位小数,使用.1f后正常。
问题二:_status_icon 图标加了颜色但忘了 Color.RESET 重置,导致终端后续输出全部被染色。(简直是五彩斑斓的黑

7.1.2 (Part2)AI调试中的困难

问题一:AI不了解自己代码的Bug——错误代码也自信输出
AI agent生成了urllib.request.HTTPErrorHandler()调用,但Python标准库根本不存在这个类。发生了“AI幻觉”
-原因:LLM基于统计模式生成代码,不具备对Python标准库API存在性的精确知识。当它需要"禁止重定向的Handler"时,类比HTTPRedirectHandler推理出HTTPErrorHandler这个不存在的类名。
-解决:(1) 权威文档验证——对AI调用的任何不熟悉的API,查阅Python官方文档确认其真实存在性;(2) 最小可运行验证——每个模块完成后立即运行(而非等全部完成),及早暴露API不存在类错误;(3) CLI优先于GUI——CLI模式下错误会直接打印Traceback,比GUI的静默失败更容易发现此类问题。

问题二:AI修复引入新Bug——修复链式反应
AI agent修复ANSI解析时,将active_tags = [tag]改为active_tags.append(tag)解决了标签叠加问题,但同时存在的i += 2跳过文本片段的Bug使修复效果被部分掩盖——作者需要多轮测试才能确认"修复后部分颜色恢复但不完整"的现象。

  • 原因:AI在修复时倾向于"最小改动",当同一个函数中存在多个独立Bug时,AI可能只修复被告知的那个,遗漏其他。此外修复代码本身可能引入新的逻辑错误。
  • 解决:(1) 每次修复后不仅要验证报告的Bug,还要重跑之前正常的功能确保正常(2) 要求AI自查——报告修复完成后追问"这个函数中是否还有其他潜在问题?"促使AI进行局部审查;**

问题三:模糊描述导致修复了错误的地方,
对比:模糊描述"扫描日志有问题" vs 精确描述"仅勾选'参数模糊测试'模块→点击开始→GUI无响应→控制台显示AttributeError: 'CTFScanner' object has no attribute '_extract_params_from_html'"。前者AI可能去修改日志渲染代码(方向错误),后者AI直接定位到缺失方法。

  • 原因:AI无法直接看到用户在干什么。模糊的描述给AI过大的推测空间,可能指向完全错误的方向,甚至可能把原本能用的部分修坏QWQ
  • 解决:(1) 复现步骤模板——始终包含"操作(勾选哪些选项→点击什么按钮)→预期结果→实际结果→错误信息"四要素;(2) 附带证据链——控制台Traceback截图或原文、CLI对比结果、异常发生前后的日志片段;(3) 使用AI能精确匹配的关键词——类名、方法名、错误类型用反引号标注(如_extract_params_from_html),便于AI在代码库中精确搜索。

7.2 本项目核心收获

  1. AI辅助编程中如何做好“审查者”:AI agent生成的代码并非总是正确——初始代码包含至少6个Bug(包括2个使GUI核心功能失效的严重Bug)。我通过系统化人工测试(逐模块、逐功能点手动操作)发现其中大部分问题,AI生成的代码必须经过人工审查!!!!!!!!
  2. Bug驱动的深度学习:每个Bug都是一次深入学习——ANSI解析Bug→理解Python字符串转义机制;中止按钮Bug→掌握threading.Event跨线程通信;Bug 6→学会逐层追踪"静默失败"类缺陷的排查方法(表象与根因之间隔着stdout重定向和tkinter事件循环两个抽象层)。

7.3 工作归属汇总(注:此部分是AI agent可视化的)

模块/功能 作者 AI agent 备注
项目需求构思 CTF比赛经验
200条字典 + 50条Payload 手工搜集整理
WAF指纹(22条) ⚠️ 作者提供经验,AI agent整理
Color / HTTPClient 核心 Handler链引擎
HTTPClient工具方法 _fmt_size/_status_icon/_get_body_str 手搓
HTMLCommentParser 8类信息提取
CTFScanner五大模块 扫描逻辑
argparse CLI 完整参数体系
GUI(主题/ANSI/轮询/汇总)
递归扫描/WAF检测/缓存/Event中止 算法与架构
系统性人工功能测试 发现10+缺陷
Bug根因分析与修复代码 16+处修复
代码审查 发现隐蔽逻辑缺陷
实验报告 ⚠️ 作者撰写,AI agent进行优化(可视化增强,例如这里的工作归属

7.4 参考文献

  1. Python官方文档: urllib / concurrent.futures / tkinter / threading
  2. CTF Wiki - Web安全
  3. PayloadsAllTheThings - GitHub安全Payload集合
  4. 我的Gitee仓库

八、课程总结、感想体会与建议

课程总结

强哥教的Python课覆盖以下知识点:简单语法、序列、函数、字符串、异常处理、调试、socket通信、简单爬虫等。其中,部分知识点做了实验,完成了简易计算器、简易猜测游戏等简单程序,还有一些略有实用性的socket通信、敏感词过滤等工具。在这些工具编写中,python的“轻量化”体现得淋漓尽致:字少。

课程感悟

当初选这门课时,是在学CTF过程中发现还是需要掌握一些简单的脚本技能,而这些脚本大多都是python写的,这些脚本可以节省大量时间,便因此报了强哥久享盛誉的python课,也确实学到了不少东西,例如socket通信、爬虫,这些都是在大一上的C语言中没有接触过的东西,让我真正感受到技术应用到实际的落地的安心感。但一学期学下来,总有一种越学不会的东西越多的感觉,说明自己还是有很多很多需要了解的吧。。。
本次综合实验也把我之前很多学的东西串了起来,而且做成一个小项目还挺有成就感的。在这个小项目里,我还尝试使用了AI辅助编程,但也自己手搓了部分代码,或许这是我使用AI的一次探索吧。

课程建议

总体来讲课程节奏和内容充实度适中,形象生动、风趣幽默,看来学长学姐没推荐错~
至于建议,我是提不出来什么了,感觉已经很完美了欸。

感谢老师一学期的教导!希望以后上网络攻防的时候也能是强哥教!

posted @ 2026-06-16 15:50  Jade2000  阅读(13)  评论(0)    收藏  举报