XSS(`Cross Site Scripting`)恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。XSS攻击分成两类,一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句;另一类则是来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页
例.
url/example.php?name=
例.
过滤了小写的`
例.
过滤了不区分大小写的``,可以使用嵌套的script标签绕过,
url/example.php?name=
例:
img src调用图片失败然后执行后面的动作,代码如下:
从代码中我们可以看到,包含script字符串即报错,可以使用img标签绕过。
URL/example.php?name=
例:
包含alert字符串即报错,可以使用编码方式绕过。
URL/example.php?name=
例:
从代码可以得出直接在js环境中输出php变量,可以通过构造js脚本绕过。
例.
代码在js环境中输出通过html编码的php变量,htmlentities没有过滤单引号,可以使用单引号绕过。
url/example.php?name=';alert('xss');'
例.
post地址使用了当前url,我们构造当前url地址达到xss目的,尝试构造代码如下
url/example.php/[/url]">
例.
xss 直接在页面输出锚点id,构建一个带xss的锚点即可,构造代码如下
刷新网页后,即可弹窗
反射型XSS
输入`test`。点击提交后,弹出XSS页面。
代码如下:
输入的内容直接在页面显示。这里可以构造多种方式,达到恶意攻击的目的。
页面代码
源代码
从源代码看出此处对输入name的值仅检测是否输入,没有进行任何安全性的过滤和处理。所以导致了XSS漏洞。
中等级别反射型XSS:
源代码如下:
使用str_replace()函数将``即可。
高级别反射型XSS
源代码如下:
可以看出此处对GET来的name的参数使用htmlspecialshars()函数进行了转换,htmlspecialchars()函数主要是将一些预定义的字符转换为HTML实体。使得此处输入代码后无法执行。但是使用该函数过滤并不能保证万无一失,需要看具体场景。构造特殊的编码或者语句是可以绕过该函数的防御。但在此处无法绕过该函数。
存储型XSS:
此处为留言板类型,随意输入内容,会将输入的内容显示出来。
输入:`test`。点击提交后,弹出XSS页面,并且每次刷新都会弹窗。
查看页面源代码,看出输入的输入的内容直接在页面显示。这里可以构造多种方式,达到恶意攻击的目的。
源代码如下:
从源代码看出此处对输入Name,和Message中的仅做了防止SQL注入的过滤,没有对输入的字符安全性的过滤和处理。所以导致了XSS漏洞。
中等级别反射型XSS
源代码如下
可以看出此处对GET来的Message的参数使用htmlspecialshars()函数进行了转换,htmlspecialchars()函数主要是将一些预定义的字符转换为HTML实体。使得此处输入代码后无法执行。但是使用该函数过滤并不能保证万无一失,需要看具体场景。构造特殊的编码或者语句是可以绕过该函数的防御。但在此处无法绕过该函数。但是看Name参数是发现对name只采用了对``即可。但是经过测试,Name处限制了字符长度。但是PHP源码中并没有对Name的长度进行验证。可以采用分段绕过,即“/* */ ”的方式,此方法在其他XSS试验中有详细说明,可以参考。也可直接修改html源码绕过的方式进行绕过,这里采用修改html,使用Firefox中的firebug插件进行修改。
可以看出此处限制最长长度为10个字符。我们修改此处的代码的maxlength的值10改为100,在Nmae处输入代码即可【``】。点击提交即可。
高级别反射型XSS
可以看出此处对Message和Name的参数使用htmlspecialshars()函数进行了转换,htmlspecialchars()函数主要是将一些预定义的字符转换为HTML实体。使得此处输入代码后无法执行。但是使用该函数过滤并不能保证万无一失,需要看具体场景。构造特殊的编码或者语句是可以绕过该函数的防御。但在此处无法绕过该函数。
XSS防御
基于代码修改的防御