xss跨站脚本攻击 (初级-中级-高级)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ExpeditionaryForce/article/details/80619325

    XSS(`Cross Site Scripting`)恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。XSS攻击分成两类,一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句;另一类则是来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页



例.


url/example.php?name=<script>alert("xss")</script>


例.


过滤了小写的`<script`与`</script>`,可以使用大小写绕过,

url/example2.php?name= <SCRIPT>alert( “XSS”)</ SCRIPT>

url/example.php?name=<scripT>alert("xss")</scripT>


例.


过滤了不区分大小写的`<script>`与`</script>`,可以使用嵌套的script标签绕过,

url/example.php?name=<scr<script>ipt>alert("xss")</scr</script>ipt>



例:

img src调用图片失败然后执行后面的动作,代码如下:


从代码中我们可以看到,包含script字符串即报错,可以使用img标签绕过。

URL/example.php?name=<img src=""οnerrοr="alert('xss')">



例:


包含alert字符串即报错,可以使用编码方式绕过。

URL/example.php?name=<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 120, 115, 115, 39, 41))</script>



例:


从代码可以得出直接在js环境中输出php变量,可以通过构造js脚本绕过。



例.


代码在js环境中输出通过html编码的php变量,htmlentities没有过滤单引号,可以使用单引号绕过。

url/example.php?name=';alert('xss');'


例.


post地址使用了当前url,我们构造当前url地址达到xss目的,尝试构造代码如下

url/example.php/[/url]"><script>alert('xss')</script>



例.


xss 直接在页面输出锚点id,构建一个带xss的锚点即可,构造代码如下

刷新网页后,即可弹窗



反射型XSS


输入`<script>alert(/xss/)</script>test`。点击提交后,弹出XSS页面。


代码如下:

输入的内容直接在页面显示。这里可以构造多种方式,达到恶意攻击的目的。


页面代码


源代码


从源代码看出此处对输入name的值仅检测是否输入,没有进行任何安全性的过滤和处理。所以导致了XSS漏洞。


中等级别反射型XSS:


源代码如下:


使用str_replace()函数将`<script>`用空格取代。这种防护几乎没有什么作用,只需要简单改变大小写即可绕过该函数的防御。

输入`<scRipt>alert(/xss/)</script>`即可。



高级别反射型XSS


源代码如下:


可以看出此处对GET来的name的参数使用htmlspecialshars()函数进行了转换,htmlspecialchars()函数主要是将一些预定义的字符转换为HTML实体。使得此处输入代码后无法执行。但是使用该函数过滤并不能保证万无一失,需要看具体场景。构造特殊的编码或者语句是可以绕过该函数的防御。但在此处无法绕过该函数。

存储型XSS:

此处为留言板类型,随意输入内容,会将输入的内容显示出来。


输入:`<script>alert(/xss/)</script>test`。点击提交后,弹出XSS页面,并且每次刷新都会弹窗。


查看页面源代码,看出输入的输入的内容直接在页面显示。这里可以构造多种方式,达到恶意攻击的目的。


源代码如下:


从源代码看出此处对输入Name,和Message中的仅做了防止SQL注入的过滤,没有对输入的字符安全性的过滤和处理。所以导致了XSS漏洞。

中等级别反射型XSS

源代码如下


可以看出此处对GET来的Message的参数使用htmlspecialshars()函数进行了转换,htmlspecialchars()函数主要是将一些预定义的字符转换为HTML实体。使得此处输入代码后无法执行。但是使用该函数过滤并不能保证万无一失,需要看具体场景。构造特殊的编码或者语句是可以绕过该函数的防御。但在此处无法绕过该函数。但是看Name参数是发现对name只采用了对`<script>`进行替换,只需要稍微替换一下script中的任意一个字符为大写即可绕过。

使用`str_replace()`函数将`<script>`用空格取代。这种防护几乎没有什么作用,只需要简单改变大小写即可绕过该函数的防御。在name处输入`<script>alert(/xss/)</script>`即可。但是经过测试,Name处限制了字符长度。但是PHP源码中并没有对Name的长度进行验证。可以采用分段绕过,即“/* */ ”的方式,此方法在其他XSS试验中有详细说明,可以参考。也可直接修改html源码绕过的方式进行绕过,这里采用修改html,使用Firefox中的firebug插件进行修改。

可以看出此处限制最长长度为10个字符。我们修改此处的代码的maxlength的值10改为100,在Nmae处输入代码即可【`<scRipt>alert(/haha/)</script>`】。点击提交即可。



高级别反射型XSS


可以看出此处对Message和Name的参数使用htmlspecialshars()函数进行了转换,htmlspecialchars()函数主要是将一些预定义的字符转换为HTML实体。使得此处输入代码后无法执行。但是使用该函数过滤并不能保证万无一失,需要看具体场景。构造特殊的编码或者语句是可以绕过该函数的防御。但在此处无法绕过该函数。

XSS防御

基于代码修改的防御
和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:
步骤1、对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。
步骤2、实现Session标记(`session tokens`)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
步骤3、确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。 


基于特征的防御
    XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS攻击。
    传统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就可以认为存在XSS攻击。 


XSS攻击分类
XSS漏洞一般有两种类型攻击。
一类是来自内部的攻击,主要指的是利用WEB 程序自身的漏洞,提交特殊的字符串,从而使得跨站页面直接存在于被攻击站点上,这个字符串被称为跨站语句。这一类攻击所利用的漏洞非常类似于SQL Injection 漏洞,都是WEB程序没有对用户输入作充分的检查和过滤。
另一类则是来来自外部的攻击,主要指的自己构造XSS 跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个跨站网页放在自己的服务器上,然后通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。这一类攻击的威胁相对较低。

展开阅读全文

没有更多推荐了,返回首页