文章目录
- 1、XSS概述
- 2、实战
-
- [2.1 反射型XSS(get)](#2.1 反射型XSS(get))
- [2.2 反射型XSS(POST型)](#2.2 反射型XSS(POST型))
- [2.3 存储型XSS](#2.3 存储型XSS)
- [2.4 DOM型XSS](#2.4 DOM型XSS)
- [2.5 DOM型XSS-X](#2.5 DOM型XSS-X)
- [2.6 XSS之盲打](#2.6 XSS之盲打)
- [2.7 XSS之过滤](#2.7 XSS之过滤)
- [2.8 XSS之htmlspecialchars](#2.8 XSS之htmlspecialchars)
- [2.9 XSS之href输出](#2.9 XSS之href输出)
- [2.10 XSS之JS输出](#2.10 XSS之JS输出)
1、XSS概述
Cross-Site Scripting 简称为"CSS",为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
- 反射性XSS;
- 存储型XSS;
- DOM型XSS;
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致"精心构造"的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此,在XSS漏洞的防范上,一般会采用对输入进行过滤 和输出进行转义的方式进行处理:
- 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
- 输出转义:根据输出点的位置对输出到前端的内容进行适当转义。
2、实战
2.1 反射型XSS(get)
(1)j既然已经提示这题属于反射型XSS,直接上payload:<script>alert("XSS")</script>
;
发现:payload被截断了。查看前端源码:
输入框有长度限制,那么我们直接Burp进行抓包,修改数据包试试:
payload:http://192.168.92.1:32769/vul/xss/xss_reflected_get.php?message=%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%58%53%53%22%29%3c%2f%73%63%72%69%70%74%3e&submit=submit
2.2 反射型XSS(POST型)
(1)首先使用用户名和密码进行登录;
(2)这一题跟前一题差不多,直接在输入框中上payload:<script>alert(document.cookie)</script>
2.3 存储型XSS
(1)首先在留言板中输入一些特殊的字符串,发现并没有过滤:
(2)跟前面一样,直接上payload:<script>alert(document.cookie)<script>
与反射型XSS不同的是,存储型XSS会使每访问一次页面,页面都会弹框。
2.4 DOM型XSS
DOM型XSS和反射型XSS、存储型XSS的区别在于:DOM型不用将恶意脚本传输到服务器在返回客户端,而后两种恶意脚本都会经过服务器端然后返回给客户端。
对于浏览器来说,DOM文档就是一份XML文档,通过JavaScript就可以轻松的访问DOM文档。下面举例一个DOM将HTML代码转化成树状结构:
html
<html>
<head>
<meta charset="gbk" />
<title> TEST </title>
</head>
<body>
<p>The is p.<p>
<h1>Product:</h1>
<ul>
<li>Apple</li>
<li>Pear</li>
<li>Corn</li>
</ul>
</body>
</html>
转化成模型如下图:
通过这种简单的树状结构,就能把元素之间的关系简单明晰的表示出来,方便客户端的JavaScript脚本通过DOM动态的检查和修改页面内容,不依赖服务端的数据。
(1)在搜索框中随便输入12
,页面回显"what do you see?"。
(2)查看页面源代码:
大意:点击"click me!"按钮,会执行domxss()函数,变量str的值为输入框中的内容,然后将str的值与<a href='
和'>what do you see?</a>
进行拼接。
我们只需要闭合a
标签,就可以使得payload执行。构造payload:'><img src="#" onmouseover="alert('xss')">
。
注意,不能再
script
标签下再嵌套script
标签,故换一个payload,当鼠标移动到图片的的地方,就会弹窗。
2.5 DOM型XSS-X
查看源码;
关于window.location.search
就是URL中?
后面的字母,具体如下:
然后经过切分、替换,将str的值与<a href='
和'>就让往事都随风,都随风吧</a>
进行拼接。构造payload:'><img src="#" onmouseover="alert('xss')">
。
需要点击有些费尽心机想要忘记的事情,后来真的就忘掉了
之后,在将鼠标移动到图片处,才会弹框。
2.6 XSS之盲打
xss盲打是一种攻击场景,我们输出的payload不会在前端进行输出,当管理员查看我们的留言时就会遭到xss攻击。
输入常规的payload:<script>alert(/xss/)</script>
,登录后台地址去看看(/xssblind/admin_login.php
)。
2.7 XSS之过滤
绕过过滤的方法:
- 前端限制绕过,直接抓包重放,或者修改html前端代码
- 大小写,比如:
<SCRIPT>aLeRT(111)</sCRIpt>
- 拼凑:
<scri<script>pt>alert(111)</scri</script> pt>
- 使用注释进行干扰:
<scri<!--test-->pt>alert(111)</sc <!--test--> ript>
- 使用其他的标签,绕过script标签,如:
<img src="#" onmouseover="alert('xss')">
这里使用payload:<img src="#" onmouseover="alert('xss')">
2.8 XSS之htmlspecialchars
htmlspecialchars()
函数是php常用方法,是把预定义的字符转换为HTML实体。其语法:htmlspecialchars(string,flags,character-set,double_encode)
常见的预定义的字符有:
&
(和号)成为&
"
(双引号)成为"
′
(单引号)成为'
<
(小于)成为<
>
(大于)成为>
输入" ' > <
之后,发现除了单引号没被转化外,其他都被转化为HTML实体了。
故,构造payload:#' onclick='alert(/xss/)
,前一个引号闭合href
属性,第二个引号闭合onclick
属性。
2.9 XSS之href输出
在输入框中输入<script>alert('xss')</script>
,打开源代码,发现均被HTML实体化了,闭合标签和闭合属性的方法行不通了。
关于<a>
标签的href
属性:
<a> 标签的 href 属性用于指定超链接目标的 URL。href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 <a> 标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。
总而言之,在a标签的href属性里面,可以使用javascript协议 来执行js,可以尝试使用伪协议绕过。构造payload:javascript:alert(/xss/)
。
注意:
alert
中字符串需要用"、' or /
包含,数字不用。
2.10 XSS之JS输出
输入<script>alert('xss')</script>
,发现不行,打开源代码,可以看到payload被带到script
标签里去了。
构造payload:';alert(1);//
,';
闭合掉当前的语句,然后插入新语句,然后再用//
注释掉老语句遗留下来的';
。