前言

虽然不是很多但是也要记录一下,好久没发过博客了,简单水一下

XSS漏洞原理

三个关键:参数必须传递到后端、参数必须不可控、参数必须被浏览器解析。
恶意攻击者往web页面插入恶意Script代码,当用户浏览该页之时,嵌入web页面中的script代码会被执行,从而达到攻击的效果。

XSS漏洞的审计方法

关注用户可控终端(用户的输入),传入后端的参数且返回给浏览器被解析。

  1. 使用Servlet技术:request.getParameter("name")
    image.png
  2. 使用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的属性接受参数:
    也就是前端传来了一个参数给到这么一个属性,这个属性在进行一个传递,相当于一个二次赋值。
    类似于这样,由于没有搭建框架,随便写了一下。
    image.png

image.png|544
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>

主要就是一个传参的过程,最后在浏览器解析代码
image.png

然后就是一些xss的绕过方法,这些应该都很熟悉,就不详细解释了。
存储型就是会将payload的存进数据库中,也没什么。

总结

写的确实少了点,主要要注意的就是前端向后端传送的参数,我们是否能利用(配合一些绕过方法)。