java代碼學習(三)——sql注入


  javasql注入一般是在兩個場景下會產生,一個是JDBC未對參數進行過濾,一個是對mybatis使用${}來進行傳參。讓我們先來了解一下JDBC

  在幾年前框架還未盛行的時候,很多cms和項目都是采用JDBC進行數據庫連接和獲取數據的。在使用JDBC時,代碼中如果存在拼接SQL語句,就有可能產生注入,例如:

    String sql = "SELECT * FROM users WHERE name ='"+ name + "'";

    Statement stmt = connection.createStatement();

    ResultSet rs = stmt.executeQuery(sql);

  而注入一般的防御方法都是采用預編譯,利用占位符?來對參數進行類型的綁定。JDBC中使用的是PreparedStatement

    String sql = "SELECT * FROM users WHERE name= ? ";

    PreparedStatement ps = connection.prepareStatement(sql);

注:1、例如order bycolumn name需要手工過濾,可以使用白名單的方式來限制參數值

  2、在使用 PreparedStatement 之前,存在拼接 sql 語句,仍然會導致注入

  現在java開發大部分使用ssm框架來進行開發,m即是mybatis。在 MyBatis 中,使用 XML 文件 或 Annotation 來進行配置和映射,將 interfaces Java POJOs (Plain Old Java Objects) 映射到 database records

  MyBatis 使用 #{}  ${} 來進行參數值替換。使用 #{} 語法時,MyBatis 會自動生成 PreparedStatement ,使用參數綁定 (?) 的方式來設置值。而使用 ${} 語法時,MyBatis 會直接注入原始字符串,即相當於拼接字符串,因而會導致 SQL 注入。

  如需使用${}時,可進行白名單過濾,在xml文件中設置一個if判斷。如

    SELECT * FROM user

    <if test="xxx == 'name' or xxx == 'email'"> order by ${xxx} </if>

在若依4.6.2版本中,就存在${}的注入漏洞。

 

 

 

  入口處在,可以看出訪問地址是system/role/list,一個后台注入漏洞,調用了roleServiceselectRoleList進行處理。

 

  接着直接查看sql語句的執行即可,一般都會存在xml的執行語句

 

 

 

  可以看出,最后一行使用了${}對參數進行處理,了解過ssm框架防注入的都知道,這種情況是存在注入的。

 

 

 

  后台角色管理處,抓包修改

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM