XSS注入,js脚本注入后台

简介:    曾经一度流行sql注入,由于现在技术的更新,已经看不到这问题了,但是又出来新的安全问题,XSS攻击,他的原理就是在前端提交表单的时候,在input标签当中输入js脚本,通过js脚本注入后台,请看下图.这里用用原生servlet做说明,帮助大家理解。

   曾经一度流行sql注入,由于现在技术的更新,已经看不到这问题了,但是又出来新的安全问题,XSS攻击,他的原理就是在前端提交表单的时候,在input标签当中输入js脚本,通过js脚本注入后台,请看下图.




这里用用原生servlet做说明,帮助大家理解。

以下是我项目的路径


以上是我的项目结构。首先需要配置pom.xml把jar下载,第二步新建,XSSFilete.java这是一个过滤器。然后新建XSSRequest,这是相当于HttpServlet的子类,重写getParmeter方法。DoFromServlet主要是用来测试的,通过前端传js脚本避免出现XSS攻击。



1.配置pom.xml

<project xmlns=

"http://maven.apache.org/POM/4.0.0"

xmlns:xsi=

"http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=

"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"

>

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.itmayideu.xss</groupId>

  <artifactId>

xssfilter

</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>war</packaging>

  <build/>

  <dependencies>

          <dependency>

              <groupId>org.apache.commons</groupId>

              <artifactId>commons-lang3</artifactId>

              <version>3.4</version>

          </dependency>

          <dependency>

              <groupId>javax.servlet</groupId>

              <artifactId>javax.servlet-

api

</artifactId>

              <version>3.0.1</version>

              <scope>provided</scope>

          </dependency>

          <dependency>

              <groupId>javax.servlet.jsp</groupId>

              <artifactId>

jsp

-

api

</artifactId>

              <version>2.1</version>

              <scope>provided</scope>

          </dependency>

     </dependencies>

</project>



第二步:


编写XSSFilete过滤器

package com.sunjian.xssfilter;


import java.io.IOException;


import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;



public class XSSFilete implements Filter{


    @Override

    public void init(FilterConfig arg0) throws ServletException {


    }



    @Override

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        //解决XSS攻击手段思路,将表单提交的参数全部转换成html语言进行保存

        HttpServletRequest req = (HttpServletRequest) request;

        XSSRequest httpServletRequestWrapper = new XSSRequest(req);

        chain.doFilter(httpServletRequestWrapper, response);

    }


    @Override

    public void destroy() {


    }

}



第三步:XSSRequest继承HttpServletRequestWrapper


package com.sunjian.xssfilter;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;


import org.apache.commons.lang3.StringEscapeUtils;

import org.apache.commons.lang3.StringUtils;


public class XSSRequest extends HttpServletRequestWrapper{


    HttpServletRequest request;



    public XSSRequest(HttpServletRequest request) {

        super(request);

        this.request = request;

    }


    /**

     * 重写方法

     */

    @Override

    public String getParameter(String name) {

        String value = request.getParameter(name);

        if(!StringUtils.isEmpty(value)){

            System.out.println("转换前value:"+value);

            // 将value转换成html,就是会将一些脚本元素转换成html进行返回。

            value = StringEscapeUtils.escapeHtml4(value);

            System.out.println("转换后value:"+value);

        }

        return value;

    }


}



第四部编写DoFromServlet接口

package com.sunjian.xssfilter;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



@WebServlet("/DoFromServlet")

public class DoFromServlet extends HttpServlet{


    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {

        System.out.println("DoFromServlet");

        String userName = req.getParameter("userName");

        req.setAttribute("userName", userName);

        //将参数转发到另一个页面进行展示。

        req.getRequestDispatcher("showUserName.jsp").forward(req, resp);

    }

}



第五步:配置web.xml,配置过滤器

<?xml version=

"1.0"

encoding=

"UTF-8"

?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app id=

"WebApp_ID"

>

     <display-name>

xssfilter

