XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,所以缩写为XSS。
攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览改页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如 cookie窃取、盗取密码等。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
通常被分为三类:反射型xss、存储型xss、dom型xss
其中存储型xss的危害是持续的
dom型、反射型:
此处我们以pikachu靶场为例子:
输入恶意代码一次就进行执行一次。
dom型与反射型其实并没有太大差别,只是反射型的话参数是有流到后端的,但是dom型是直接使用页面中的JS代码进行回显。
下图为pikachu靶场的dom型xss漏洞网页源码,可以看到显示操作是由JS做的。
存储型
存储型和上述的两种类型其实是比较大的,他的payload是长期存在的,因此危害也比较大。
如某个网页的留言板
我们提交一串攻击代码
接着每次浏览这个留言板都会执行一次上面JS代码
这不就是钓鱼的一种方法吗....
大概的原理
如下图的php代码
这个代码接收用户发来的参数,然后直接输出。
那么客户端就可以构造恶意代码对其xss进行攻击。反射型xss还好,但是如果是存储型xss,因为他会长期存在,每个浏览到存在恶意代码攻击页面的人都会有危险。
练习: xss-labs其实更注重的是如何去绕过后端可能存在的过滤
xss-labs 1-7
level-1
发现页面可以显示url中name的值,所以可以直接将name后面的值改为payload
payload:<script>alert(1)</script>即可通关
level-2
发现页面中含有与输入相同的值,但是输入payload却不行,所以需要查看一下页面代码
发现输入的值传回后端程序并且被做了处理,变成了如下模样
但是可以通过闭合前面value的值,和input表单来执行JS代码
payload:"><script>alert(1)<script>
htmlspecialchars()函数对keyword参数的值进行了处理
level3
输入前两关的payload发现都不行,查看源码发现后端程序对两处输出参数都进行了处理
那么在这关就需要使用到input标签的一些出发事件的属性了
payload:?keyword=' οnfοcus=javascript:alert(111)_
注意:最后还要有个空格(我用下划线代替)
如果没有空格alert无法执行
level4:
第四关与第三关一样,只是闭合方式不一样,首先查看网页源码
payload:?keyword=" οnfοcus=javascript:alert(111)_
把单引号改为双引号就好了
level-5:
在这个关卡使用前几个关卡的payload发现他将h2标签符号换成 了html实体
而且还对on和script这个,关键字进行了过滤处理:
但是却没有对input表单的value值中的符号进行过滤,
无法使用前面的关卡的payload了
那么此时可以使用a标签构造payload
payload:" > <a href:javascript:alert(1)>xss</a>
点击一下连接
成功
level-6:
这个关卡在level-5的基础上将href 这个关键字也进行了过滤
所以此时可以尝试使用大小写混用来进行绕过
payload:①" Onfocus=javascript:alert(1)
②" > <a Href:javascript:alert(1)>xss</a>
当然之前一些被过滤的关键词的payload此时也可以都拿出来试试,大小写混用即可
level-7:
这关我打算一步一步试探
我在输入框里面输入了一个script关键词,然后查看源码
发现表单中的value是空的,所以大概可以判定这关可以使用双写绕过
但是尖括号还是会被过滤掉,所以不能使用script进行判断
只能使用出发事件或者链接了
使用onfocus属性发现on被过滤,所以payload是这个样的:
payload:" onοnfοcus=javascrscriptipt('xss')_
要注意后面的空格(我用下划线标出来)