以下全是手打,如有手误欢迎提出来。
XSS原理
HTML注入并插入JS脚本,在注入后,若为存储型攻击,当用户再次访问页面时,运行js脚本完成攻击
由于网站提交信息内容未被检查,导致提交至后端服务器,当用户访问时激活js脚本
一般xss发生在留言板,在线信箱,评论栏等处,表现特征是用户可以自行输入数据,并且数据提交给服务器。
以下为常见的XSS攻击类型
0x01. 备:alert是javascript的弹窗意思
这个是提交数据没有任何限制时提交,当用户再次打开页面时,会出现弹窗(/xss),若把alert(/xss)转成攻击脚本,脚本便会在打开页面时在你的电脑上运行。
0x02.经典代码会在输入数据的地方加入强行转字符,例如
1234 这样你在输入栏里输入就无作用了
现在介绍一下闭合标签,如上所述给出以下改良编码输入对话
结合原先web代码拼接如下代码
这样就完成了一个完整的闭合路线 JS脚本又会正常运行。脚本再次注入成功
0x03.黑名单过滤模式
所谓黑名单过滤,就是开发者将script拉入了黑名单,当提交页面中包含script时自动屏蔽
这个时候要猜测一下后台的过滤机制,有经验的xss漏洞研究人员会利用查侧漏语句进行尝试,查侧漏语句为xss中必须的各类关机字及词,如
<>、!、’、"、*、#、[]、{}等。当然,也可以直接利用测试语句进行提交测试,根据个人习惯进行语句测试,如
提交后就变成了alert(/xss)的文本文件了
这时尝试是否能绕过黑名单的限制,如下代码
执行后发现成功,因为js语言不区分大小分别的特征
这个时候可以和开发说可以使用 strtolower() strtoupper()强字符串转换为大小写
0x04.多重嵌套测试
当大小写混合的模式不通时,就可以使用多重嵌套了
可以尝试构建如下代码
<scr
因为有
这样提交后再次注入成功
这个时候可以使用针对嵌套防护的代码
if(preg_match(’/()+/’, &String)){
return false}
利用正则表达式对嵌套单词的过滤,从而避免利用嵌套方式绕过后台检测。、
0x05.宽字节绕过
当以上的测试方法都无法成功
可以使用抓包工具在提交栏随便输入一些东西,这里我输入的是abc,然后参数的输出位置
以下为测试代码
输入你的用户名:
首先要了解编码 如GB2312 GBK GB18030 还要会用抓包工具 例如BS Fiddler
然后要有一定的基础不太了解可以和我细谈
分析代码后发现 我输入的abc是在’ '之间切运用了textarea区域
这时考虑上面的闭合加上新的和JS属性的脚本尝试以下脚本
';alert(/xss/);//
通过修改url中的参数来提交这段代码,这时代码如下
通过 ’ 来完成闭合然后就可与使用标签的JS属性来执行脚本
提交完成后运行时发现无法出现xss弹窗
利用浏览器查看源码发现以下web页面代码
发现之前提交的信息被单引号进行转义了。按正常浏览器的解析流程,如果用户输入中的特殊字符被转移了,并放到了引号之中,那么用户就无法打破之前的JS属性构造来执行js语句了
这个时候就要利用编码组合了,利用浏览器查看源码工具找到字符编码
GBK编码是存在宽字节问题的,主要表现在GBK编码第一个字节(高字节)的范围是0x810xFE,第二字节(低字节)范围是0x400x7E与0x80~0xFE
GBK就是以16进制对字符进行编码。在GBK编码中""符号的十六进制表示为0x5C,正好在GBK的低字节中。因此如果在后面添加一个高字节编码,那么添加的高字节编码会与原有编码组合成一个合法字符。于是重新构造代码如下
%bf’;alert(/xss/);//
修改后重新提交,脚本被成功执行
目前现在UTF-8编码开始普遍,所以宽字节的漏洞也越来越少