前言
虽然不是很多但是也要记录一下,好久没发过博客了,简单水一下
XSS漏洞原理
三个关键:参数必须传递到后端、参数必须不可控、参数必须被浏览器解析。
恶意攻击者往web页面插入恶意Script代码,当用户浏览该页之时,嵌入web页面中的script代码会被执行,从而达到攻击的效果。
XSS漏洞的审计方法
关注用户可控终端(用户的输入),传入后端的参数且返回给浏览器被解析。
- 使用Servlet技术:
request.getParameter("name")

- 使用Struts2框架:
(1)通过Action类绑定参数或model获取前端的参数1 2 3 4 5 6 7 8 9
| <form action="login.action" method="post">
账号:<input type="text" name="name">
密码:<input type="password" name="password">
<input type="submit" value = "登录">
</form>
|
前端类似一个这样的逻辑,然后在传送到后端
(2)通过Action的属性接受参数:
也就是前端传来了一个参数给到这么一个属性,这个属性在进行一个传递,相当于一个二次赋值。
类似于这样,由于没有搭建框架,随便写了一下。


3. Spring mvc获取前端参数:
这里具体可以参考:springmvc Controller接收前端参数的几种方式总结 - 轻浅初夏 - 博客园
有几种获取参数的方式。
一个小demo(反射型)
就是一个简单的前端解析传入payload的一个小例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @WebServlet(urlPatterns = "/index") public class index extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); String name = req.getParameter("name"); if (name == null || name.isEmpty()) { req.getRequestDispatcher("/index.jsp").forward(req, resp); return; } resp.sendRedirect( req.getContextPath() + "/index.jsp?rep1=" + URLEncoder.encode(name, StandardCharsets.UTF_8.name()) ); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <% String rep1 = request.getParameter("rep1"); if (rep1 == null) { rep1 = ""; }%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>XSS Demo</title> </head> <body> <h2>Simple XSS Demo</h2> <form action="index" method="get"> Payload: <input type="text" name="name" value=""/> <input type="submit" value="Submit"/> </form> <div> Echo: <%= rep1 %> </div> </body> </html>
|
主要就是一个传参的过程,最后在浏览器解析代码

然后就是一些xss的绕过方法,这些应该都很熟悉,就不详细解释了。
存储型就是会将payload的存进数据库中,也没什么。
总结
写的确实少了点,主要要注意的就是前端向后端传送的参数,我们是否能利用(配合一些绕过方法)。