![b08997ba7bd3e4bd3382be822746f1f3.png](https://i-blog.csdnimg.cn/blog_migrate/094f2c3a16e493f520c337624c01eae2.jpeg)
XSS漏洞主要是对表单发起攻击,很多时候,表单会以输入框的形式出现,但也有些表单不会以输入框的形式出现,甚至不会让我们看见,而是藏在某个不起眼的小地方,这就是所谓的“隐秘的角落”。
本文将继续从实战中讲解XSS,仍然使用前文所用的XSS Challenge平台——为你揭秘如何处理那些“隐秘的角落”。
当然,除此之外,我们也会带来一些新的东西,比如——BurpSuite。
上一篇文章的末尾已经使用过了BurpSuite,但我们并未细说。有些小伙伴可能已经去了解过,对这个工具有了一些自己的见解。不论你如何看待这个工具,我们都必须要告诉你,这是一个很强大但是很复杂、很难掌握的工具。
在这里,我们也不打算一次性就将BurpSuite完全介绍,而是准备在今后的题目中,利用实际操作来慢慢介绍,以此确保每一次的讲述都不会因缺少实战而显得太空洞。
到目前为止,最新的BurpSuite版本是2020.9.2版本。最新的BurpSuite内置了浏览器,我们不必配置代理即可抓包,打开方式如下:
![92cbde7211d73a4ec98d7f22e269e1e4.png](https://i-blog.csdnimg.cn/blog_migrate/ba59d628d58c6ef8fece609c575cc7aa.jpeg)
值得一提的是,该内置浏览器默认开启包拦截,如果你想要访问网页,得先把拦截到的包放出去才行。
最新版本可在官网获取:https://portswigger.net/burp
也可在吾爱论坛获取专业版:https://www.52pojie.cn/thread-1194411-1-1.html
本文将继续讲解XSS Challenges(http://xss-quiz.int21h.jp)的详细攻略,同时,也讲解BurpSuite的一些使用方法。
1. 关于BurpSuite抓包
抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。
一般情况下,抓包的意义非常之广泛,所以我们有时候不使用抓包这个词,而是使用例如监听、截包、改包等这些更为通俗的词语。
![32b8ad4442cf8073a05f5ccbe1e1ae4f.png](https://i-blog.csdnimg.cn/blog_migrate/dd3ed2b92e6216cfd1f00baeda6e2562.jpeg)
如图,监听与截包所获取到的数据是不同的。
在这里,我们要解释一下BurpSuite的Proxy模块。
Proxy代理模块是BurpSuite的核心功能,拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截、查看、修改在两个方向上的原始数据流。
也就是说,也就是说,Proxy模块就是用来抓包的主要工具。
你应该注意到,Proxy下面还有四个模块,接下来我们将一一解释。
1.1 Intercept
Intercept用于显示和修改HTTP请求和响应,通过你的浏览器和Web服务器之间。在BurpProxy的选项中,您可以配置拦截规则来确定请求是什么和响应被拦截(例如,范围内的项目,与特定文件扩展名,项目要求与参数,等)。该面板还包含以下控制:
- Forward 当你编辑信息之后,发送信息到服务器或浏览器
- Drop 当你不想要发送这次信息可以点击drop放弃这个拦截信息
- Interceptionis on/off 这个按钮用来切换和关闭所有拦截。如果按钮显示Interceptionis On,表示请求和响应将被拦截或自动转发根据配置的拦截规则配置代理选项。如果按钮显示Interception is off则显示拦截之后的所有信息将自动转发。
- Action 说明一个菜单可用的动作行为操作可以有哪些操作功能。
简单来说,Forward可以将你拦截到的包发出去,然后网页就可以正常访问;Drop可以把你拦截到的包丢弃,网页不能正常访问;Interceptionis on/off是拦截的开关,Interceptionis off状态意味着监听,不进行拦截,Interceptionis on状态则是拦截包。Action下面有很多选项,主要是将包发给其他模块,以使用其他功能,在这里我们不详述。
![b269ef6ad9c5bf5dc8851c182124301e.png](https://i-blog.csdnimg.cn/blog_migrate/de73a96d5be7851cba0a98b2ac12180e.jpeg)
- raw:这里显示的是纯文本形式的消息。在文本窗口的底部提供了一个搜索和加亮 功能,可以用它来快速地定位出消息中的感兴趣的字符串,如错误消息。在搜索 的左边有一个弹出项,让你来处理大小写问题,以及是使用简单的文本搜索还是 正则表达搜索。
- params:对包含参数(URL查询字符串,cookies消息头,或消息体)的请求,这个 选项可以把参数分析成名称/值的组合,并且允许你能简单地查看和修改。
- headers:这里以名称/值的组合来显示HTTP的消息头,并且还以原始的形式显示 消息体。
- hex:这里允许你直接编辑消息的原始二进制数据。如果在文本编辑器里修改,某些 传输类型(例如,使用MIME编码的浏览器请求的部分)包含的二进制数据可能被损坏。为了修改这些类型的消息,应使用十六进制。
1.2 HTTP History
HTTP History这个选项是来显示所有请求产生的细节,显示的有目标服务器和端口,HTTP 方法,URL,以及请求中是否包含参数或被人工修改,HTTP 的响应状态码,响应字节大小,响应的 MIME类型,请求资源的文件类型,HTML 页面的标题,是否使用 SSL,远程 IP 地址,服务器设置的 cookies,请求的时间。
双击某个请求即可打开详情,通过Previous/next可以快速切换请求,并且Action也可以将请求发送至其他模块。
可以通过最左边的列里的下拉菜单来加亮单个选项:
![b05f041b464eaf6457a21df22d7edd21.png](https://i-blog.csdnimg.cn/blog_migrate/3be4526c677b5f545051f6cc873a743d.jpeg)
在历史记录表里,右击一个或多个选项,就会显示一个上下文菜单让你执行一些操作,包括修改目标范围,把这些选项发送到其他 Burp 工具,或者删除这些项。
还可以通过配置过滤器来确定哪些顶层的数据项显示在表格里。
![e3f1ea411cfc7109f237c09ccb152dca.png](https://i-blog.csdnimg.cn/blog_migrate/b55bcf8fc16a0f418498beefa3a7739b.jpeg)
1.3 WebSockets history
这个选项主要用于记录WebSockets的数据包,是HTML5中最强大的通信功能,定义了一个全双工的通信信道,只需Web上的一个 Socket即可进行通信,能减少不必要的网络流量并降低网络延迟。
1.4 Options
该选项主要用于设置代理监听、请求和响应,拦截反应,匹配和替换,ssl等。这个选项也分为几个模块。在以前,Proxy Listeners这个选项会经常用到,但现在BurpSuite内置了浏览器,所以你对此只需了解即可。至于另外的模块,现在讲述还为时过早,我们会在之后再讲。
值得一提的是,模块2Intercept Client Requests
用于设置拦截的匹配规则。当Intercept request based on the following rules
为选中状态时,BurpSuite会配置列表中的规则进行拦截或转发。 如果该复选框未选中,那么即使Intercept is on也无法截取数据包。
2. XSS Challenge实战
我们会把第三题再复习一遍,然后开始今天的解题。今天我们将使用BurpSuite的内置浏览器进行演示。
2.1 Stage #3
第三关:http://xss-quiz.int21h.jp/stage-3.php?sid=93de7707279b3a5ae4ce419bfc7c0b1f380a20f6
我们输入特殊字符测试:' " !&?,再查看代码:<input type="text" name="p1" size="30"> <b>"' " !&?"</b>
很显然,它对我们的字符进行了过滤,至于是何种过滤,我们不得而知。既然无法从该表单进行攻击,那我们尝试找其他输入点。
查看源代码,我们发现还有另一个输入点:
Choose a country: <select name="p2">
<option>Japan</option>
<option>Germany</option>
<option>USA</option>
<option>United Kingdom</option>
所以我们抓包来找它的输入点:
![b6696ac8b063eefc08b479fa70acb4d0.png](https://i-blog.csdnimg.cn/blog_migrate/dbd2cb7c638ca0411657d2c0dc4ec3e9.jpeg)
果然,我们找到了p1和p2两个输入点。但由于p1有过滤,所以我们修改p2的值。
双击p2的Value值,将其修改为<script>alert(document.domain)</script>
,点击Forward将其发送出去:
![fafa4c6e6b8828f9209624a598e68586.png](https://i-blog.csdnimg.cn/blog_migrate/803f4d17b54e3158f2d47c93cfb44472.jpeg)
果然,payload正确。
其实,在这里,我们也无法确定网页是否对p2进行了过滤。我们也只是通过猜想、试错才得到的答案。因为我们无法看到后端的代码,所以我们无法对过滤进行分析,例如p1的过滤方式我们就无法知晓。
所以,如果你有什么想法尽管去试,在这个领域,试验、出错、纠正是不可避免的,而至于顺利得出正确答案,则几乎不可能。
最后,第三题payload:<script>alert(document.domain)</script>
2.2 Stage #4
网址:http://xss-quiz.int21h.jp/stage_4.php?sid=a311bc75ede604bb9d9d1cf566117401218f789c
Hint(提示): invisible input field(看不见的输入字段)
刚刚做完第三题,又看到了这个提示,我们有充分的理由认为,这一题有一个我们看不见的输入点。当然,并不能因此而放弃看得见的输入点,按照老方法,我们开始测试表单。
在这里,我们看见了表单的源码:
<input type="text" name="p1" size="30">
乍一看,似乎有机会,可以通过提前闭合的方式攻击,所以我们试一试:
![958995efda22d3e160fcfde32d565584.png](https://i-blog.csdnimg.cn/blog_migrate/e17f3e18484b4eca90bcbc2279b9c9d6.jpeg)
很可惜,我们的攻击毫无作用,应该是被过滤了。然后查看源代码,意外发现了三个输入点:
Search a place: <input type="text" name="p1" size=30>
Choose a country: <select name="p2">
<input type="hidden" name="p3" value="hackme">
但很明显,p2和p3我们无法进行输入,所以我们选择抓包然后修改数据,结果如下:
![1dc23bfc650bd0c13e597ef4284f638b.png](https://i-blog.csdnimg.cn/blog_migrate/68ced655e5227c0b3b99c0ba7682e833.jpeg)
很明显,由于有过滤措施,修改p1的值没有意义,所以,我们可以尝试修改p2和p3的值。这个需要试一试,但试也有方法。由源代码可知,p2和p3如果没有过滤的话,都可以通过提前闭合标签的方法来进行攻击,所以,我们首先测试的payload应为:"><script>alert(document.domain)</script>
。果不其然,一次正确。
所以最后payload可以为:"><script>alert(document.domain)</script>
htmlspecialchars()
连续两题都提到了过滤,过滤的方法有很多,值得提一下的是,有一种方法非常彻底,也可能是这题所采用的的方法,值得我们了解一下:PHP的函数 htmlspecialchars()。
htmlspecialchars() 函数把用于预定义的字符转换为 HTML 实体。
预定义字符:HTML中预定义字符是指:<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用。
HTML实体:上述的预定义符号是不显示在我们最终看到的网页里的,那如果希望在网页中显示这些符号,就可以使用htmlspecialchars()将符号转化为HTML实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
>(大于)成为 >
也就是说,在使用这个函数之前,以上符号会被认为有特殊意义,会被当做代码执行;但在使用函数之后,它们就会被当做字符输出,不再有特殊意义。
还有,如果你写html代码时不想在后端进行过滤,仅仅是想表示出这些符号,可以用一些特定字符来代替这些符号:
  :空格 >:大于号 > &It :小于号 < " :引号” ©:”版权符号 @
2.3 Stage #5
Hint: length limited text box(长度限制文本框)
关于这个输入框限制,其实解决起来很简单,如图:
![c3bab4769da8d8b8d702a5c15b0dee74.png](https://i-blog.csdnimg.cn/blog_migrate/49aaed041635a3b343c456adf6382100.jpeg)
双击这个数字,即可更改到你想要的字符串长度。
查看源代码,如果没有过滤的话,理论上可以通过提前闭合标签的方法进行攻击,所以我们可以试一试:
![729ce9b6d5dc2b1db018dacf8bd1450a.png](https://i-blog.csdnimg.cn/blog_migrate/01fe7a42dd1f94bd11b9203a18c090e7.jpeg)
在这里,我将字符串长度限制修改到了300,然后输入payload:"><script>alert(document.domain);</script>
进行攻击,果不其然,攻击成果。
所以payload可以为:"><script>alert(document.domain);</script>
2.4 Stage #6
Hint: event handler attributes(事件处理程序属性)
我输入了一段测试字符:' " !&?<>,查看返回结果,发现<>被过滤成了HTML实体:
![cbc56c2225720b4c7781d55f885c1999.png](https://i-blog.csdnimg.cn/blog_migrate/295644d6ac9ac152cd3dcab112aa5327.jpeg)
直接抓包,看有没有其他输入点:
![7c0b6c71665e6451bb9cb6c90e8e32ec.png](https://i-blog.csdnimg.cn/blog_migrate/8479304a49824519151e648265f3a5d5.jpeg)
很可惜,只有这一个输入点,所以,还是得在表单这里想办法。
既然<>被过滤了,那么js标签算是没法儿用了,因为标签都带<>,例如Img标签、a标签等,所以,在这里,我们选择事件,因为事件可以在标签中被执行,我们就不必费心去自己构建标签。
我们来复习一下上一篇文章提到的常用事件:
onclick: 点击触发(<img src=x onclick="alert(1)">)
onmouseover:鼠标指针移动到图片后触发(<img src=x onmouseover="alert(1)">)
onmousemove: 鼠标指针移到指定的元素后触发(<img src=x onmousemove="alert(1)" >)
onfocus: 当 input 输入框获取焦点时触发(<input onfocus="javascript:alert(1) autofocus">)
嗯,有点多,选其中一个就好。比如我选第一个onclick,那么最终payload为:"onclick="alert(document.domain)"
。
注意,既然是事件,我们就要进行相应的行动来触发事件。比如onclick事件,就需要你点一下输入框。另外,我们在事件前面加上"
是为了提前闭合value=""
。
如果我选择onmouseove事件,payload应为:" onmouseover="alert(document.domain)"
,然后,我们需要把鼠标移动到输入框才能触发事件。
小结
今天讲了两个有关BurpSuite抓包的题目,一个修改输入框字符长度限制的题目,还有一个有关事件的题目。
抓包应该是今天要重点掌握的内容,这是学习BurpSuite使用的基础;修改字符长度限制倒不是很难的内容,随着你对html学习的深入,这对你来说会很轻松;js事件是我们第一次遇到,可以关注一下,当标签被过滤的时候,事件会是很好的攻击方式,当然,随着你对js学习的深入,掌握这些对你而言也是轻而易举。
若要获取更多安全有关资讯,敬请关注微信公众号:蝰蛇安全实验室。
![99a1a33bb4f49f8f8e5e3426c2e644cd.png](https://i-blog.csdnimg.cn/blog_migrate/a5482c3ab224f2339ad1dea97ed3d954.png)