• Java代码审计之不安全的Java代码


    ​ 在打靶场的同时,需要想一下如果你是开发人员你会怎样去防御这种漏洞,而作为攻击方你又怎么去绕过开发人员的防御。

    环境搭建

    GitHub - j3ers3/Hello-Java-Sec: ☕️ Java Security,安全编码和代码审计

    SQL注入

    SQLI(SQL Injection), SQL注入是因为程序未能正确对用户的输入进行检查,将用户的输入以拼接的方式带入SQL语句,导致了SQL注入的产生。攻击者可通过SQL注入直接获取数据库信息,造成信息泄漏。

    SQL注入之JDBC注入

    ​ JDBC有两个方法执行SQL语句,分别是PrepareStatement和Statement。

    漏洞代码:

    1. // 采用原始的Statement拼接语句,导致漏洞产生
    2. public String jdbcVul(String id) {
    3. StringBuilder result = new StringBuilder();
    4. try {
    5. Class.forName("com.mysql.cj.jdbc.Driver");
    6. Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);
    7. Statement stmt = conn.createStatement();
    8. // 拼接语句产生SQL注入
    9. String sql = "select * from users where id = '" + id + "'";
    10. ResultSet rs = stmt.executeQuery(sql);
    11. while (rs.next()) {
    12. String res_name = rs.getString("user");
    13. String res_pass = rs.getString("pass");
    14. String info = String.format("查询结果 %s: %s", res_name, res_pass);
    15. result.append(info);
    16. }

    漏洞代码二:

    1. // PrepareStatement会对SQL语句进行预编译,但有时开发者为了便利,直接采取拼接的方式构造SQL,此时进行预编译也无用。
    2. Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);
    3. String sql = "select * from users where id = " + id;
    4. PreparedStatement st = conn.prepareStatement(sql);
    5. System.out.println("[*] 执行SQL语句:" + st);
    6. ResultSet rs = st.executeQuery();

    SQL注入之MyBatis

    ​ MyBatis框架底层已经实现了对SQL注入的防御,但存在使用不当的情况下,仍然存在SQL注入的风险。

    漏洞代码:

    1. // 此漏洞出现频率较高并且很严重!
    2. // 为何产生:由于使用 #{} 会将对象转成字符串,形成 order by "user" desc 造成错误,因此很多研发会采用${}来解决,从而造成SQL注入
    3. // 点击运行可通过报错语句获取数据库user
    4. @RequestMapping("/mybatis/vul/order")
    5. public List<User> orderBy(String field, String sort) {
    6. return userMapper.orderBy(field, sort);
    7. }
    8. // mapper.xml语句
    9. <select id="orderBy" resultType="com.best.hello.entity.User">
    10. select * from users order by ${field} ${sort}
    11. </select>

    漏洞代码二:

    1. // 模糊搜索时,直接使用'%#{q}%' 会报错,部分研发图方便直接改成'%${q}%'从而造成注入
    2. @Select("select * from users where user like '%${q}%'")
    3. List<User> search(String q);
    4. // 安全代码,采用concat
    5. @Select("select * from users where user like concat('%',#{q},'%')")
    6. List<User> search(String q);

    文件上传

    ​ 文件上传漏洞,是指用户上传了一个可执行的脚本文件(如jsp\php\asp),并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,这种漏洞属于低成本高杀伤力

    漏洞代码:

    1. // 允许上传任意文件导致的安全风险
    2. public String singleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
    3. try {
    4. byte[] bytes = file.getBytes();
    5. Path dir = Paths.get(UPLOADED_FOLDER);
    6. Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
    7. Files.write(path, bytes);
    8. redirectAttributes.addFlashAttribute("message","上传文件成功:" + path + "");
    9. } catch (Exception e) {
    10. return e.toString();
    11. }
    12. return "redirect:upload_status";
    13. }

    目录遍历

    ​ 目录遍历, 应用系统在处理下载文件时未对文件进行过滤,系统后台程序程序中如果不能正确地过滤客户端提交的../和./之类的目录跳转符,攻击者可以通过输入../进行目录跳转&#x

  • 相关阅读:
    Flink / SQL - 7.一文搞懂常规 Sql TopN 与 Sql Window TopN
    Java代码实现不同应用系统中数据同步程序
    2018版USBASP烧录器改通用版教程
    踩了个DNS解析的坑,但我还是没想通
    计数排序(Counting Sort)详解
    创新案例分享 | 建立校园大数据治理评价平台,高效提高教学效率与质量
    Lambda表达式 ( Java 8新特性 )
    vue的函数式组件
    I/O 模型解析
    ResNet网络学习笔记。
  • 原文地址:https://blog.csdn.net/ch98000/article/details/126889893