Web安全-XSS

0x01 简介

 

XSS(Cross-site script),跨站脚本,为了避免和CSS混淆,简写为XSS。

Web安全-XSS_第1张图片

XSS两个条件

  • 用户的输入作为html进行显示或直接在JS中进行处理
  • 未对用户的输入进行校验、编码

XSS分类

  • 反射XSS(Reflected XSS,非持久型)

引用Webgoat上图 ,比较清晰。

恶意用户发现xss注入点,构造包含恶意代码的链接,通过一些手段使用户点击链接并请求服务器,服务器返回并在浏览器执行恶意代码(js)。攻击者达到获取相关信息等目的。

反射XSS是一次性的,利用一些社工手段效果惊人,比如垃圾邮件、小广告等。

 

Web安全-XSS_第2张图片

  • 存储XSS(Stored XSS,持久型)

和反射XSS相同的是,请求都经过Server端,区别在于XSS payload 存储在服务端(文件、DB等)。当用户访问注入XSS的页面,脚本执行。

存储XSS受害范围更大,常见博客、评论等功能点。

  • Dom XSS(非持久型)

DOM(Document object model),JS可操作DOM动态更新文档的内容、结构和样式。

基于DOM的XSS是基于反射XSS的另一种形式。 这两者都是通过发送一个带有反映到浏览器的输入的链接来触发的。 

和反射XSS的区别在于,Payload不需要到达服务端,只在客户端处理。

DOM XSS相对比较少见,工作中几乎没遇到过。查了下乌云上漏洞,还是有一些,列举几个供扩展阅读。

中国农业银行主站DOM-XSS

优酷分享iframe播放器页面存在dom xss漏洞

国泰证券某站SQL注入&DOM XSS(泄露客户敏感信息)

0x02 漏洞危害

  • 盗取用户Cookie

通过盗取用户cookie实现会话劫持,httponly无效;

  • 构造Get/Post请求执行恶意操作

js可提交请求,所以通过xss漏洞构造get/post请求完成一些操作,比如修改数据、删除数据、获取信息等。

  • XSS钓鱼

伪造登录表单,获取用户凭证信息

  • 内网入侵

扩展阅读:https://www.freebuf.com/articles/web/103097.html

  • XSS蠕虫

XSS蠕虫是一种借助Ajax技术实现对Web应用程序中存在的XSS漏洞进行自动化利用传播的蠕虫病毒,它可以将一些用户数据信息发送给Web应用程序然后再将自身代码传递进入Web应用程序,等到被感染用户访问Web应用程序时,蠕虫自身将又开始进行数据发送感染。

百度空间XSS蠕虫

XSS因为执行JS脚本,危害较大,但是也看具体的漏洞环境,有一些较好的攻击平台可利用(如 BeEF)。

0x03 漏洞检测

常见注入点

  • 搜索框,回显key
  • 输入框,回显用户信息
  • 错误返回,回显用户输入
  • 隐藏html元素,回显用户输入
  • 评论、博客等
  • 其他用户输入可回显的点

注意一点,这里说的输入不单单至用户通过输入框填写的数据,也包含下拉框、选择框等交互的地方,任何从客户端发往服务器的数据如果在服务器回显,都有可能造成xss问题。

常用Payload

列举典型的几个插入点,详细看后文附件。

  • 在script注入

  • html标签

直接插入script,其他常用的如img、svg,常用js事件函数onload、onclick、onmouseover等

 




 
  • html标签属性

单引号、双引号闭合标签属性,插入js时间函数

 

’ onload=javascript:alert('xss')
  • JS中

分号阻断,直接写js

 

;alert('xss')
  • CSS属性

 

 //background
//background image
//expression

常用工具

商用Web扫描器,如Webinspect、AppScan、AWVS,代码扫描工具,如Fortify、Checkmarx、Coverity都可以覆盖XSS扫描。

商业工具覆盖漏洞广,黑盒工具使用时注意提供完整的流量(请求地址、参数)避免漏扫。

工具扫描,逃避不了的一个问题,误报。

除了Web扫描器,一些XSS平台、XSS fuzzing工具可以利用,详细参考文末链接。

关于绕过

XSS本身就可以写一本书,一方面因为玩的就是Html、JS、浏览器,导致千变万化甚至千奇百怪的Payload,另一方面就是绕过技巧了。

为什么这么多绕过技巧?

说一个遇到的很好玩的故事。一般报告中,XSS通过弹窗做poc,给出修复建议。有一次就遇到一个非常可爱的开发,黑名单过滤了alert关键字。What?这不是跟没做一样么,何况实际利用,一般也不alert弹窗了吧(不排除会弹窗通过社工重定向进行其他利用)。多么可爱的开发。

不闲扯了,列举常见的一些绕过技巧,重在记录思路。详细的绕过可以 RSnake's: "XSS Cheat Sheet",Freebuf也有牛人做了翻译的中文版本,参考文末列表。

  • 大小写、大小写混合绕过

 


  • 空格、换行绕过

 


  • 注释符绕过
  // 隔断,绕过关键字
​
 
  • 双尖括号绕过

 

<
  • 无分号、引号绕过

 


  • URL编码

http get参数,对特殊字符过滤,使用URL编码绕过,也可以直接URL全编码

 


%3CIMG%20SRC%3Djavascript%3Aalert%28%27XSS%27%29%3E
  • Html实体编码

html实体编码本身存在的意义是防止与HTML本身语义标记的冲突

html中正常情况只识别:html10进制,html16进制。

回显输出在html中,过滤了script < > / \ http: 等特殊字符

 


  • JS编码

JS提供了四种字符编码的策略:

三个八进制数字,如果数字不够,在前面补零,如a的编码为\141

两个十六进制数字,如果数字不够,在前面补零,如a的编码为\x61

四个十六进制数字,如果数字不够,在前面补零,如a的编码为\u0061

对于一些控制字符,使用特殊的C类型的转义风格,如\n和\r

当输入内容回显在js中,过滤了特殊字符<> ' " & %等

关于编码绕过,可是试试chrome扩展xss encode和JsFuck,非常神器。

 

  • base64编码