Java审计之XSS篇

Java审计之XSS篇0x00前言继续学习一波Java审计的XSS漏洞的产生过程和代码。0x01Java中XSS漏洞代码分析xss原理xss产生过程:后台未对用户输入进行检查或过滤

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Java审计之XSS篇

0x00 前言

继续 学习一波Java审计的XSS漏洞的产生过程和代码。

0x01 Java 中XSS漏洞代码分析

xss原理

xss产生过程:

后台未对用户输入进行检查或过滤,直接把用户输入返回至前端。导致javascript代码在客户端任意执行。

XSS代码分析

在php里面会使用echo对用户输入的参数进行直接输出,导致了xss漏洞的产生。而在Java里面会将接收到的未经过滤的参数共享到request域中,在jsp的页面里面使用EL表达式进行输出。

这里编写一个serlvet来做一个演示

xssservlet代码:

@WebServlet("/demo")
public class xssServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");// 设置响应类型
        String content = request.getParameter("content");  //获取content传参数据
        request.setAttribute("content", content);  //content共享到request域
        request.getRequestDispatcher("/WEB-INF/pages/xss.jsp").forward(request, response);  //转发到xxs.jsp页面中

    }
}

xss.jsp代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    ${requestScope.content}
</head>
<body>

</body>
</html>

启动tomcat,访问url:

http://localhost:8080/untitled3_war_exploded/demo?content=1

Java审计之XSS篇

传参一个1过去成功输入了,那么再来传一个xss的payload试试。

http://localhost:8080/untitled3_war_exploded/demo?content=<script>alert("xss")</script>

Java审计之XSS篇

成功的弹出了一个框

在审计中需要关注的是参数是否可控,如果可控传入的参数是否会被过滤后共享到request域中,如果在可控和不被过滤的情况下,就很有可能存在xss漏洞。

防御xss策略

我们需要防御xss漏洞的攻击,就需要添加一个方法,在传入前先调用该方法进行一次过滤,但是这样的方式比较繁琐,这时候就可以使用ESAPI来帮我们过滤。

ESAPI介绍:

企业安全API(ESAPI)项目是OWASP项目,可为每个Web平台创建简单的强大安全控件。安全控件并不容易构建。您可以在OWASP网站上了解无聊的开发人员的数百个陷阱。通过为开发人员提供一组强大的控件,我们旨在消除创建安全Web应用程序的某些复杂性。这可以在整个SDLC中节省大量成本。

据说可以应付大部分的web攻击漏洞。

在pom.xml导入ESAPI坐标

<!-- https://mvnrepository.com/artifact/org.owasp.esapi/esapi -->
<dependency>
    <groupId>org.owasp.esapi</groupId>
    <artifactId>esapi</artifactId>
    <version>2.2.1.1</version>
</dependency>

servlet代码:

@WebServlet("/demo")
class xssServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ServletException, IOException {

        response.setContentType("text/html");// 设置响应类型
        
        String content = request.getParameter("content");  //获取content传参数据
        String s = ESAPI.encoder().encodeForJavaScript(content);  //进行实体编码
        request.setAttribute("content", s);  //content共享到request域
        request.getRequestDispatcher("/WEB-INF/pages/xss.jsp").forward(request, response);  //转发到xxs.jsp页面中

    }
}

参考该博客

https://blog.csdn.net/CHS007chs/article/details/86645450

0x02 CMS 审计

这次还是拿上次搭建的环境来做一个演示。

那么结合前面的内容,知道了xss的产生过程是使用request.setAttribute方法将请求到的数据未经过滤存储到request域中,然后在jsp页面里使用el表达式进行输出。

