java中response传回来的message没有值_java_security_calendar_2019(day13day16)

本文详细介绍了四个Java web安全问题。在Day13中,揭示了上传漏洞并利用用户可控文件名获取webshell。Day14讨论了DDE漏洞,可以通过构造特定的数据触发命令执行。Day15分析了命令执行漏洞,虽然不能直接执行常见命令,但通过find -exec的特殊用法可以绕过限制。最后在Day16中,发现了一个HQL注入漏洞,描述了如何通过转义字符绕过输入验证进行攻击。
摘要由CSDN通过智能技术生成

Day13

示例代码:

public class UploadFileController extends HttpServlet {
  protected void doPost(HttpServletRequest request,
                        HttpServletResponse response) throws IOException {
    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
    ServletFileUpload upload = new ServletFileUpload(factory);

    String uploadPath = getServletContext().getRealPath("") + "upload";
    File uploadDir = new File(uploadPath);
    if (!uploadDir.exists()) {
      uploadDir.mkdir();
    }
    try {
      List items = upload.parseRequest(request);if (items != null && items.size() > 0) {for (FileItem item : items) {if (!item.isFormField()) {if (!(item.getContentType().equals("text/plain"))) {throw new Exception("ContentType mismatch");
            }
            String file = uploadPath + File.separator + item.getName();
            File storeFile = new File(file);
            item.write(storeFile);
          }
        }
      }
    } catch (Exception ex) {
      response.sendRedirect("/");
    }
  }
}

初步看到代码是上传漏洞,只对ContentType的值做了校验,轻松绕过。可是上传文件后,发现并没有返回路径。

e027e853fe2da845bb31dd9a16c4d186.png

然后看到"String file = uploadPath + File.separator + item.getName();",此处的文件名用户可控,且未做任何过滤,可通过"../"来控制上传路径,从而获取webshell。

上传webshell,post包部份数据如下:

ntent-Disposition: form-data; name="filename"; filename="../shell.jsp"
Content-Type: text/plain

0905cd4b05eb21e7d67713bb2c6b8274.png

成功收到shell。

e5c1440bda4476972276421330b41383.png

Day14

示例代码:

import java.io.PrintWriter;
import java.util.*;
import javax.servlet.http.*;

public class Export extends HttpServlet {
  protected void doPost(HttpServletRequest request,
                        HttpServletResponse response) throws IOException {
    response.setContentType("text/csv");
    response.setCharacterEncoding("UTF-8");
    PrintWriter out = response.getWriter();

    String content = buildCSV(request);
    out.print(content);
    out.flush();
  }

  public String buildCSV(HttpServletRequest request) {
    {
      StringBuilder str = new StringBuilder();

      List> rows = Arrays.asList(
        Arrays.asList("Scott", "editor", request.getParameter("description"))
      );
      str.append("Name");
      str.append(",");
      str.append("Role");
      str.append(",");
      str.append("Description");
      str.append("\n");for (List rowData : rows) {
        str.append(String.join(",", rowData));
        str.append("\n");
      }return str.toString();
    }
  }
}

该示例代码为dde漏洞,响应的数据格式为"text/csv"格式,在传入的数据中,参数"description"可控,可构造以"=""-"打头的恶意语句,如:"description==cmd |'/C calc' !A0"
执行结果:

1105f0e57f8b6df3bef3933041cb0c5e.png

Day15

示例代码:

public class FindOnSystem extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        try {
            String[] binary = {"find", ".", "-type", "d"};
            ArrayList cmd = new ArrayList<>(Arrays.asList(binary));
            String[] options = request.getParameter("options").split(" ");for (String i : options) {
                cmd.add(i);
            }
            ProcessBuilder processBuilder = new ProcessBuilder(cmd);
            Process process = processBuilder.start();
            IOUtils.copy(process.getInputStream(),response.getOutputStream());
        } catch(Exception e) {
            response.sendRedirect("/");
        }
    }
}

看到敏感的方法"processBuilder.start()",典型的命令执行漏洞。可发现"options"传入的值全部拼接在find命令后,尝试"; pwd""||""&&"等常见命令,发现都不能返回正常结果,(但是在终端可以正常执行,不是很明白为啥)。看了下官方提示,使用的是"options=-exec pwd ;"  ,可正常执行。

注find -exec用法:"find ./ -type f -exec ls -l {} \;" 。以; 为结束标志,由于各个系统中分号会有不同的意义,因此在前面加上反斜杠。{} 代表前面find查找出来的文件名

执行结果:

9f85a630e032863601a3420d1b50a1a1.png

Day16

示例代码:

UserEntity.java

@Entity
@DynamicUpdate
@Table(name = "UserEntity", uniqueConstraints = {
        @UniqueConstraint(columnNames = "ID"),
        @UniqueConstraint(columnNames = "EMAIL") })
public class UserEntity implements Serializable {
  public UserEntity(String email, String firstName, String lastName) {
    this.email = email;
    this.firstName = firstName;
    this.lastName = lastName;
  }

  private static final long serialVersionUID = -1798070786993154676L;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "ID", unique = true, nullable = false)
  private Integer userId;

  @Column(name = "EMAIL", unique = true, nullable = false, length = 100)
  private String email;

  @Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100)
  private String firstName;

  @Column(name = "LAST_NAME", unique = false, nullable = false, length = 100)
  private String lastName;
}

FindController.java

public class FindController {
  public String escapeQuotes(String in){
    return in.replaceAll("'","''");
  }

  @RequestMapping("/findUsers")
  public void findUsers(@RequestParam(name="name") String name, HttpServletResponse res) throws IOException{
    Configuration config = new Configuration();
    // Create SessionFactory with MySQL driver
    SessionFactory sessionFactory = config.configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    List  users = session.createQuery("from UserEntity where FIRST_NAME ='" + escapeQuotes(name) + "'", UserEntity.class).list();
    res.getWriter().println("Found " + users.size() + " Users with that name");
  }
}

给出了两个java文件,第一个主要是实体的创建,忽略掉。在FindController文件中,sql语句为"from UserEntity where firstName ='" + escapeQuotes(name) + "'",确定为hql注入漏洞。在用户传入的"name"参数,只通过escapeQuotes方法将"'"替换成了"''",和Hibernate处理字符串文字的单引号方法一致,都是对其进行转义。此时可通过转义"'"的方式绕过限制。

构造payload,执行结果:

d081ccb36afa68ff48b8b971e9e5ce79.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值