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=""onerror="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
跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个跨站网页放在自己的服务器上,然后通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。这一类攻击的威胁相对较低。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信