Java web 系统安全笔记
最近在解决公司一些接口的安全隐患问题,总结了一下笔记。例子以 Java 语言做演示
XSS 攻击
出现 XSS 攻击的案例总结
-
请求参数原封不动返回前端,并让前端执行。
-
前提:别人可以直接访问 URL,不需要验证登录态
-
例子:spring boot + freemarker
-
后台接口
@Controller public class XssController { @RequestMapping("/xss") public String xssExample(HttpServletRequest request, String time) { request.setAttribute("time", time); return "xss"; } }
-
前端页面 xss.ftl
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Title</title> </head> <body> <script> alert(${time}); </script> </body> </html>
-
构造攻击请求
-
经过浏览器加载后,脚本变成如下:
alert(38843349);alert(1);var a=(1);
所以你的原来脚本(alert(38843349);)执行后,后面攻击脚本就会执行,导致可能会泄露敏感数据(钓鱼等)
-
-
解决方法
-
方法一:弄个过滤器,将请求参数进行敏感字符(例如:<kbd>< > ( ) ' " </kbd>)进行进行过滤或转移
优点:不用针对很多接口重复处理
缺点:有些接口可能含有某些敏感字符;高并发场景用正则匹配可能有性能问题
-
方法二:针对可能会出现 XSS 攻击的参数进行过滤或者转义
-
方法三:返回 json 数据时, Content-Type 头尽量使用 application/json;charset=utf8;
例如:http://localhost:8080/xss?request={"context":"<svg/onload=alert(1)>"}
,然后后台返回 json字符串又包含请求的 context 值,而且 content-type=text/html 类型,就会执行 context 里面的脚本,将 Content-Type 改为application/json; 后,异常脚本就会被过滤。
-
-
网友评论