背景
在开发评论管理系统的时候,想到了僵尸粉刷评论的情况, 可以获取大量的用户cookice实现 而偷cookice的方式,就衍生到了 XSS 攻击
XSS 原理
摘抄百度百科: HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,<title>与</title>之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。
即被XSS注入之后的网页被普通用户打开之后, 就会后台执行一些恶意代码, 例如偷取cookice发布评论,发送骚扰邮件 很多的QQ用户在告诉别人密码的情况下,却出现了群发广告的问题, 大概率就是遇到了XSS攻击
实战开始
页面展示
在这里,我简单用Java和Thymeleaf模板写了一个留言板
代码展示
controller:
@Controller
public class PageController {
final public static List<String> messageList = new ArrayList<>();
@RequestMapping(path = {"","/"})
public String index(HttpServletRequest request,Model model) {
String userName = request.getParameter("userName");
model.addAttribute("messageList", messageList);
model.addAttribute("userName", userName);
return "bbs";
}
@RequestMapping("say")
public String say(HttpServletRequest request, Model model) {
String message = request.getParameter("message");
String userName = request.getParameter("userName");
messageList.add(message);
model.addAttribute("userName", userName);
model.addAttribute("messageList", messageList);
return "bbs";
}
}
bbs.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>留言板</title>
</head>
<body>
欢迎: <div th:utext="${userName}">某人</div>
<form method="get" action="/say">
<p>姓名<input type="text" th:value="${userName}"></p>
<p>说点什么:<input type="text" name="message"></p>
<input type="submit" name="提交">
</form>
<hr>
<div th:each="message : ${messageList}">
<div th:utext="${message}"></div>
<hr>
</div>
</body>
</html>
xss.js
alert("网站被注入了")
console.log("偷偷发送cookice到服务器")
招式展示
反射式XSS注入
观察上面的代码 在我们进入页面时候,是可以带一个参数 userName 的 参数之后会展示在页面上,那么我们可以通过对这个参数进行尝试注入
来尝试执行
http://127.0.0.1:8080/?userName=%E5%95%8A%E5%93%88%3Cscript%20src=%22http://127.0.0.1:8080/xss.js%22%3Ealert(%22%E6%B3%A8%E5%85%A5%E5%95%A6%22)%3C/script%3E
效果
如果要进行攻击的话,只需要将链接发送给指定的人,他点开之后,就可以完成攻击操作
存储式XSS
观察页面,我们是可以在内容页面进行提交留言的 而留言则会每次打开都会进行渲染 那么我们可以直接提交XSS代码
来让杰哥看看<script src="http://127.0.0.1:8080/xss.js"></script>
总结
反射式一般只会打开一次攻击一次 而存储式则是会存在服务器,每次打开指定页面都会进行攻击,范围广
怎么预防
永远不要相信别人的数据, 对所有的参数进行转码, 渲染的时候,也转码之后显示, 避免被浏览器直接执行