一、背景作者最近在MOOC中录制了一组XSS跨站漏洞加固Web安全视频教程。课程讲到XSS挖矿方法,所以在录制课程之前,需要做大量的实战案例。最近在录制视频,打算把这些XSS漏洞的挖掘过程记录下来,方便自己也方便大家。在本文中,我将以渗透生态测试系统为例。permeate渗透测试系统的安装方法我在之前写的一篇文章中已经讲解过,这里不再赘述如何安装这个渗透测试系统。参考文档:利用PHPExtendTaint找出网站潜在安全漏洞实践2.内容总结XSS漏洞原理反射挖掘存储挖掘3.漏洞介绍在练习漏洞之前,笔者准备简单介绍一下XSS漏洞,但是XSS相关概念的介绍,本文不做介绍,故不再赘述;XSS漏洞类型主要分为三类:反射型、存储型、DOM型。HTML的结构已更改。如下图所示,我们可以看到攻击者的参数被原封不动地放入HTML代码中,导致原来的结构被改变。当浏览器执行代码时,将执行警报事件。3.2反射型反射型XSS是笔者在闹钟中定义的好像直接将URL地址中的恶意参数输出到页面,导致触发攻击代码,称为反射型XSS,如下图所示。可以看到,这里本来输入的是一个名字,实际上传递的是一个script标签。这个标签也原样放在了HTML结构中,结果触发了script标签代码中的代码。3.3StoredStoredXSS,顾名思义,就是对恶意参数进行存储,一般在后端服务器,所以StoredXSS不会在URL地址中包含恶意参数,受害者很难发现自己被攻击了,如图下图中,存储型XSS被触发在图中,作者没有看到URL地址中的脚本代码,但是攻击代码还是被触发了,说明攻击代码来自服务器,攻击代码为确实由攻击者传递给服务器。一般情况下,当攻击者通过表单将攻击代码传递给服务器时,他会得到一个新页面的地址。该地址的URL没有明显异常,比如下面的URL地址http://permeate.songboy.net/article/1但是当存储型XSS存在时,受害者打开这个URL,就会触发攻击代码.在这种情况下,我称之为存储型XSS漏洞。3.4DOM型DOM型XSS比较特殊。反射型XSS和存储型XSS是通过传播方式来区分的,而DOM型XSS与传递参数的方式无关。开发者做了一些安全保护后,任何一个安全问题的现象,如下图,可以看到参数名已经用一个函数进行了转义。按理说这时候给前端页面传递参数是不会造成XSS漏洞的;但是当JavaScript代码中的参数对DOM节点进行操作后,会恢复原来转义的代码,所以还是会被触发。如下图,可以看到已经触发了XSS代码。这种DOM类型的XSS相对来说比较隐蔽,因此,防御XSS漏洞不能只靠后端开发人员,前端开发人员也应该了解XSS漏洞。4、反射挖掘经过上一节原理的介绍,相信大家对XSS已经有了一定的了解。现在我需要手动挖掘XSS漏洞。在手动挖掘之前,需要先浏览一下网站的功能点,如下图Permeate的界面4.1思路分析知道反射型XSS是通过URL地址传播的,那么笔者需要思考一下URL地址的参数会放在哪里显示在页面上;相信读者都使用过一些网站的站内搜索,在站内搜索位置往往会在页面上显示搜索关键词,如下图所示。在首页,笔者还看到这个网站有搜索功能,所以我们可以从搜索位置入手,在搜索位置输入一个简单的payload。参考下面的点击Search的时候会自动跳转到下面的网址。这时候浏览器的URL地址已经改变了。URL地址如下:http://permeate.songboy.net/home/search.php?keywords=搜索形式使用GET传参,满足第一步测试反射类型。4.2漏洞检查接下来需要看笔者的payload没有触发,结果很出乎意料,不但没有触发,还被浏览器屏蔽了,如下图,需要说明一下各位读者,谷歌内核浏览器自带XSS过滤器,所以对于反射型XSS测试,尽量不要使用谷歌浏览器,我建议使用火狐浏览器进行测试;4.3结果分析现在我复制上面的URL地址,粘贴到火狐浏览器中,回车,效果如下图已经触发payload,说明发现了反射型XSS漏洞。这种漏洞是比较初级的。随着浏览器的XSS过滤器越来越智能,这种漏洞越来越少。下面的内容,其中笔者会提到存储型XSS挖矿和绕过。5.存储型挖矿现在我正在寻找存储型XSS。存储型攻击代码是存储在服务器端的,所以需要在服务器端找到一些存放表单内容的位置。之前对permeate做过一些了解,所以我们知道permeate有发帖和回复的功能,这正是参数需要存储和显示的地方。5.1发现漏洞点击首页XSS栏目,进入栏目列表。如下图,可以在右下角看到一个发帖按钮。点击发帖按钮后,可以进入发帖界面,如渗透测试系统所示。如果你想发帖,你需要一个帐户。我只是在这里注册一个帐户。我不会详细解释注册过程。填写payload,参考内容如下:分别在标题和帖子内容中填写payload。填写后要和下图一致。填写内容后,作者点击下方的发布按钮,即可发布。如果发布成功,将弹出提示。如下图点击确定后,会跳转到帖子列表,弹出123提示框。如果看到下图这个弹框,说明作者的payload已经执行完毕,点击确定,可以看到列表内容,如下图,只有标题显示在list,所以post内容中的payload还没有被执行;5.3绕过抓包现在点击标题进入帖子详情页,在详情页,笔者发现payload只触发了一次,内容中的标签直接显示出来,如下图。当标签直接显示时,表示作者的参数已经转义;转义有两种,前端转义和后端转义,如果是后端转义,一般作者会放弃测试,如果是前端转义,可以绕过这个限制;这里笔者发现标题没有转义,但是内容是,猜测可能是前端转义了,可以通过浏览器的审核工具复制数据包;先重新打开发帖页面,然后在网页任意位置点击鼠标右键->选择评论元素->切换到网络标签勾选保留日志,打开网络勾选保留日志,这样记录可以在发布帖子后在网络请求中找到。现在我可以填写新的有效载荷。如下图点击发布按钮后,我可以在控制台中找到它。对于刚才的post请求,从请求中可以看出数据在发送出去的时候已经进行了转义,如图5.4编码替换。当确认这个地方存在时,前端已经做了转义处理。如果后端没有处理,笔者可以绕过,现在我复制请求,然后更改里面的数据,如下图,复制的数据如下curl'http://permeate.songboy.net/home/_fatie.php?bk=6&zt=0'-H'Connection:keep-alive'-H'Cache-Control:max-age=0'-H'Origin:http://permeate.songboy.net'-H'Upgrade-Insecure-Requests:1'-H'Content-Type:application/x-www-form-urlencoded'-H'User-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10_13_4)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36'-H'接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'-H'Referer:http://permeate.songboy.net/home/fatie.php?bk=6'-H'Accept-Encoding:gzip,deflate'-H'Accept-Language:zh-CN,zh;q=0.9,en;q=0.8'-H'Cookie:__cfduid=defc970ef7081e30aedd761da5762b1891532003579;UM_distinctid=1655a61a23343c-03f0904540a333-34657908-1fa400-1655a61a234323;PHPSESSID=rufhm0741qfv55cpfnc80k1g4l'--data'csrf_token=3908&bk=6&title=222%3Cscript+%3Ealert%28123%29%3C%2Fscript%3E&content=%3Cp%3E222%26lt%3Bscript+%26gt%3Balert%28126lt%29%2%2Fscript%26gt%3B%3C%2Fp%3E'--compressed笔者找到参数中的标题和cOntent参数值,复制title参数值,然后替换content参数值,替换后的内容如下curl'http://permeate.songboy.net/home/_fatie.php?bk=6&zt=0'-H'Connection:keep-alive'-H'Cache-Control:max-age=0'-H'Origin:http://permeate.songboy.net'-H'Upgrade-Insecure-Requests:1'-H'Content-Type:application/x-www-form-urlencoded'-H'User-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10_13_4)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36'-H'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'-H'Referer:http://permeate.songboy.net/home/fatie.php?bk=6'-H'Accept-Encoding:gzip,deflate'-H'Accept-Language:zh-CN,zh;q=0.9,en;q=0.8'-H'饼干:__cfduid=defc970ef7081e30aedd761da5762b1891532003579;UM_distinctid=1655a61a23343c-03f0904540a333-34657908-1fa400-1655a61a234323;PHPSESSID=rufhm0741qfv55cpfnc80k1g4l'--data'csrf_token=3908&bk=6&title=222%3Cscript+%3Ealert%28123%29%3C%2Fscript%3E&content=222%3Cscript+%3Ealert%28123%29%3C%2Fscript%3E'--compressed替换完成后,笔者将此内容复制到终端(如果读者使用windows操作系统,可以下载一个cmder),然后回车,结果如图5.5结果分析在返回的结果中可以看到发帖成功。此时,作者已成功发布新帖。当您返回帖子列表时,您可以看到三个帖子。该帖子是作者新发布的。当我打开如下图的详情页时,提示了作者两次,提示title和content中的payload被触发,脚本在控制台变成了一个DOM节点。而不是显示文字,如下图所示,说明作者已经成功绕过了前端XSS过滤器。后面会出工具盘和防御文章。有兴趣的也可以支持一下作者的视频教程。网址如下https://coding.imooc.com/class/242.html谢谢?(?ω?)?作者:唐青松微信:songboy8888日期:2018-08-21
