SMBMS代码审计

1. xss漏洞

先知社区-知识来源

这个xss在head.jsp文件的标签里,获取了请求头的Referer参数在前端显示了 可以使用payload进行闭合操作,进行闭合操作

"><img src=x onerror=alert(1)>

这个payload在应该经过过滤器的时候就被拦截,因为jsp的本质是servlet所以是经过后端的但是过滤器没有进行拦截。

1.1 xss漏洞

在找xss漏洞的时候可以先查看回显处 找到了键与值 全局搜索这个键 找到了方法名和变量名 再看看这变量做了什么 关联了键与值的关系然后发送到billlist.jsp现在就找query这个方法的所属类然后请求这个模块就行了 在全局搜索下这个请求的方法 Alternate 首先需要是GET,参数是method值是query 可以先构造payload了

    请求方式+路径+方法名+值+键+payload
    GET /网站根目录/jsp/bill.do?method=query&queryProductName="><img src=x onerror=alert(1)>

Alternate

1.3 存储xss漏洞

先找到回显位置 Alternate 再找到这个方法 Alternate Alternate 可以看到提交,方式方法 Alternate 在初始化了Bill(),并且把billcode设置成bill()私有的成员变量,而且是String类型可以输入数据 Alternate 然后就是初始化数据库class然后添加数据。 Alternate BillServiceImpl()调用了dao层的BillDaoImpl()。启用了预编译的功能,现在需要确保这个smbms_bill表的billcode输入的不是int类型数据就可以进行xss注入了 Alternate 输入的字符类型,但是只能输入长度是20的payload Alternate

漏洞复现

危害没多大就写出来图一乐吧。 因为payload长度的变化如果直接闭合标签的话就会长度不够导致失败,所以要找新的可以触发html事件的xss位置,全局搜索找到<a标签>。 触发事件可以节省payload Alternate 然后寻找提交方。显然GET\POST都行,反正都会调用doGET()。我建议使用网页提交因为参数很多,而且有缺少的参数就会报错。

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");
        if(method != null && method.equals("query")){
            this.query(req,resp);
        }else if(method != null && method.equals("add")){
            this.add(req,resp);
        }else if(method != null && method.equals("view")){
            this.getBillById(req,resp,"billview.jsp");
        }else if(method != null && method.equals("modify")){
            this.getBillById(req,resp,"billmodify.jsp");
        }else if(method != null && method.equals("modifysave")){
            this.modify(req,resp);
        }else if(method != null && method.equals("delbill")){
            this.delBill(req,resp);
        }else if(method != null && method.equals("getproviderlist")){
            this.getProviderlist(req,resp);
        }
    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
""+onclick=alert(1)>

2、密码重置漏洞

分析下修改密码的方法 注意三个点,第一是通过session来判断用户的,第二数据包里收一个值newpassword,第三newpassword不为空就可以影响flag的判断并影响最结果。 显然如果是修改自己的密码就太鸡肋了,可以看到数据包没有token,我们可以使用csrf提升危害。


知识星球