上一节讲了XSS的闭合,有些文章会将闭合同绕过混淆在一起讲。而在我看来,闭合是满足浏览器对脚本执行的基本语法要求,是基础;而绕过是在程序设有不太健全的安全措施下,所使用突破手段。 那么这个突破手段应该怎样进行呢?
常规脚本注入无果后,首先要根据现象猜测程序所使用的防御措施,然后判断该防御措施是否可能存在缺陷,猜测可能存在再进行注入尝试。
例如:
<input type="text" name="gg" value="注入点">
注入脚本 "οnclick="alert(0) 后,返回页面变成如下情况:
<input type="text" name="gg" value="" ="(0)">
很明显这里用的关键字过滤,这种防御方式有好几个坑。
第一是否能防住大小写绕过,即 "oNcLick="alERt(0) ;
第二是否能防住双拼绕过,即 "onconclicklick="alealertrt(0);
上面两个都还好,稍微有点经验的开发都会自己把坑填上,而第三个才是关键字过滤最深的坑,即关键字黑名单不全的问题,我们常用来测试的js事件有onchange、onclick、onmouseover、onmouseout、onkeydown、onload,而这并不是全部,藏在角落里很