XSS简介
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
XSS注入
<script>alert(1)</script>
通过这段js代码,弹个框来证明存在xss漏洞。
弹框只是为了证明存在此漏洞。而此漏洞的利用方式由很多种。
比如,可以使用xss平台:
平台地址
平台使用教程
当某人进入带有脚本的页面时,js脚本会获取他的cookie并发往xss平台。
你只需要登录xss平台等待即可,拿到cookie后,可以不需要密码登录他的账号。
对于存储型xss漏洞的表现形式,比较经典的是留言板。但是我们都是遵纪守法的好学生,不能对外面的网站进行测试,所以我拿了我自己的web项目做了一波操作。
发现存在xss注入,虽然Java的预处理查询有着防御sql注入的功能,但是针对于xss注入,还需要做很多防范措施。
选择平台生成的一些脚本注入之后,接收到了cookie,ip等相关信息
同理任何访问被xss注入后的用户都会被收集信息。
其实在注入成功之后,你会发现留言内容和留言者的部分都为空,因为插入的js代码已经被浏览器解析执行了!
这时我们按F12,打开浏览器的开发者工具,就能发现嵌入的js脚本。
XSS攻防
作为一个开发,我们要保证项目的抗压能力。
如何防范xss?
在input标签里面加上maxlength属性
<input type="text" name="nickname" placeholder="留言者昵称" maxlength="10">
至于原理,就是因为js脚本的形式为<script></script>长度为17,所以只要我们在前端对长度进行限制,就可以阻止黑客进行xss攻击了
可是!开发可没这么好做!
作为攻击者,我们同样可以修改前端代码,具体的操作是使用浏览器的F12(开发者工具)我们可以直接进行长度的修改。
另外,还可以用抓包的方法,在包里面直接写,也是不受长度限制的。
所以这种方式只能针对"脚本小子",并不切合实际
2.
对关键字script进行过滤
很容易发现,要想进行xss攻击,必须插入一段js脚本,而js脚本的特征是很明显的,脚本中包含script关键字,那么我们只需要进行script过滤即可。
但是js脚本是一种弱类型语言,不区分大小写,所以只需要对某一字母大小写切换,就可以实现绕过屏蔽。
例:
<sCrIPt>alert(1)</ScripT>
这时候你可能会说,那把大小写一起屏蔽了不久行了?
其实不然,因为语言特性,可以使用双写script的方式再次进行绕过
例:
<Sscriptcript>alert(1)</Sscriptcript>
原因,前面的S和后面的cript组合在一起,构成了新的Script关键字。
3.
使用正则表达式过滤
攻击者如何再一次绕过?
答案是:用img标签的oneerror属性
<img src=x onerror=alert(1)>
4.
过滤alert关键字
那么,攻击者该怎么办呢?
答案是:编码绕过
<a href=javascript:alert(1)>a</a>
这种编码方式为字符编码
字符编码:十进制、十六进制ASCII码或unicode 字符编码,样式为“&#数值;”, 例如“j”可以编码为“j”或“j”
上述代码解码之后如下:
<a href=javascript:alert(1)>a</a>
你能明显感觉到限制:由于使用到了a标签,所以只有点击时,才会弹框。
能不能让所有进入这个页面的人都弹框?
当然可以了:用iframe标签编码
<iframe src=javascript:alert(1)>
这种写法,同样既没有script关键字,又没有alert关键字。
由于使用了iframe标签,留言板的样式会发生变形。实战中尽量不要用。```
### 小结
其实关于xss的注入方法数不胜数,学习的道路坎坎坷坷,只能一步一个坑的慢慢填。