Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
直接输入,但是输入一半的时候,发现字符框长度不够了。
直接改前端代码,修改完成后,成功弹框。
这个题弄的我有点蒙,一开始这个登陆框试了半天,发现没XSS
,于是登陆后,发现又出一个框,原来敢情是在这里进行XSS
…
这个地方让他弹框还是比较简单的,关键是这其实还是一个反射型的XSS
,虽然是用post
请求提交的参数,但是我感觉利用场景还是比较少,和上一关一样还是得发链接给被害者访问,无非这里是构造一个post
的表单。。。
熟悉的留言板,直接提交语句就可以构造成功了,并且每次访问都会有框出现。
直接输入,但是发现并没有弹框,审查源码。。。
发现输入的值发生了一定的变化,仔细检查后,发现还有一段JS
代码。
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "what do you see?";
}
//试试:'>
//试试:' οnclick="alert('xss')">,闭合掉就行
从上面可以看出来,通过value
方式将text
的值赋值为str
,也就是框里面的值,然后通过innerHTML
将标签内的值取出来,比如,取出来的值就是
this is a label
。所以结合前面的'
做一个闭合,像这种有前后标签闭合的就不太方便用了,用提示里面的
onclick
来构造,' onclick=alert('xss')>
就可以了。
在审查元素中也可以看到对应的代码。
点击链接,即可成功弹窗。
看起来和上一个很像,直接用onclick
来试试。
但是点击随风
后,可以正常弹窗。
虽然成功弹框了,还是去学习JS
代码看和上一题有什么区别。
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);
document.getElementById("dom").innerHTML = "就让往事都随风,都随风吧";
}
//试试:'>
//试试:' οnclick="alert('xss')">,闭合掉就行
window.location.search
该属性获取页面 URL 地址,window.location 对象所包含的属性如下:
去控制台测试了下结果。
然后通过var txss = decodeURIComponent(str.split("text=")[1]);
取出以text=
为分割的第二个元素,第一个元素是?
第二个元素就是我们输入的值。
最后var xss = txss.replace(/\+/g,' ');
将+
删除,这里应该是过滤经过url
编码过的空格
吧。
和上一题的区别在于,这里的值是从URL
中获取到的,就像反射型的XSS
一样。
这个并不是一种攻击类型吧,只是一种场景,因为输入的值在前端都显示不出来,所以我们也不知道哪里会有XSS,所以见框就插,这称之为盲打。
所以接下来,我再框里都输入了恶意代码。
然后右上方有个提示,可以看到后台的目录。
访问后台,登陆成功后,就可以看到成功弹框。
从标题就知道了会有过滤,这里先输入一些符号进行探测"'<>/
,结果发现符号似乎都没有被过滤掉。
那直接使用,但是发现
script
似乎被过滤掉了。
先用大小写,双写啥的试试。大写就直接成功了。
去服务器上查看php
代码:
$html = ''; if(isset($_GET['submit']) && $_GET['message'] != null){ //这里会使用正则对
,直接成功弹框。
用作者的话来说就是:这里讲输入动态的生成到了js中形成xss,javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义 //讲这个例子主要是为了让你明白,输出点在js中的xss问题,应该怎么修? //这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。 //所以在JS的输出点应该使用\对特殊字符进行转义