Web安全入门必看:渗透测试课程全复盘
一、学习路线概览
整个课程按照经典的渗透测试流程展开,我也正是跟着这个节奏一步步搭建起自己的知识体系:
Web基础回顾 —— HTTP协议、请求/响应、Cookie/Session、同源策略
信息收集 —— 子域名、端口、目录、指纹,越细越能发现突破口
漏洞扫描与探测 —— 手工分析为主,工具辅助验证
常见Web漏洞详解 —— SQL注入、XSS、CSRF、SSRF、文件上传、命令注入等,每个漏洞都在本地靶场反复练习
后渗透与权限提升 —— 拿到shell后信息收集与横向移动的基本思路
报告编写 —— 怎样把发现的问题变成一份专业的渗透测试报告
下面我把每个阶段踩过的坑和总结出的干货分享出来,希望能帮你少走弯路。
二、Web基础:渗透的根基
这部分虽然枯燥,但后来才知道,HTTP协议理解不到位,连数据包都看不懂。
HTTP请求/响应:必须掌握请求方法(GET/POST/PUT)、常见状态码(200/302/403/500)、重要Header(User-Agent, Cookie, Referer, X-Forwarded-For)。我专门用 Burp Suite 的 Repeater 模块反复修改数据包,观察返回差异。
Cookie与Session机制:理解服务端如何维持会话,是后面做会话劫持、CSRF的前提。我甚至自己用Python Flask写了一个简单的登录功能来体验Session的生成与验证。
同源策略与跨域:明白了同源策略的限制,才恍然大悟为什么会有CORS配置不当、JSONP劫持等问题。这部分强烈建议动手在浏览器控制台测试。
三、信息收集:渗透的起点
课程老师反复强调:信息收集做得好,漏洞挖掘就已经成功了一半。我平时最爱用的是下面这几招:
1. 域名与IP
whois查询、DNS历史记录(用 viewdns.info 等在线站)
子域名枚举:我常备工具是 Layer 子域名挖掘机、subfinder、amass
CDN判断:多地ping(如 ping.chinaz.com),如果IP不唯一,就要找真实IP,比如查DNS历史、找子域名、甚至利用邮件服务器泄露
2. 端口与服务
快速端口扫描命令我整理成了固定套路:
【代码 语言:bash】
nmap -sS -T4 -p- target.com
nmap -sV -O -p 22,80,443,8080 target.com
【/代码】
扫描出端口后,一定要去查对应服务版本的已知漏洞。比如发现一个 OpenSSH 7.4,就去搜 Exploit-DB。
3. 目录与文件扫描
常用 dirsearch、gobuster,字典一定要自己积累,尤其是一些敏感后台和文件:
robots.txt、.git/HEAD、.DS_Store、备份文件(.bak/.swp/~结尾)
常见管理入口:admin/、manager/、phpinfo.php、test.php
有一次我在一个靶场里用 dirsearch 扫出了 .git 文件夹,然后用 GitHack 工具恢复了部分源码,直接拿到了数据库密码,那种感觉特别爽。
4. 指纹识别
浏览器装 Wappalyzer 插件,看一眼就知道网站用什么CMS、中间件。再用 WhatWeb 命令行交叉验证。一旦确定是 WordPress,马上用 wpscan 扫插件漏洞;确定是 ThinkPHP,立刻测试对应版本的RCE。
四、常见Web漏洞与实战技巧
这部分是课程的核心,每个漏洞我都在自己用 Docker 搭建的 DVWA、Pikachu、Sqli-labs 里反复练习,直到不需要看笔记就能手工利用。
4.1 SQL注入(手工+工具,附完整复盘见第六节)
手工注入的基本功必须扎实,不然完全依赖 sqlmap,环境一变就傻眼。
手工注入常规步骤:
找注入点,加单引号、双引号、反斜杠看报错
判断闭合方式,常用 ‘ or 1=1 # 测试
用 order by 猜解列数
联合查询 union select 收集数据
如果联合查询被拦截,换报错注入、布尔盲注、时间盲注
报错注入常用技巧,比如在不能回显列数时:
【代码 语言:sql】
' and extractvalue(1, concat(0x7e, database())) --+
【/代码】
布尔盲注时,我习惯用 length(database())=5 一点点判断,虽然慢,但在没有工具时很可靠。
工具 sqlmap 永远只作辅助,常用命令:
【代码 语言:bash】
sqlmap -u "http://target.com/page.php?id=1" --dbs --batch
sqlmap -u "..." -D dbname --tables --dump
【/代码】
为了绕过简单 WAF,我用过 tamper 脚本,如 space2comment、between,效果不错。
4.2 XSS跨站脚本
我把XSS分三类记住:
反射型:恶意脚本通过URL参数传入,需要诱导点击
存储型:提交到留言板、个人资料等,所有人查看即触发
DOM型:前端JS不恰当地处理URL锚点或参数
常用测试 payload:
【代码 语言:html】
<script>alert('XSS')</script><img src=x οnerrοr=alert(1)> <svg/οnlοad=alert(1)> 【/代码】 遇到过滤时,可以尝试大小写混合、双写、编码绕过。后来我学着用 BeEF 结合XSS进行更深层的利用,比如获取浏览器指纹、劫持Cookie,效果非常直观。
4.3 CSRF跨站请求伪造
CSRF 的条件必须深刻理解:用户登录站点A,同时访问了恶意站点B,站点B的代码以用户身份向A发起请求。典型的攻击场景是修改密码、转账。防御上,Referer 检查、CSRF Token、SameSite Cookie 都很关键。测试时我会先抓正常的修改密码请求,然后生成一个一模一样的表单,删除 Token 和 Referer,看看能否成功。
4.4 文件上传漏洞
文件上传是拿shell最快的方式之一。
前端验证绕过:直接抓包改后缀,或者先传允许的图片格式,再抓包改回 php。
后端黑名单绕过:尝试 php3, phtml, php. , .htaccess 等。
白名单配合解析漏洞:例如 Apache 的 a.php.bak 可能被当成PHP执行,IIS6 的 1.asp;.jpg 解析漏洞。
内容检测:制作图片马,用 copy /b 图片.jpg + 一句话.php 生成,然后上传并配合文件包含漏洞执行。
我总结的一句话木马:
【代码 语言:php】
<?php @eval($_POST['cmd']); ?>
【/代码】
上传成功后,用蚁剑连接,能执行命令、管理文件,但一定只在授权环境测试。
4.5 命令执行与代码注入
关注那些能执行系统命令的函数:system()、exec()、passthru()、popen(),以及代码注入的 eval()、assert()。命令分隔符要灵活使用:; | || &&。绕过空格可以用 ${IFS}、<、<> 等。无回显时,我用 dnslog 或者在自己的VPS上接收 curl 请求来验证命令是否执行。
4.6 SSRF服务端请求伪造
只要看到能让服务器发起URL请求的功能点(如远程图片加载、文件下载、URL跳转),我就会尝试探测内网。例如:
【代码 语言:bash】
http://127.0.0.1:22
http://127.0.0.1:6379
file:///etc/passwd
【/代码】
如果存在Redis未授权访问,配合 gopher 协议可以写入公钥或计划任务反弹shell,这招在靶场中特别有效。
五、工具总结与使用心得
我把自己常用的工具整理成了一个表格(粘贴后可手动制表或用文字描述),这里列出核心几个:
Burp Suite:渗透必备,Proxy拦截、Repeater重放、Intruder暴力破解都非常熟练。
sqlmap:自动化注入,但我坚持先手工确认注入点再上工具,并会分析其payload。
Nmap:端口和服务扫描,脚本引擎强大。
dirsearch:目录扫描,字典自定义好很重要。
蚁剑/冰蝎/哥斯拉:连接webshell,各有千秋,蚁剑简单,冰蝎流量加密。
Xray/Goby:自动化漏洞扫描,被动模式配合Burp,扫完一定要看流量的原理。
工具只是辅助,真正让我成长的,是在手工测试中一次次失败又排查的过程。
六、实战复盘:Pikachu字符型SQL注入完整过程
这个案例我录了屏,截图保留在每个步骤,这里是文字复盘。
靶场:本地 Pikachu,字符型注入(SQL Inject - String)
第1步:发现注入点
输入正常的名字vince,返回一条数据。输入vince',页面直接报 SQL 语法错误,说明输入被直接拼进查询了。这意味着这里极可能存在注入。
【插入图片:单引号报错的截图,图6】
第2步:判断闭合方式与注入可行性
尝试 payload:vince' or 1=1 #,结果返回了所有用户的记录。说明服务端的查询语句大概是:SELECT * FROM users WHERE name='$input'。我用了单引号闭合前面的字符串,or 1=1使条件永真,#注释掉后面的内容。注入确认。
第3步:获取列数
用vince' order by 2 #正常返回,vince' order by 3 #报错,说明当前查询的列数就是2。联合查询必须字段数一致,这一步不能错。
第4步:联合查询获取数据库信息
构造vince' union select database(),user() #。页面显示了两个额外字段:数据库名和当前用户。我一看,数据库是 pikachu,用户是 root@localhost。
第5步:逐层获取表名、列名、数据
继续使用联合查询,用 information_schema 来查:
获取表名:vince' union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu' #
查到 users 表。
获取列名:vince' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
得到 id, username, password。
拖数据:vince' union select group_concat(username),group_concat(password) from users #
成功拿到所有用户密码,多数是 MD5,可以直接在线解密。
第6步:整理成报告
我把每一步的截图、解释和修复建议(使用参数化查询、过滤输入)整理出来,形成一份小报告,成就感满满。
七、漏洞修复与防御思路
学渗透不能只会攻,还得会防。我把常见漏洞的防御方案汇总在这里:
SQL注入:使用参数化查询(预编译);严格过滤输入类型和长度;数据库用户最小权限;关闭错误回显。
XSS:输出编码(HTML实体编码、JS编码);使用 CSP(内容安全策略);HttpOnly 标记 Cookie。
CSRF:加入随机 Token 并验证;设置 SameSite=Strict/Lax;检查 Referer。
文件上传:使用白名单限制后缀;重命名文件;将上传目录设置为不可执行;对文件内容做二次检测。
命令注入/代码注入:禁止外部输入直接执行命令;使用白名单限制参数;禁用危险函数。
SSRF:白名单限制请求的目标地址;禁用 file、gopher 等危险协议;对内网访问做限制。
八、学习心得与建议
一定要搭建自己的靶场环境,Docker 秒搭建 DVWA、Sqli-labs、Vulhub,随时操练。
每学一个漏洞,不要只看视频,一定要亲手复现并写下详细的复现笔记(我用 Typora)。
编程能力不能丢,至少会 Python,写些小脚本批量检测或解析数据,效率翻倍。
多看安全社区(先知、FreeBuf、安全客)和 CVE,关注最新漏洞,保持敏感度。
永远对法律和道德保持敬畏,只做授权测试,法律红线绝不触碰。
九、结语与互动
Web渗透测试入门不难,但想精通没有捷径,就是靠大量实践和总结。这篇文章是我学习课程后的全盘复盘,如果对你有帮助,欢迎点赞、收藏支持。
思考与互动:
你在学习SQL注入时,是手工注入还是直接上 sqlmap?遇到过什么难忘的坑?
文件上传绕过内容检测,除了图片马还有哪些方法?
欢迎在评论区聊聊你的经验,我会每条都回复。
参考推荐:
《白帽子讲Web安全》
OWASP Top 10 2021
Vulhub漏洞靶场
PortSwigger Web Security Academy(免费在线实验)