在审计的时候我们可以直接来全局搜索 快捷键 `Ctrl+Shift+F

Java审计之XSS篇

这里就来找一下存储型xss,反射的xss意义并不大。

Java审计之XSS篇

点击选择一个文件来看看他的代码,这里直接就给共享到request域中了,但是这里只是我们的一个查询方法,我们需要找到他输入值的地方, 看到下面的addComment方法正好对应上了一个输出xss ,一个插入xss的地方。

Java审计之XSS篇

查看该方法 commentService.addComment(comment); 调用addComment方法将值传入,不出意外的话传入的comment参数就是接收过来的一个实体类。我们来Ctrl+左键点击 Comment类进行跳转到该类去。

Java审计之XSS篇

主要关注变量为 String类型的变量,因为Java是强类型的语言。

等会对这几个变量的地方进行插入xss代码。

回到刚才的控制器代码

Java审计之XSS篇

点击ctrl+左键点击addComment 追溯到CommentService 的接口

Java审计之XSS篇

同样的方式再追溯到CommentService的实现类

Java审计之XSS篇

使用的是commentDao调用addComment 传入参数进行添加数据。继续追溯上去

Java审计之XSS篇

在这里我们就看到了dao接口中的addcomment方法,dao接口中并没有myabtis的注解,说明是xml配置文件配置的。

后面的直接开启全局搜索,搜索addComment指定xml文件。

Java审计之XSS篇

点击进去看到,我们的提交的内容会被插入数据库里面,也就是说这是个存储型xss

Java审计之XSS篇

Java审计之XSS篇

逻辑这里其实已经很清晰了。

具体的还得看实操,查看Controller获取路径。

Java审计之XSS篇

Java审计之XSS篇

漏洞位置:

http://127.0.0.1:82/web/comment/ajax/addcomment

结合刚刚查看的Comment实体类,我们已经找到哪些地方可以去插xss了。

<script>alert("1")</script>

访问一下漏洞地址

Java审计之XSS篇

这里还需要登录后才能访问,那就登录一下吧!

Java审计之XSS篇

Java审计之XSS篇

系统错误,我。。。。。肯定又是上次那张表的问题,那几张表没建立好。

算了,洗洗睡吧!!!

0x03 结尾

Java的xss审计都是自己琢磨,结合一下网上的文章,复现一下,很快就熟悉了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119922.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 光棍节程序员闯关秀过关全攻略(附带小工具)[通俗易懂]

    光棍节程序员闯关秀过关全攻略(附带小工具)[通俗易懂]光棍节程序员闯关秀过关全攻略。程序员的寂寞谁能懂?"SF光棍节程序员闯关秀"智力挑战小游戏火热上线,看看你能闯到第几关?游戏地址:http://segmentfault.com

  • Linux上安装Mysql

    Linux上安装MysqlLinux上安装MysqlLinux上安装MysqlLinux上安装软件常见的几种方式:使用yum进行安装修改密码及登录设置编码设置开机启动Linux上安装MysqlLinux上安装软件常见的几种方式:源码编译压缩包解压(一般为tar.gz)编译好的安装包(RPM、DPKG等)在线安装(YUM、APT等)以上几种方式便捷性依次增加,但通用性依次下降,比如直接下载压缩包进行解压,这种方式一般需要自己做一些额外的配置工作,但只要掌握了方法,各个平台基本都适用,YUM虽然简单,但是平台受限,网络

  • Navicat MySQL 激活码【中文破解版】

    (Navicat MySQL 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 二进制8进制10进制16进制代码_不同进制之间的转换

    二进制8进制10进制16进制代码_不同进制之间的转换为什么要使用进制数数据在计算机中的表示,最终以二进制的形式存在,就是各种&lt;黑客帝国&gt;电影中那些0101010…的数字;我们操作计算机,实际就是使用程序和软件在计算机上各种读写数据,如果我们直接操作二进制的话,面对这么长的数进行思考或操作,没有人会喜欢。C,C++语言没有提供在代码直接写二进制数的方法。用16进制或8进制可以…

  • linux sort命令 排序,Linux sort排序方法[通俗易懂]

    linux sort命令 排序,Linux sort排序方法[通俗易懂]在文件的操作过程中,因为文件过多,往往需要进行一下排序,排序方法也就是从小到大排序或者从大到小排序。比如我们从nginx日志中需要找到访问量最长的url,那就需要对请求时间进行一个排序,根据请求时间长短排序后在打印后面的url就能清楚的知道那个url有问题了,废话先不说,看方法:文件排序我们先说一下linux的sort命令,sort命令可以根据我们的需求完成从大到小或者从小到大的排序。注意:sor…

  • Html —— JavaScript全局变量问题

    Html —— JavaScript全局变量问题问题在项目开发中发现在使用不同位置的相同接口时,入参相同。解决在JavaScript中声明变量如果不写”let”,将声明为全局变量,即页面所有该名称数据保持一致。在声明变量时,前面加上”let”即可。//全局变量abc=”123″//局部变量letabc=”123″…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号