</display-name>

     <welcome-file-list>

          <welcome-file>index.html</welcome-file>

          <welcome-file>index.htm</welcome-file>

          <welcome-file>index.jsp</welcome-file>

          <welcome-file>default.html</welcome-file>

          <welcome-file>default.htm</welcome-file>

          <welcome-file>default.jsp</welcome-file>

     </welcome-file-list>

     <filter>

          <filter-class>com.sunjian.xssfilter.XSSFilete</filter-class>

          <filter-name>XSSFilete</filter-name>

     </filter>

     <filter-mapping>

          <filter-name>XSSFilete</filter-name>

          <url-pattern>/*</url-pattern>

     </filter-mapping>

</web-app>


第六步:编写前端form.jsp

<%@ page language=

"java"

contentType=

"text/html; charset=UTF-8"

    pageEncoding=

"UTF-8"

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv=

"Content-Type"

content=

"text/html; charset=UTF-8"

>

<title>Insert title here</title>

</head>

<body>

<form action=

"DoFromServlet"

method=

"post"

>

          用户名是<input type=

"text"

name=

"userName"

>

          <input type=

"submit"

value=

"提交"

>

     </form>

</body>

</html>


第七部:showUserName.jsp

<%@ page language=

"java"

contentType=

"text/html; charset=UTF-8"

    pageEncoding=

"UTF-8"

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ page isELIgnored=

"false"

%>

<html>

<head>

<meta http-equiv=

"Content-Type"

content=

"text/html; charset=UTF-8"

>

<title>Insert title here</title>

</head>

<body>    

     <h1>测试index.jsp</h1>

     用户名是::${userName}

     &gt;

</body>

</html>


最终的效果:





以上是相关代码。其实XSS攻击就是通过前端input将js脚本注入到后台,解决原理是将<script>中的>转换成&gt;  来解决XSS攻击

如果喜欢就给个赞吧。


关注我的公众号,都是满满的干货!

孙坚.gif

目录
相关文章
|
26天前
|
JavaScript 安全 前端开发
js开发:请解释什么是XSS攻击和CSRF攻击,并说明如何防范这些攻击。
XSS和CSRF是两种常见的Web安全威胁。XSS攻击通过注入恶意脚本盗取用户信息或控制账户,防范措施包括输入验证、内容编码、HTTPOnly Cookie和CSP。CSRF攻击则诱使用户执行未经授权操作,防范手段有CSRF Tokens、双重验证、Referer检查和SameSite Cookie属性。开发者应采取这些防御措施并定期进行安全审计以增强应用安全性。
19 0
|
30天前
|
JavaScript 前端开发 测试技术
使用Selenium执行JavaScript脚本:探索Web自动化的新领域
本文介绍了如何在Selenium中使用JavaScript解决自动化测试中的复杂问题。Selenium的`execute_script`函数用于同步执行JS,例如滑动页面、操作时间控件等。在滑动操作示例中,通过JS将页面滚动到底部,点击下一页并获取页面信息。对于只读时间控件,利用JS去除readonly属性并设置新日期。使用JS扩展了Selenium的功能,提高了测试效率和精准度,适用于各种自动化测试场景。
41 1
|
1月前
|
JavaScript 前端开发 Java
liteflow规则引擎 执行Javascript脚本
liteflow规则引擎 执行Javascript脚本
39 1
|
3月前
|
移动开发 JavaScript 数据可视化
分享88个JS播放器脚本,总有一款适合您
分享88个JS播放器脚本,总有一款适合您
40 0
|
3月前
|
移动开发 JavaScript 前端开发
分享95个JS表单脚本,总有一款适合您
分享95个JS表单脚本,总有一款适合您
27 0
|
3月前
|
移动开发 JavaScript 前端开发
分享106个JS表单脚本,总有一款适合您
分享106个JS表单脚本,总有一款适合您
17 0
|
3月前
|
移动开发 JavaScript 前端开发
分享98个JS表单脚本,总有一款适合您
分享98个JS表单脚本,总有一款适合您
21 0
|
3月前
|
JavaScript 前端开发 Unix
Node.js Shell 脚本开发指南(中)
Node.js Shell 脚本开发指南(中)
|
3月前
|
JavaScript 前端开发 Shell
Node.js Shell 脚本开发指南(上)
Node.js Shell 脚本开发指南(上)
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
70 0