ღ Miranda

XSS原理分析与利用

XSS为跨站脚本执行漏洞的简称,跨站脚本利用javascript在客户端浏览器执行js脚本来达到窃取cookie或者传播XSS蠕虫的目的,XSS漏洞的存在十分广泛,基本每个网站都有。

基本原理

先来看一个最基本的有XSS漏洞页面的代码:

看到这里把name这个参数的值直接在页面输出,没有做任何过滤,这时候访问1.php?name=<script>alert('xss')</script>就可看到弹窗,查看源码就可以看到页面是:

浏览器会把这句话当做javascript执行,所以造成了XSS漏洞,当然现实中网站页面会对输入做很多过滤输出,所以需要精心构造payload,在本机上测试时要注意Chrome浏览器有XSS Filter,可能无法弹窗,可以用其他的浏览器尝试,虽然无法弹窗,但确实植入了js代码。

利用输出环境构造代码

1. \被过滤

比较简单的情况就是被过滤,比如下面这段代码:

思路一

看到用了preg_replace这个函数过滤了script标签,这时候可以换一个思路,不使用script标签,使用其它标签的事件,比如下列payload:

第一条利用了onerror事件,图片加载出错的时候会执行指定代码,src指定为空,所以加载出错,就执行了alert,第二条利用onmouseover在鼠标滑过图片插入位置的时候就会执行代码,第三个在页面中插入了一个链接,点击就会执行代码。

思路二

非要用script标签也可以,构造如下payload:

看到我们把script分割,在被过滤掉中间的标签后成功拼成了我们要的payload

思路三

仔细看过滤的代码$name = preg_replace("/<script>/","", $name);,这句正则只是简单匹配了<script>这个字符串,所以我们可以用大小写绕过,payload<scRipt>alert("xss")</scriPt>,改变大小写就可以绕过,但如果过滤语句为$name = preg_replace("/<script>/i","", $name);的话,这种方法就失效了,i这个标记代表忽略大小写,但之前的方法同样可以使用。

还有一种情况,过滤代码如下:

遇到script就结束程序,不输出,这样就只能用思路一绕过。

另一种情况:

简单的过滤了alert,可以用prompt或者confirm弹窗,或者用eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 49, 39, 41))弹窗。

2. javascript变量绕过

页面代码如下:

我们输入的值先经过htmlentities转义特殊字符,再套在引号内,首先我们发送一串特殊字符看看哪些被转义了,访问1.php?name=<>;:'"/,返回后查看页面源代码:

可以发现;':/没有被过滤,由于输出内容本身就在script标签内,我们不需要自己加标签,只需要闭合'payload';alert('xss');',看到提交后页面代码为:

3. $_SERVER['PHP_SELF']直接拼接url

$_SERVER['PHP_SELF']表示当前php文件相对于网站根目录的位置地址,如下网址由$_SERVER['PHP_SELF']得到的结果对照为:

所以可以很方便的获取当前url:

这带来了安全问题,看下列代码:

直接将$_SERVER['PHP_SELF']拼接在action内,我们可以更改url达到XSS攻击的目的,构造payloadhttp://demo.com/1.php/" method="POST"><script>alert("xss")</script>//

成功插入了js代码。

4. 对转义<>的特殊情况绕过

看下面这段代码:

我们构造payload\u003cimg src=1 onerror=alert(\"xss\")\u003e,原因在于\u003c\u003ejs代码内被翻译为<>,输出后同样能形成标签。

发表评论

电子邮件地址不会被公开。