一、跨站脚本攻击(XSS)
1.1 漏洞简介
1.2 XSS的攻击方式
1.2.1 反射型XSS
1.2.2 存储型XSS
1.2.3 DOM型XSS
1.3 XSS危害
1.4 XSS防御
二、xss-labs通关简记
Level1
Level2
Level3
Level4
Level5
Level6
Level7
Level8
Level9
Level10
Level11
Level12
Level13
Level14
Level15
Level16
Level17
Level18
Level19
Level20
三、补充知识
3.1 <>被html实体转义绕过方法(构造特殊事件绕过)
3.2 常见新建标签绕过代码
3.3 ng-include指令
XSS又叫CSS(Cross Site Script)跨站脚本攻击,是指恶意攻击者往web页面中插入恶意代码,当用户浏览该网页时,嵌入其中的恶意代码会被执行,从而达到恶意的特殊目的。XSS属于被动式的攻击。
XSS最大的特点就是能注入恶意的HTML/JavaScript代码到用户浏览的网页上,从而达到劫持用户会话的目的。由于HTML代码和客户端JavaScript脚本能在受害者主机上的浏览器任意执行,这样等同于完全控制了Web客户端的逻辑,在这个基础上,黑客或攻击者可以轻易地发动各种各样的攻击。xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有: echo printf print print_r sprintf die var-dump var_export。
反射性XSS又称为非持久型XSS,攻击者需要通过诱使用户点击包含XSS攻击代码的恶意链接,然后用户浏览器执行恶意代码触发XSS漏洞。常见的就是在URL中构造,将恶意链接发送给目标用户。当用户访问该链接时候,会向服务器发起一个GET请求来提交带有恶意代码的链接。在浏览器中解析,一般情况下,反射性XSS存在于搜索框。通过url控制页面的输出。将参数传入服务器,再又服务器输出出来。
存储型XSS又称持久化型XSS,此类XSS的代码是存储在服务器数据库中的,如在个人信息或发表文章等地方,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie。
基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分,也就是web server不参与,仅仅涉及到浏览器的XSS。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。一般是浏览器前端代码进行处理。
DOM型XSS主要是由客户端的脚本通过DOM动态地输出数据到页面,而不是依赖于将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行。
(1)盗取管理员cookie
窃取用户的cookie非法登录,使得入侵者具有恶意操纵后台数据的能力,包括读取、更改、添加、删除一些信息。
(2)网站挂马。
先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该挂马页面时,用户的计算机会被植入木马。
(3)发送广告或者垃圾信息
攻击者可以利用XSS漏洞植入广告,或者发送垃圾信息,严重影响到用户的正常使用。
(1)对输入(和URL参数)进行过滤、转义编码等
(2)对输出进行编码
(3)在服务器端对 Cookie 设置了HttpOnly 属性,那么js脚本就不能读取到cookie
(4)使用XSS Filter。XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果。XSS Filter作为防御跨站攻击的主要手段之一,已经广泛应用在各类Web系统之中,包括现今的许多应用软件,例如IE8浏览器,通过加入 XSS Filter功能可以有效防范所有非持久型的XSS攻击。
绕过方法:直接注入
payload:
绕过方法:提前闭合绕过(">闭合)
原理分析:查看源代码,提前闭合value值即可,根据其形式,可用">闭合
payload:
">//
绕过方法:提前闭合('闭合) + 特殊事件
原理分析:利用level2的payload,查看源代码发现"和<>被转换成了html实体,那么原有的js代码就不会被当做执行。此时就需要绕开使用新标签(即避免使用<>),同时还要提前闭合(用')
payload:
' onclick = 'javascript:alert(1)'//
绕过方法:提前闭合("闭合) + 特殊事件
原理分析:将level3的单引号闭合换成双引号闭合即可
payload:
" onclick = 'javascript:alert(1)'//
绕过方法:提前闭合(">闭合) + 新建标签
原理分析:对其进行注入,发现过滤了script、onclick等关键词,并且双写,大小写也无法绕过。此时可以通过构造a标签绕过
payload:
"> xss //
绕过方法:提前闭合(">闭合) + 新建标签 + 大小写
原理分析:利用level5的payload,发现在过滤了script、onclick等关键字的基础上又对href关键字进行过滤(使用“_”分开),此时可以尝试使用大小写绕过
payload:
"> xss //
绕过方法:提前闭合(">闭合) + 双写
原理分析:尝试注入">,发现script等关键词被过滤删除,尝试双写绕过,发现成功
payload:
">
alert(1)
绕过方法:Unicode编码(Unicode转ASCII)
原理分析:利用上一关payload进行测试,发现输入的语句被插入到标签的href属性中,并且对script等关键词进行了破坏使其失去原有含义,根据level6的经验,标签以及href属性已经存在,故只需要插入javascript:alert(1)语句即可,但script关键词被破坏,所以在此要对插入的语句进行Unicode编码绕过
payload:
javascript:alert(1)
绕过方法:合法链接 + Unicode编码
原理分析:利用上一关的payload,发现提示链接不合法,因此这里要输入合法的链接。尝试输入合法链接,并在链接前后做手脚,发现可以通过验证(注意这里只能添加http协议的链接),但是发现其对script等关键词进行了破坏,因此对关键语句进行Unicode编码绕过。
payload:
javascript:alert(1)//http://www.baidu.com(链接前的//是为了防止跳转到链接网站)
绕过方法:隐藏属性 + 特殊事件
原理分析:注入语句"<> script onclick进行观察,发现其对"和<>进行了转义,同时发现还有三个隐藏的input,设置其属性type使其不再隐藏(在url链接后分别添加以下语句,看哪一个可以显示输入框:t_link=" type='text'>、t_history=" type='text'>、t_sort=" type='text'>),找到可用的标签参数,经过尝试发现t_sort可用
payload:
t_sort=" type='text' onclick="alert(1)>
绕过方法:Referer注入
原理分析:注入语句"<> script onclick进行观察,发现其对"和<>进行了转义,同时发现还有四个隐藏的input,构造语句对其进行检查(t_link=" type='text'>//&t_history=" type='text'>//&t_sort=" type='text'>//&t_ref=" type='text'>//),发现无回显,查看网页源码,发现t_sort接收了参数值,但是对双引号进行了html编码,导致无法闭合。分析数据报发现没有referer字段,此时进行抓包,构造并添加referer进行注入,发现可以成功对t_sort进行传参,实现绕过
payload:
referer:" type='text' onclick='javascript:alert(1)'>//
绕过方法:UA注入
原理分析:注入语句"<> script onclick进行观察,发现其对"和<>进行了转义,同时发现还有四个隐藏的input,并且发现t_ua参数的value字段为user-agent字段内容,所以在此尝试UA注入绕过
payload:
User-Agent:" type='text' onclick='javascript:alert(1)'>//
绕过方法:Cookie注入
原理分析:注入语句"<> script onclick进行观察,发现其对"和<>进行了转义,同时发现还有四个隐藏的input,并且发现t_cook参数的value字段为有内容提示,所以在此尝试cookie注入绕过,并且成功
payload:
Cookie:user=" type='text' onclick='javascript:alert(1)'>//
题目有问题
绕过方法:标签
原理分析:注入语句"<> script onclick进行观察,发现其对"和<>进行了转义编码,并且有一个ng-include指令,其相当于php的include函数。结果分析以及src=1.gif这一提示,可以尝试使用标签进行绕过
payload:
src='level1.php?name='
(这里我们不是单纯的去包含level1.php,而是在后面添加了name参数值。这就有点像是在访问了该参数值中地址之后把它响应在浏览器端的html文件给包含进来的意思)
绕过方法:回车 + url编码 + 无需闭合的标签
原理分析:注入语句"> script onclick进行观察,发现其将空格、/、script都替换成了 ,则经典script语句以及需要闭合的标签(需要/的,如)无法使用,因为是center标签所以无法使用特殊事件,所以综合考虑尝试插入无需闭合的标签,如、等,其中空格可以使用回车绕过,回车的url编码为%0a
payload:
、
绕过方法:标签 + 特殊事件
原理分析:注入语句"> script onclick进行观察,发现引号和<>都被过滤编码,发现有一个新的标签
payload:
123%20onmouseover=alert(%27xss%27)
同level17
Level19和Level20均为flash xss,需要反编译
(1)onclick = 'javascript:alert(1)':点击元素(即输入框)时界面触发执行js代码
(2)onfocus = 'javascript:alert(1)':当input框获取焦点时执行js代码
(3)onmouseup = 'javascript:alert(1)':当点击输入框并松开鼠标时触发执行js代码
(4)onblur = 'javascript:alert(1)':点击输入框并离开时触发执行js代码
(5)onmouseover= 'javascript:alert(1)':鼠标移动到该标签时触发
注:以上常见特殊事件js代码还可写成如下形式:onclick =alert(1)
(1)xss
(2)
(3)
(5):页面载入完毕后执行js代码
(6):图片加载失败触发
(7)
(1)ng-include 指令用于包含外部的 HTML文件。
(2)包含的内容将作为指定元素的子节点。
(3)ng-include属性的值可以是一个表达式,返回一个文件名。
(4)默认情况下,包含的文件需要包含在同一个域名下。
特别值得注意的几点如下:
(1)ng-include,如果单纯指定地址,必须要加引号
(2)ng-include,加载外部html,script标签中的内容不执行
(3)ng-include,加载外部html中含有style标签样式可以识别