![b7e2f57cc8c1a1228de2aa2872ed9258.png](https://i-blog.csdnimg.cn/blog_migrate/ff0ea68c038540d32dc19076a17255f0.png)
Hello,各位小伙伴周五晚上好~
![b3bbe66ecc97ea6320edf4282670bf2d.png](https://i-blog.csdnimg.cn/blog_migrate/d9114431722982036bf41f78f4c4cf5b.jpeg)
终于到了XSS漏洞的完结篇啦~~
![b7146da9cc4536b28fc84d73f703d12b.png](https://i-blog.csdnimg.cn/blog_migrate/82a71b8eeaa0dfc80e49d1a9bf55f3d1.png)
感觉本公众号写的最多的就是XSS,现在可以告一段落了...
![c2574e197e38bb48d043f7aae400ac88.png](https://i-blog.csdnimg.cn/blog_migrate/48ea90c5287b5f60d0fc7dc262ef0e6b.jpeg)
让我们来看看第一版XSS漏洞总结吧!
![c73c8bb0a03a8d91a12ccba121cfa440.png](https://i-blog.csdnimg.cn/blog_migrate/f60f5f36e85d0316ebffe96e8d1c9c6e.png)
Part.0
目录
目录
一、XSS概述
什么是XSS?
二、XSS的分类
XSS的三种类型
反射型XSS
存储型XSS
DOM型XSS
DVWA平台通关
三、XSS的利用
利用XSS盗取用户cookie
利用XSS进行网页挂马
配合CSRF攻击完成恶意请求
利用XSS进行网页钓鱼
四、XSS挖掘技巧
利用字符编码
XSS注入点分析
不完整的黑名单
五、XSS的防护
开启HttpOnly
输入输出检查
Part.1
XSS概述
什么是XSS ?
XSS全称Cross Site Script,跨站脚本攻击。
通常指攻击者通过“HTML注入”篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击手段 。
在2017年的OWASP TOP10中,XSS攻击排行第七,破坏力强大,如下图所示:
![111b6db93e5b9004a26bde5298372560.png](https://i-blog.csdnimg.cn/blog_migrate/96ad7a446b91a3172f09ff5545fd8cee.png)
到底什么是XSS呢?我们直接来看一个例子。
我们先写一个前端页面,要求用户输入用户名,并传给后端处理:
![4a3491c8ce7636f0a22a576935e42dd2.png](https://i-blog.csdnimg.cn/blog_migrate/b3543543132977c1d9baddd7290f8a65.png)
后端处理页面,网页将接收到的用户名直接输出到页面上:
![edf1a14dc70f0b2fcc3abc12fdb9e57f.png](https://i-blog.csdnimg.cn/blog_migrate/1fb9e59a02f7706a0430fa3c880b0f36.png)
访问前端页面,输入用户名Monster:
![5fe81fe4037ea42618a2e1736e961185.png](https://i-blog.csdnimg.cn/blog_migrate/a236a5acc91c99fd082a0a5bc9a3be05.png)
点击提交,页面返回后端处理结果:
![ef8bdf8a82468566874a217d11ac567a.png](https://i-blog.csdnimg.cn/blog_migrate/be1eade367239f0c3f07de3bf62baf0f.png)
如果我们提交一段HTML恶意代码,就会发现代码在当前页面执行了。
例如提交
![7f07ddefe8a418735d5c3e801d7c01a2.png](https://i-blog.csdnimg.cn/blog_migrate/f98d91b8510757ce974e60f403668695.png)
查看网页源代码,会发现恶意代码被插入到当前页面中了:
![a489e1150a8e74a321f7196f21373299.png](https://i-blog.csdnimg.cn/blog_migrate/fe54485ecef5bcfce3b838d288922e57.png)
这就是一个简单的反射型XSS,虽然这里看上去没有什么大的危害,但其实XSS攻击可以做到更多事,例如盗取用户cookie,修改网页内容,恶意挂载木马等等。
Part.2
XSS的分类
XSS的三种类型
XSS一共有三种类型,分别是反射型XSS、存储型XSS以及DOM型XSS。
(1)反射型XSS:
反射型XSS也称为非持久性XSS,正如上面的例子,这种攻击方式只是简单的把用户输入的数据“反射”给浏览器,只对当前URL链接生效。因而攻击者需要引诱用户点击恶意链接才行。
(2)存储型XSS
存储型XSS又称为持久性XSS,会把恶意代码存储在服务器端,危害性极强。例如攻击者发表了一篇带有恶意js代码的文章,那么所有访问该文章的用户都会中招。
(3)DOM型XSS
DOM型XSS也是一种反射型XSS,需要向服务器输入数据,与常规的反射型XSS不同,DOM型XSS需要通过修改页面的DOM节点来形成XSS。
接下来我们先通过DVWA平台low等级看看这三种XSS的成因。
![0edf93bf325de977b3c71adba0bd0f78.gif](https://i-blog.csdnimg.cn/blog_migrate/9af1e6c013c10d61d18d0627ebd71daf.gif)
反射型XSS
本页面要求我们输入用户名:
![8ea36e69122b27732cea813bb8a1cd78.png](https://i-blog.csdnimg.cn/blog_migrate/e65060f3eee8c2115cb828b143fccf39.png)
前端代码,通过GET方法将name参数传递给后端:
![863302de38b1908e37b86dd8c1eb6616.png](https://i-blog.csdnimg.cn/blog_migrate/94fdeff0d0b50e5764d78a35310934e5.png)
后端代码,接收$_GET传递的参数后,不做任何过滤,直接输出到页面:
![ee008086d6f085f36202f3741d8bb566.png](https://i-blog.csdnimg.cn/blog_migrate/085dcbcc5a58e806121925dfd63c41b5.png)
输入
js代码执行,页面出现弹窗:
![52d0cb43f68ccea6700ac5b019cf9a59.png](https://i-blog.csdnimg.cn/blog_migrate/f78d36adaec8e339604cbf7a8eca6d60.png)
和前面举的例子一样,可以看出XSS产生的原因有两点:
用户能够控制显示点
对输入输出内容过滤不严
![0edf93bf325de977b3c71adba0bd0f78.gif](https://i-blog.csdnimg.cn/blog_migrate/9af1e6c013c10d61d18d0627ebd71daf.gif)
存储型XSS
该页面是一个留言板
![b072e228431f36eae357b0d60ac2a182.png](https://i-blog.csdnimg.cn/blog_migrate/66ca941c7e3841fb0fc2d5b255098ef6.png)
输入姓名和信息即可留言,例如输入Name为Monster,Message为Hello,world!
每次访问该页面,都会加载留言信息,如下:
![bd9f9ba77cb136d3474d0299028b67b1.png](https://i-blog.csdnimg.cn/blog_migrate/46ed0208a35fd30fcd2bf70d0a882be4.png)
如果在此处插入一个js恶意脚本,每次有人访问该页面,都会加载这个恶意脚本,这就是存储型XSS。
查看后端源代码:
![cd0e9ddb74fa8f7544196e4f4f305905.png](https://i-blog.csdnimg.cn/blog_migrate/678f2ce1d3156192378795ca03815d5e.jpeg)
我们来对其中一些函数进行解释:
trim():函数移除字符串两侧的空白字符或其他预定义字符。
stripslashes():删除反斜杠
mysqlrealescape_string(string,connection):函数会对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义,用于防SQL注入。
由代码可知,并未对输入做过多限制,name和message栏都存在XSS注入漏洞。
直接在message栏输入
![343ff893907692b779e680a8a5e42992.png](https://i-blog.csdnimg.cn/blog_migrate/a2e75ce9f598b77dde8d9ce31016bf73.png)
![0edf93bf325de977b3c71adba0bd0f78.gif](https://i-blog.csdnimg.cn/blog_migrate/9af1e6c013c10d61d18d0627ebd71daf.gif)
DOM型XSS
注入页面如下,需要我们选择语言:
![d1533e335237f5c570b679e050bb5312.png](https://i-blog.csdnimg.cn/blog_migrate/d6f7aa08d347df3aa1e0b823db073bd2.png)
后端源代码如下:
![a98abb24b1a6508d0b74afa34df59ece.png](https://i-blog.csdnimg.cn/blog_migrate/f5afaed81f3c7d0826b5cb21104ee45c.png)
我们选择French,会发现URL变成了:
http://192.168.211.151/vulnerabilities/xss_d/?default=French
修改url中default=88888888,当前页面随之修改:
![224bae8c764519483d5cc4815f1218b7.png](https://i-blog.csdnimg.cn/blog_migrate/7761332979d0c3684041870d021b3e56.png)
直接查看网页源代码,会发现有一段js代码:
![665c8208491c3e6fd080de52fe442e5a.png](https://i-blog.csdnimg.cn/blog_migrate/8cee4b0203632af5270c11b62d089043.png)
修改了页面的DOM节点,将我们输入的内容直接插入到了HTML页面中:
![afd755bbdc6a71f31d5754e962710e06.png](https://i-blog.csdnimg.cn/blog_migrate/106b0788ed998a1c224a80e4584b277e.png)
修改url中default=
![2ade5415e15225dbd227a6e24faf6201.png](https://i-blog.csdnimg.cn/blog_migrate/d045f529e32a8f3edf5de774bbe50ea6.png)
查看网页源代码,恶意代码被插入网页中:
![e00c30b74e101d706d05983035e83cfa.png](https://i-blog.csdnimg.cn/blog_migrate/4ac11e2aeb2be86d07ad27dcc97f97e9.png)
这就是一个简单的DOM型XSS的成因,效果和反射型XSS相似。
![0edf93bf325de977b3c71adba0bd0f78.gif](https://i-blog.csdnimg.cn/blog_migrate/9af1e6c013c10d61d18d0627ebd71daf.gif)
DVWA平台通关
DVWA平台XSS页面分为4种安全等级,从low等级到impossible等级。
low安全等级主要是展示漏洞成因,安全等级往上递增,会增加不同的防御手段,impossible等级不存在漏洞。
之前写过一期通关指南,直接搬运如下:
【XSS漏洞】一步步教你通关DVWA
Part.3
XSS的利用
XSS的利用
1、利用XSS盗取用户cookie
【XSS漏洞】利用XSS窃取用户Cookie
2、利用XSS进行网页挂马
【XSS漏洞】通过XSS实现网页挂马
3、配合 CSRF 攻击完成恶意请求
【CSRF漏洞】通过实验教你学会CSRF攻击 Part3
4、利用XSS进行网页钓鱼
【XSS漏洞】利用XSS进行网页钓鱼
Part.4
XSS挖掘技巧
利用字符编码
一些网站会对我们输入的特殊字符加“\”进行转义,例如php在magicquotesgpc = On的情况下,如果输入的数据有:
单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线。
我们来看一个例子:
![74ea41671c019e529aa3a5590dd21540.png](https://i-blog.csdnimg.cn/blog_migrate/c02bdb243310974263e367982245466f.png)
在magic_quotes_gpc =Off 时,输入
?x=1";alert(1)// 即可弹窗:
![0c3de11d48a4f1bbb7a5291930e70217.png](https://i-blog.csdnimg.cn/blog_migrate/8ba35c8f2852455331d9c22952c3b0f2.png)
现在我们开启magic_quotes_gpc=On,输入
?x=1";alert(1)// :
![77e565fa86c335fc16cb915868aa58a1.png](https://i-blog.csdnimg.cn/blog_migrate/17d54df3339287a71c9340591c2dd653.png)
会发现双引号被转义,无法弹窗。
但是,如果返回页面像本网页一样是GBK/GB2312编码的话,我们也可以使用宽字节进行逃逸。
当网页使用了GBK编码时,会认为两个字符为一个汉字,例如%df%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围),因此经过转义后,%df%5c(%5c为 \)就会变成一个汉字,把转义符吃掉。
输入?x=1%df";alert(1)// ,成功弹窗:
![5a4486c56d4152b866e80e87f12b85e2.png](https://i-blog.csdnimg.cn/blog_migrate/cbdcaf97cfe3e7b03615764c587786bf.png)
![0edf93bf325de977b3c71adba0bd0f78.gif](https://i-blog.csdnimg.cn/blog_migrate/9af1e6c013c10d61d18d0627ebd71daf.gif)
XSS注入点分析
XSS有可能发生在HTML标签中、HTML属性中、在标签中、在事件中等。
之前写过一次分析,没看过的小伙伴可以看一下:
【XSS漏洞】浅析XSS脚本注入点
![0edf93bf325de977b3c71adba0bd0f78.gif](https://i-blog.csdnimg.cn/blog_migrate/9af1e6c013c10d61d18d0627ebd71daf.gif)
不完整的黑名单
有些网站会使用黑名单的方式,过滤掉一些敏感js标签,例如:
![417330bf402ce843115cb56cdf243f4a.png](https://i-blog.csdnimg.cn/blog_migrate/0b41deaca65d62732e3506cd64eafc4d.png)
过滤掉了大多数js标签,输入a\lert(1)试试:
![c75ea2bf8770dcb0aa35779a5af88825.png](https://i-blog.csdnimg.cn/blog_migrate/9eff483411a84d83f0eb7a09112b81d4.png)
alert被替换成了****
但这里的黑名单漏掉了eval()函数,这就是黑名单不如白名单安全的原因,黑名单会出现遗漏的情况。
为了避免被过滤,将alert(1)转换为ASCII码形式:
![a236365d43a77e1e0825c5e2bcab0b25.png](https://i-blog.csdnimg.cn/blog_migrate/7480c905dac8d775eedd0d209acacb71.png)
构造payload如下,成功弹窗:
![591a325fcff21fa1a40af4ff75ed176d.png](https://i-blog.csdnimg.cn/blog_migrate/1683d8c7e00e28a1465df78d1da245c6.png)
Part.5
XSS的防护
开启HttpOnly
JS 原生的 API提供了获取cookie的方法:document.cookie,在XSS攻击中,常常被用于盗取用户的cookie。
如果能够盗取网站管理员的cookie,那么就可以用管理员的身份直接登录网站后台,而不必非要去获得管理员账号和密码。
在正常网页通过document.cookie可以获取当前页面cookie,例如在以下页面插入js代码:
![2124b387c2e326dc3cc8e2f3e657b376.png](https://i-blog.csdnimg.cn/blog_migrate/d9d1ea6f67949488fd31381d0939429d.png)
访问该页面,弹窗用户cookie值:
![7a143bbf0b9e2b686122cceffb1b0d86.png](https://i-blog.csdnimg.cn/blog_migrate/b92380d5403c9af9a8db55ecf4e145ab.png)
通过以下恶意脚本,可以将用户cookie发送至远端服务器,完成窃取。
![b5945c2c9a67db9cd9b7de9104965694.png](https://i-blog.csdnimg.cn/blog_migrate/0c4f17d3a453fd69a24a6af1cf56dc11.png)
但是一旦我们给该页面cookie添加上HttpOnly属性,就可以防止这种恶意行为,修改代码如下:
![7920360e0792997535caec0e5e918056.png](https://i-blog.csdnimg.cn/blog_migrate/7c4f38e2b4dbaca8d7a0b2f3595125f2.png)
HttpOnly属性用来设置cookie是否能通过 js去访问,默认情况下该选项为空,客户端可以通过js代码去访问(包括读取、修改、删除等)cookie。
当cookie带httpOnly选项时,客户端则无法通过js代码去访问了,是防御XSS攻击的常用手段之一。
再次访问该页面,无法获取到该页面的cookie:
![bdab8dd69cf49eee5fede8e8d1210a20.png](https://i-blog.csdnimg.cn/blog_migrate/03401943b5dabc7f3aa0cadeb7d2efd9.png)
![0edf93bf325de977b3c71adba0bd0f78.gif](https://i-blog.csdnimg.cn/blog_migrate/9af1e6c013c10d61d18d0627ebd71daf.gif)
输入输出检查
防护XSS首先可以从输入入手,因为我们默认所有用户的输入都是不可信的,因此需要过滤掉输入中的敏感字符,有时候也需要检查输入内容格式是否合规。
当我们需要将内容输出到网页时,为了确保即使包含XSS特殊字符,也不会被执行,我们可以对输出内容编码后再进行输出。
可以从以下几个角度来考虑:
(1)黑名单、白名单
通过黑名单匹配XSS特征,例如、javascript等敏感字符,但是可能出现遗漏而被绕过的情况。相较而言白名单则更加安全,匹配成功则放行。
(2)电话、邮件、日期等格式要求
比如电话号码使用is_numeric()函数进行检查,必须是纯数字才行。邮件、日期也都有其相应的格式,输入的字符串是否超过最大长度等,这种方法类似白名单。
(3)利用编码函数
对、'、"等特殊字符,进行过滤或者编码。
使用编码函数可以有效防止XSS攻击,以php为例。
addslashes():
![2cf6c4643699c1a543efd0b98b1e6fc4.png](https://i-blog.csdnimg.cn/blog_migrate/abba7c0562c6b2e256237982c53acac5.png)
strip_tags():
![e5586013b2c513a8cd655623b49f8657.png](https://i-blog.csdnimg.cn/blog_migrate/e8d23f42a4b0401a9068c9019a7b9f66.png)
htmlentities():
![57441cb308ea28c8897824b4953a6dfe.png](https://i-blog.csdnimg.cn/blog_migrate/f609f4954fab879747db58f872a2b64a.png)
htmlspecialchars():
![6b0e711bdc5e8f1ad9c12668aaa4fa21.png](https://i-blog.csdnimg.cn/blog_migrate/bfaeaec01be1d2fac04d4f27d3ae2f5e.png)
Part.6
结束语
这就是今天的全部内容了,大家都明白了吗?
最后,欢迎关注我的个人微信公众号哦~
![2a4a5e01a585b771b0e91420aa8ef884.png](https://i-blog.csdnimg.cn/blog_migrate/13d7e0fe33f5540e2964bddfc844c7ea.jpeg)
Peace !
![aea5e0ed4e8111f335e7dc259e987dd7.png](https://i-blog.csdnimg.cn/blog_migrate/7d1c9082a723db384306fc1291aa6838.png)