Web渗透实操后的零碎理解
Web渗透实操后的零碎理解前言最近一周跟着教程做了几个基础实验用 tcpdump Wireshark 抓 HTTP 明文流量用 Burp Suite 做 HTTPS 中间人抓包搭建 DVWA 靶场SQL 注入实战操作步骤倒是跟下来了但很多概念当时只是照着做没真正理解是怎么回事。后来查了些资料算是把之前模模糊糊的地方稍微理清了一点记录一下。声明这不是什么完整的技术科普就是个人学习笔记理解得很浅可能还有不准确的地方。一、Burp Suite - 我用的那个拦截器当时怎么用的在 HTTPS 抓包实验中我按照教程配置 Firefox 代理到127.0.0.1:8080访问http://burpsuite下载 CA 证书并安装访问百度Burp 的 HTTP history 里立刻就能看到所有 HTTPS 请求的明文内容开启 Intercept 模式可以实时拦截请求修改参数后再转发当时觉得很神奇明明是 HTTPS 加密的Burp 怎么就能看到明文现在理解到的专业说法Burp Suite是个HTTP代理工具Intercepting Proxy可以做中间人攻击Man-in-the-Middle。通俗理解就像快递中转站你寄的包裹数据包必须先经过它它能拆开看、能改里面的东西再寄出去。浏览器以为在和网站直接通信其实中间被Burp监听了。HTTPS怎么也能看到这是我最困惑的地方。后来查资料才明白HTTPS 虽然加密但 Burp 装了 CA 证书后浏览器会信任它Burp 和浏览器建立一个加密连接用 Burp 的证书Burp 再和服务器建立另一个加密连接用服务器的证书两段连接的中间Burp 能看到明文浏览器 ←(TLS加密)→ Burp ←(TLS加密)→ 真实服务器 ↑ Burp在这里解密查看相当于快递站有万能钥匙能打开你的加密包裹看完再重新锁上寄出去。我用到的模块Proxy代理拦截请求让我手动查看和修改。实验中用这个看到了百度的 Cookie、请求头等信息Repeater重放器把同一个请求反复发送测试比如 DVWA SQL注入实验时我在这里反复测试不同的注入语句Intruder入侵者没用过看介绍是批量自动测试像是把密码字典里的10000个密码自动都试一遍工作原理正常流程 浏览器 → → → → → → 网站服务器 使用Burp 浏览器 → Burp(8080端口) → 网站服务器 ↑ 可以拦截、查看、修改和 Wireshark 的区别Wireshark在网络层抓包HTTP 明文能看到HTTPS 看到的是加密数据Burp在应用层做代理安装证书后 HTTPS 也能看到明文tcpdump命令行版的 Wireshark保存 pcap 文件后再用 Wireshark 打开分析二、SQL注入 - 让数据库听错话当时怎么操作的在 DVWA 靶场的 SQL Injection 模块输入框里填1显示 ID1 的用户信息admin改成1页面报 SQL 错误说明有注入点输入1 OR 11--注意最后有空格成功显示了所有用户用1 UNION SELECT null,version()--查到了数据库版本是 MySQL 5.7.26用1 UNION SELECT null,database()--查到当前数据库名是 dvwa当时只知道照着教程输入这些咒语不太明白为什么要这样写。现在理解到的专业说法SQL注入SQL Injection是代码注入攻击通过在输入里插入SQL代码片段改变原本查询的语义。通俗理解正常情况 老板对仓库管理员说给我拿5号货物 管理员照做 SQL注入 我说给我拿5号货物或者把所有货物都给我 管理员傻傻地全给了原理剖析后端PHP代码DVWA Low级别我点View Source看到的$id$_REQUEST[id];$querySELECT first_name, last_name FROM users WHERE user_id $id;;$resultmysqli_query($GLOBALS[___mysqli_ston],$query);正常输入输入1 生成SQLSELECT first_name, last_name FROM users WHERE user_id 1;注入攻击输入1 OR 11-- 生成SQLSELECT first_name, last_name FROM users WHERE user_id 1 OR 11--; ↑ 这个引号被注释掉了关键点提前关闭了字符串OR 11永远为真绕过了查询条件相当于或者天是蓝的--是SQL注释符注意后面要有空格把后面多余的引号注释掉最终查询变成查询 ID1 或者 11 的用户因为 11 永远成立返回了所有用户实验中遇到的几种注入1. 联合注入UNION-based当时用的1 UNION SELECT null,version()--效果页面显示了数据库版本 MySQL 5.7.26原理-- 原始查询返回 first_name, last_name2列SELECTfirst_name,last_nameFROMusersWHEREuser_id1-- UNION 把两个查询结果合并UNIONSELECTnull,version()通俗说本来只让你查用户信息你偷偷加了句顺便把数据库版本也查出来两个结果一起显示。关键点UNION 前后两个查询的列数必须相同都是2列null用来占位第一列version()返回版本号显示在第二列2. 布尔盲注Boolean-based Blind页面不显示具体数据只能看对错没在实验中用到但查资料了解到了 AND SUBSTRING(database(),1,1)d-- 页面正常显示说明数据库名第一个字符是d ANDSUBSTRING(database(),1,1)a-- 页面报错说明不是a通俗说像玩猜字游戏一个个试出来。3. 时间盲注Time-based Blind连对错都看不出来只能靠响应时间 AND IF(SUBSTRING(database(),1,1)d,SLEEP(5),0)--如果延迟5秒说明第一个字符是d。通俗说让系统如果答案是A就等5秒再回复通过回复快慢判断。4. 实验中踩的坑第一次输入1 OR 11--报错后来发现--后面必须有空格试 UNION 注入时一开始不知道要几列UNION SELECT 1,2,3报错改成UNION SELECT 1,2才成功查资料才知道可以用ORDER BY来判断列数1 ORDER BY 3--报错说明少于3列三、PHP - 实验环境里改的那些配置当时的情况搭建 DVWA 靶场时跟着教程用 PhpStudy 搭建环境选它是因为中文界面友好修改了php.ini配置文件把几个选项改成On修改config.inc.php配置数据库账号密码代码里看到 PHP 直接把用户输入拼到 SQL 语句里当时只知道照着教程改不太明白为什么要这样改也不清楚 PHP 为什么这么容易出问题。现在理解到的专业说法PHP是服务器端脚本语言弱类型变量类型不严格、语法宽松容易写出不安全的代码。工作流程1. 用户访问 login.php 2. 服务器执行PHP代码 3. PHP连接数据库、验证用户、生成HTML 4. 服务器把HTML发给浏览器 5. 浏览器显示页面看不到PHP源代码通俗说客户端语言JavaScript菜单上的菜顾客浏览器自己看服务器端语言PHP后厨的配方顾客看不到厨师服务器按配方做好菜端出来为什么容易出漏洞1. 直接拼接用户输入// 危险写法实验里见到的$id$_GET[id];$sqlSELECT * FROM users WHERE id $id;2. 弱类型系统$id$_GET[id];// 可能是 1 OR 11// PHP不会强制检查类型3. 超全局变量$_GET// URL参数$_POST// 表单数据$_COOKIE// Cookie这些都是用户可控的直接用很危险。实验里改的那些配置搭建靶场时改了php.ini现在查了资料才知道是什么意思; 显示所有错误方便看到SQL报错信息生产环境绝对不能开 display_errors On error_reporting E_ALL ; 允许远程文件包含危险方便演示文件包含漏洞 allow_url_fopen On allow_url_include On ; 禁用某些危险函数生产环境应该禁用实验环境为了演示开着 disable_functions 通俗说这些配置是故意把安全门打开让漏洞更明显方便学习。真实环境绝对不能这样配置。为什么要改这些display_errors On让 SQL 注入时能看到错误信息“You have an error in your SQL syntax”方便判断注入点allow_url_include OnDVWA 的某些漏洞模块如文件包含需要这个开启才能演示disable_functions 留空表示不禁用任何函数命令注入模块才能执行shell_exec()等函数DVWA 数据库配置config.inc.php$_DVWA[db_user]dvwa;$_DVWA[db_password]dvwa123;$_DVWA[db_database]dvwa;安全的写法后来查到的DVWA Impossible 级别的代码点 View Source 看到的// 先验证输入是否为数字if(is_numeric($id)){// 使用预处理语句$data$db-prepare(SELECT first_name, last_name FROM users WHERE user_id (:id) LIMIT 1;);$data-bindParam(:id,$id,PDO::PARAM_INT);$data-execute();}关键思路输入验证is_numeric($id)检查是否为数字不是数字直接拒绝预处理语句用prepare()和bindParam()先告诉数据库我要查ID是某个数的人数据和代码分离数据库准备好后再把用户输入当纯数据传进去这样无论用户输入什么奇怪字符1 OR 11--都只会被当成普通字符串不会被当成 SQL 命令执行。对比// ❌ 危险写法DVWA Low级别$querySELECT * FROM users WHERE id $id;// ✅ 安全写法DVWA Impossible级别$stmt$db-prepare(SELECT * FROM users WHERE id :id);$stmt-bindParam(:id,$id,PDO::PARAM_INT);其他常见漏洞实验没涉及但了解到的命令注入Command InjectionDVWA 里也有这个模块原理和 SQL 注入类似// 不安全DVWA Low级别$target$_REQUEST[ip];$cmdshell_exec(ping .$target);// 攻击127.0.0.1 whoami// 执行ping 127.0.0.1 whoami先ping再执行whoami文件上传漏洞// 不安全move_uploaded_file($_FILES[avatar][tmp_name],uploads/.$_FILES[avatar][name]);// 可以上传shell.php直接执行任意代码XSS跨站脚本// 不安全echoHello, .$_GET[name];// 访问?namescriptalert(XSS)/script这些在 DVWA 里都有对应模块但我还没试先把 SQL 注入弄明白了。四、三者关系总结工具/技术在攻击链中的作用我的实验场景通俗比喻Burp Suite拦截和修改HTTP请求HTTPS 抓包实验拦截百度的加密流量查看明文 Cookie快递中转站能拆包、改货SQL注入破坏SQL语句结构执行恶意查询DVWA 实验1 OR 11--绕过查询显示所有用户在填空题里写或者把答案告诉我PHP漏洞后端代码不安全直接拼接用户输入DVWA 源码$query ... WHERE id $id;直接拼接门卫不查证件就放人进来完整攻击链假设配合使用Burp拦截请求 → 发现输入点 → 插入SQL注入代码 → PHP未过滤直接拼接 → 数据库执行恶意SQL → 数据泄露我的实验里是分开做的HTTP/HTTPS 抓包用 tcpdump Wireshark 看 HTTP 明文用 Burp 看 HTTPS 明文DVWA 搭建PhpStudy 环境配置 php.ini创建数据库SQL 注入直接在 DVWA 页面测试没用 Burp五、防御方法简单了解1. 预处理语句最重要$stmt$pdo-prepare(SELECT * FROM users WHERE id ?);$stmt-execute([$user_input]);数据和代码分离用户输入不参与SQL语法解析。DVWA Impossible 级别就是这样写的查看源码学到的。2. 输入验证if(is_numeric($id)){// 只有是数字才执行查询}白名单 vs 黑名单❌ 黑名单禁止、--、UNION等容易被绕过比如双写UNI/**/ON✅ 白名单只允许数字、字母更安全3. 最小权限数据库账号只给 SELECT 权限不给 DROP 权限就算被注入也删不了表。DVWA 配置时创建的dvwa用户应该也是这个道理虽然实验环境没严格限制。4. WAFWeb应用防火墙在请求到达服务器前先检测是否包含SQL注入特征有的话直接拦截。查资料时看到的真实网站会用但实验环境没涉及。5. 安全的php.ini配置; 禁用危险函数 disable_functions exec,passthru,shell_exec,system ; 隐藏PHP版本 expose_php Off ; 禁止显示错误防止泄露SQL语句 display_errors Off log_errors On ; 禁用远程文件包含 allow_url_fopen Off allow_url_include Off这些和我搭建 DVWA 时改的配置正好相反因为靶场要故意暴露漏洞。个人总结通过这一周的实验和查资料算是把之前照着做的步骤背后的原理稍微弄明白了一点Burp是工具让我能看到和修改平时看不到的HTTP数据包包括HTTPS加密的SQL注入是技巧通过特殊输入破坏SQL语句的结构PHP漏洞是根源因为代码写得不安全、配置不当才能被利用最核心的一句话永远不要相信用户输入。实验收获Wireshark vs Burp 的区别前者抓网络层后者做应用层代理SQL注入的本质字符串拼接 没验证 代码注入查看源码很重要DVWA 每个漏洞都能看源码对比 Low 和 Impossible 级别学到很多这只是初学者的浅薄理解很多细节还不清楚比如二次注入、宽字节注入、NoSQL注入之类的高级技巧后面慢慢学吧。参考资源我用过的教程和工具DVWA 靶场https://github.com/digininja/DVWABurp Suite Communityhttps://portswigger.net/burp/communitydownloadPhpStudyhttps://www.xp.cn/Wiresharkhttps://www.wireshark.org/查资料时看的文章OWASP SQL注入https://owasp.org/www-community/attacks/SQL_InjectionBurp Suite官方文档各种博客和教程以上内容纯属个人学习笔记记录了2026年7月这一周的实验过程和理解可能存在偏差欢迎指正。实验环境系统Windows 10工具PhpStudy Pro、Burp Suite、Wireshark、tcpdump、Kali Linux 虚拟机、Windows10虚拟机靶场DVWA访问地址http://dvwa:8898/