web安全学习笔记(七) XSS(Cross-site scripting)跨站脚本漏洞

1.XSS原理解析

HTML中,有着<script></script>标签,用于定义客户端脚本。在<script>与</script>之间输入代码,即可实现一些特殊效果。
例如,新建两个文件,xxstest.html 和 PrintSrc.php两个文件:

<form action = "PrintStr.php" method="post">
    <input type="text" name="username">
    <input type="submit" value="submit">
</form>
<?php
$name = $_POST['username'];
echo $name;

代码的含义为,在xxstest.html页面,输入一个用户名,并在PrintStr页面打印出来。比如,在xsstest.html页面输入abc
在这里插入图片描述
点击submit后,在PrintStr页面打印abc
在这里插入图片描述
但是如果我们在输入框中输入,<script>alert(/xss/)</script>时,就会触发XSS攻击:
在这里插入图片描述
在这里插入图片描述
为什么网页不会像abd那样打印<script>alert(/xss/)</script>,而是弹出了提示框呢?这是因为alert(/xss/)被包含在script标签中,标签中的内容被解析了,这就是XSS漏洞。
XSS漏洞可以分为三类,反射形XSS,储存形XSS和DOM形XSS。

2.反射形XSS

反射形XSS也称为非持久性XSS,即为用户访问一个带有XSS的URL时,服务端接收数据后处理,然后把带有XSS代码的数据发送到浏览器,造成XSS漏洞,这个过程就像一次反射,所以称为反射形XSS。
例如,修改PrintSrc.php为:

<?php
$name = $_GET['username'];
echo $name;

此时访问URL:http://192.168.85.128/PrintStr.php?username=<script>alert(/xss/)</script>
就会产生XSS漏洞。
在这里插入图片描述
那么这样的漏洞有什么危害呢?
假如a和admin都是这个网站的用户,a用户发现了这个网站存在XSS漏洞,并且构造了这样的URL:

这里构造的是打印用户的cookie,当然也可以实现将用户的cookie远程发送。
a用户构造了这条URL后,把这条URL发送给了admin用户。
http://192.168.85.128/PrintStr.php?username=%3Cscript%3Ealert(document.cookie)%3C/script%3E
若admin用户点击了这条URL,
在这里插入图片描述
则会显示admin用户的cookie信息。若script中间的代码将用户admin的cookie远程发送,那么a用户就可以使用这个cookie伪造admin用户进行登陆(这部分内容下一章进行实验)

3.存储型XSS漏洞

顾名思意,与反射型XSS漏洞不同,存储型XSS漏洞并不需要通过点击URL的形式中招,而是将部分特殊字符存储在数据库中,在加载显示的过程中,恶意代码就被解析出来了。
比如在搭建的网站中,登陆的逻辑是这样的,当我们输入用户名和密码点击登陆的时候,网站的提示我们,welcome + 用户名。
在这里插入图片描述在这里插入图片描述
经过判断,这里就有可能存在XSS漏洞,假如我们申请一个用户,用户名为<script>alert(document.cookie)</script>,密码随便填。
那么
注册完成后,对这个用户进行登陆。
在这里插入图片描述
用户正常登陆后,本应该是一个用户查询的界面,但是却显示:
在这里插入图片描述
当然,这里存在的XSS漏洞,只会对登陆的这个用户产生影响,这里讲述的目的也只是为了说明什么是存储型XSS漏洞。试想,如果一个网站的留言板存在这样的漏洞,那么如果恶意用户不断在别人的留言板中,插入恶意代码,那么所有查看自己留言板的用户cookie都会被盗取。所以存储型XSS是最危险的一种跨站脚本。

4.DOM XSS

DOM型XSS和反射型XSS相似点在于,DOM型XSS和反射型XSS都是通过构建URL来插入恶意代码。不同的是,反射型XSS是把参数交给了服务器,而DOM型的XSS是不需要与服务器端交互的,因为仅用javascript就可以重构整个html页面。这里可以对比一下,举一个简单的例子。
新建一个dom.html文件,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>dom XSS test</title>
</head>
<body>
dom test!
<script>
    var hash = location.hash.slice(1);
    document.write(decodeURI(hash));
</script>
</body>
</html>

此时,如果我们在地址栏输入:http://192.168.85.128/dom.html#%3Cscript%3Ealert(/xss/)%3C/script%3E,那么则会触发XSS漏洞:
在这里插入图片描述
这和反射型XSS有什么区别呢?我们打开burp进行抓包:
首先访问http://192.168.85.128/PrintStr.php?username=%3Cscript%3Ealert(document.cookie)%3C/script%3E
在这里插入图片描述
我们可以发现,给username传入的恶意代码参数被传送到了服务器,与服务发生了交互。
再访问http://192.168.85.128/dom.html#%3Cscript%3Ealert(/xss/)%3C/script%3E
在这里插入图片描述
我们发现#后面的内容并没有传送给服务器。
因此,DOM型XSS与反射形XSS相比有以下的优点:

  • 避开waf
  • 长度不限
  • 隐蔽性强
    这就是不同类型的XSS了!
发布了8 篇原创文章 · 获赞 10 · 访问量 4210

猜你喜欢

转载自blog.csdn.net/qycc3391/article/details/104616124