(一)XSS注入思路
① 在目标站点上找到输入点,比如查询接口,留言板等;
② 输入一组“特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是否有做对应的处理;
③ 通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);
④ 提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
XSS漏洞挖掘
环境:看URL参数输出的位置和看输入框输出位置。输出位置不同,攻击方式不同.
第一题: 输出在标签外(尖括号外部)
存在漏洞的前提是输出位置要能够构造标签,如果不能构造说明不存在
测试方式:输入一些特殊字符
例:!#<> 等 如果正常输出可以尝试构造正常标签
例:<script>alert(1)</script>
例:<img src=1 onerror=alert(1)>
如果不能弹窗,可以把标签大小写嵌入,防过滤,如果正常弹窗,说明存在注入点
第二题: 输出在标签中
2-1.引号内部 能闭合,构造新的属性或者构造新标签, 如果可以构造新的属性,那么就存在XSS漏洞
原始标签:<input type=text value="参数输出位置">
嵌入值: " autofocus= 'true' white-space: normal;"> <input type=text value="输出位置" autofocus= 'true' >
不能构造新的属性,尝试闭合标签,构造新标签
2-2.引号内部 不能闭合,就要看当前属性是否支持JavaScript代码,如果支持,就存在,如果不支持就不存在(过滤或者转义了)
输入值: javascript:alert(`xss`)
<input type="text" value="参数输出位置"> 此参数不支持JS代码
<img src='1.jpg'> 参数支持JS代码,正常加载图片时,运行 输出位置的JS代码
<a href='参数输出位置'>1111</a> 这里支持JS代码
2-3.引号外部,看是否能够构造新的属性,如果可以构造新的属性,就存在xss漏洞, 不能构造,是否能闭合标签构造新标签
原始代码:<input type="text" value="12345" 参数输出位置>
嵌入代码:<input type="text" value="12345" autofocus='true' onfocus=alert(1)>
input标签支持onfocus获取焦点属性,访问页面时自动获取焦点触发JS代码
第三题: 输出在JavaScript代码中<script>输出位置</script>
- 3-1.输出在引号内部:注意不能传</script>.不然会提前结束JS代码运行
- a).能够闭合引号,直接插入js代码,剩下可以考虑闭合后面的代码或者直接注释
- 例:
- <script>
- var hack = "www.baidu.cn 参数输出位置 ";
- var hack = "www.baidu.cn ";alert(1);// ";
- </script>
- b).不能闭合引号
- 使用document.write 输出到页面里,
- http://localhost/admin.php?name= <img src=1 onerror=alert(/xss/)>
- <script>
- var hack = "www.baidu.com 参数输出位置 ";
- document.write(hack);
- </script>
- 使用inner.HTML 输出到页面里
- <script>
- var hack = "www.baidu.com <?=$name;?>";
- var out = document.getElementById('baidu');
- out.innerHTML = hack;
- </script>
复制代码
XSS的防范
XSS的威力主要是取决于JavaScript能够实现的程度,XSS跨站脚本的形成原因是对输入输出没有严格过滤,导致在页面上可以执行JavaScript等客户端代码,所以只要将敏感字符过滤,就可以修复XSS跨站漏洞。
修复和防范方法:
三种类型的XSS漏洞都可以通过过滤或编码进行修复。
反射型XSS和存储型XSS可以在服务端对用户输入输出的内容过滤和编码操作,将关键字进行过滤处理,关键符号进行编码处理,如将所有on事件,script等关键字进行过滤,将所有<,>,”,’,=等特殊符号进行实体化编码或百分号编码便可以修复。
DOM型XSS如有在服务端进行交互,也可参考上述的方法进行修复,如未和服务端进行交互,可在客户端使用JavaScript等客户端脚本语言进行编码和过滤处理。
总结:输入做过滤,输出做转义(编码)
|