wuyan 发表于 2016-12-21 20:04:54

铁人下载系统代码审计

搞搞java代码审计,发现和php还是有很多不一样的地方。php真是一门神奇的语言,很多有趣的漏洞在java这里没有出现。
1.安装问题
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/5575903-file_1482315986210_2734.png
没有删除安装页面,老生常谈的重复安装 ### 2.注入问题 先测试下基本的功能,试试搜索
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/71117441-file_1482316376194_d594.png
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/59745214-file_1482316471583_5299.png
找到so.jsp ,跟踪发现被带入
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/27863671-file_1482316560016_da48.png
发编译找到Ruanjianguanli,找到so函数
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/32393347-file_1482316583707_6be8.png
ruanjianDao其实是个接口,说明ruanjianDao向上转型了。继续找到实现接口的类RuanjianMySQL,然后找到其so函数 很遗憾的看到了prepareStatement,prepareStatement基本不能注入,Statement可以注入
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/22227619-file_1482316621823_11c1a.png
全局搜索用Statement的地方

全局搜索一下 RuanjianMysql.java中 Chaxun函数 Zuixin函数 Tuijian函数 Paixing函数 Chuang函数 只有一处调用了 看样子是管理后台,这个后台的就不用管了,你都能进后台了还要啥注入,除非root权限写 shell
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/9609826-file_1482316743670_fb3d.png
Zuixin倒是不需要后台操作,但是却是写死了,每处都写死了。
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/40085320-file_1482316767324_e7f6.png
找到Tuition的时候找到一处
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/98784891-file_1482316791727_3fcd.png
白白激动了,一个写成12,一个int化了
<% int pageNo = 1; int pageSize = 12; String strpageNo = request.getParameter("pageNo"); if(strpageNo != null && !strpageNo.equals("")) { pageNo = Integer.parseInt(strpageNo); } pageModel pagemodel = Ruanjianguanli.getInstance().Tuijian(pageNo,pageSize); %>
试了几个常见的函数还是不行 登录注册都藏试过了,注册会员之后,功能也是少的出奇,会员的功能都是用的是防止注入的 看了那几个函数,调用的时候都是在管理员后台。所以基本注入无望。
3.测试后台未授权
访问的后台的时候直接,跳转到
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/49060729-file_1482316912494_6775.png
翻看到过滤器
if(bl && (session == null || session.getAttribute("admin") == null)) { response.sendRedirect((new StringBuilder(String.valueOf(request.getContextPath()))).append("/buzai.htm").toString()); return; }
无果。 ### 4.xss测试 由于功能实在是简单,只有一处须改用户资料的地方,也就修改邮箱是有XSS的
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/25020621-file_1482316977767_6676.png
5.CSRF漏洞
随处可见,这个就不演示了
6.上传getshell
上传处的代码
res.setContentType(“text/html; charset=GB2312”); PrintWriter out = res.getWriter(); DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(4096); File tempPath = new File((new StringBuilder(String.valueOf(getServletContext().getRealPath(“/”)))).append(“temp/”).toString()); factory.setRepository(tempPath); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(0xf4240L); String date = “”; try { List fileItems = upload.parseRequest(req); Iterator iter = fileItems.iterator(); String regExp = “.+\\(.+)$”; String errorType[] = { “.exe”, “.com”, “.cgi”, “.asp” }; Pattern p = Pattern.compile(regExp); while(iter.hasNext()) { FileItem item = (FileItem)iter.next(); if(item.isFormField() && item.getFieldName().equals(“date”)) date = item.getString(); if(!item.isFormField()) { String name = item.getName(); long size = item.getSize(); if(name != null && !name.equals(“”) || size != 0L) { Matcher m = p.matcher(name); boolean result = m.find(); if(result) { for(int temp = 0; temp < errorType.length; temp++) if(m.group(1).endsWith(errorType)) throw new IOException((new StringBuilder(String.valueOf(name))).append(“: wrong type”).toString());

                        try
                        {
                            item.write(new File((new StringBuilder(String.valueOf(getServletContext().getRealPath("/")))).append("images/youqing/").append(date).append(".gif").toString()));
                            res.sendRedirect((new StringBuilder("../admin/left7/chenggong3.jsp?")).append(date).append(".gif").toString());
                        }
                        catch(Exception e)
                        {
                            out.println(e);
                        }
                  } else
                  {
                        throw new IOException("fail to upload");
                  }
                }
            }
      }
    }
    catch(IOException e)
    {
      out.println(e);
    }
    catch(FileUploadException e)
    {
      out.println(e);
    }

简单解释下这段代码逻辑 List fileItems = upload.parseRequest(req);

解析所有请求参数并放到一个list里面,同时对上传的文件名有个正则判断
String regExp = ".+\\\\(.+)$"; 文件名必须是xxx\xxx的形式,这个可以抓包然后改 if(m.group(1).endsWith(errorType)) throw new IOException((new StringBuilder(String.valueOf(name))).append(": wrong type").toString()); 文件名不能以errorType数组里面的字符结尾,最后上传生成的文件以gif结尾。
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/79891173-file_1482320132003_13512.png

shell躺在那
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/26502736-file_1482320169923_2e5b.png
看看过滤器,发现根本没有任何权限限制,于是就可以直接上传getshell了。
http://ohsqlm7gj.bkt.clouddn.com/16-12-21/33316995-file_1482320336289_d0e4.png

ps:转载请标明作者b5mali4和出处http://www.codersec.net/2016/12/%E9%93%81%E4%BA%BA%E4%B8%8B%E8%BD%BD%E7%B3%BB%E7%BB%9F%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/

















秋凉雨夜 发表于 2016-12-21 21:15:15

学习了。感谢分享~

w2015 发表于 2016-12-21 23:23:02

java的代码审计,好高大上!

90_ 发表于 2016-12-21 23:27:45

上传的那个233.gif不错……

小丑s 发表于 2017-1-1 03:06:42

谢谢楼主的分享
页: [1]
查看完整版本: 铁人下载系统代码审计