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

1.XSS原理解析

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

<input type="text" name="username"> <input type="submit" value="submit"> form>

$name = $_POST['username'];
echo $name;

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

2.反射形XSS

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


$name = $_GET['username'];
echo $name;

此时访问URL:http://192.168.85.128/PrintStr.php?username=
就会产生XSS漏洞。
web安全学习笔记(七) XSS(Cross-site scripting)跨站脚本漏洞_第3张图片
那么这样的漏洞有什么危害呢?
假如a和admin都是这个网站的用户,a用户发现了这个网站存在XSS漏洞,并且构造了这样的URL:
web安全学习笔记(七) XSS(Cross-site scripting)跨站脚本漏洞_第4张图片
这里构造的是打印用户的cookie,当然也可以实现将用户的cookie远程发送。
a用户构造了这条URL后,把这条URL发送给了admin用户。
http://192.168.85.128/PrintStr.php?username=%3Cscript%3Ealert(document.cookie)%3C/script%3E
若admin用户点击了这条URL,
web安全学习笔记(七) XSS(Cross-site scripting)跨站脚本漏洞_第5张图片
则会显示admin用户的cookie信息。若script中间的代码将用户admin的cookie远程发送,那么a用户就可以使用这个cookie伪造admin用户进行登陆(这部分内容下一章进行实验)

3.存储型XSS漏洞

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

4.DOM XSS

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


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>dom XSS testtitle>
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漏洞:
web安全学习笔记(七) XSS(Cross-site scripting)跨站脚本漏洞_第11张图片
这和反射型XSS有什么区别呢?我们打开burp进行抓包:
首先访问http://192.168.85.128/PrintStr.php?username=%3Cscript%3Ealert(document.cookie)%3C/script%3E
web安全学习笔记(七) XSS(Cross-site scripting)跨站脚本漏洞_第12张图片
我们可以发现,给username传入的恶意代码参数被传送到了服务器,与服务发生了交互。
再访问http://192.168.85.128/dom.html#%3Cscript%3Ealert(/xss/)%3C/script%3E
web安全学习笔记(七) XSS(Cross-site scripting)跨站脚本漏洞_第13张图片
我们发现#后面的内容并没有传送给服务器。
因此,DOM型XSS与反射形XSS相比有以下的优点:

  • 避开waf
  • 长度不限
  • 隐蔽性强
    这就是不同类型的XSS了!

你可能感兴趣的:(web安全学习笔记)