ibatis Order By注入問題
上週六單位被掃描出SQL隱碼攻擊漏洞
經過檢查,發現ibatis框架都可能出現這個問題.
如果有需求,讓你實現頁面grid所有欄位都能排序,你會怎麼做呢?
最簡單的做法就是從頁面把欄位名,排序型別傳回來,然後拼接在SQL裡面.(在使用EasyUI前端框架的時候,這樣做非常容易)
然後修改ibatis框架,將order by #排序欄位# #排序型別#改為 order by $排序欄位$ $排序型別$
實現所謂的動態查詢,就像下面的連結所寫的
http://blog.sina.com.cn/s/blog_4dacfb0101016y6b.html
實驗模擬這個過程,
create table t (id int primary key ,name varchar(20),grade int);
insert into t values(1,'edmond',1);
insert into t values(2,'edmond',2);
insert into t values(3,'edmond',1);
insert into t values(4,'edmond',3);
insert into t values(5,'edmond',1);
insert into t values(6,'edmond',5);
上面的程式碼模擬了ibatis使用$符號實現動態排序查詢的場景.執行結果如下
可以看到上述程式碼存在注入漏洞
如果對引數order注入如下內容,即可以作為暴力攻破帳號密碼的方式,又可以使用sleep掛起資料庫.
String order = "desc,(select if(substring(user(),1,2)='xx',sleep(4),-1))";
攻擊方式參考:
如何避免注入攻擊,並且用ibatis實現動態排序查詢呢?
我感覺可以使用受控注入的方式.(自己想的一個名詞)
在監聽器中獲取資料庫所有的列名稱,然後使用AOP攔截DAO層的方法,
將前臺傳入的引數,對比監聽器中獲取的資料庫列名稱,如果沒有任何匹配,則直接報錯,或者給一個預設的排序
ibatis的SQL還是使用$符號的方式.
模擬程式碼如下
可以看到,在DAO層攔截之後,在daoProxy中已經過濾了注入攻擊.
這樣即可以保證安全,又可以讓程式碼優雅.
經過檢查,發現ibatis框架都可能出現這個問題.
如果有需求,讓你實現頁面grid所有欄位都能排序,你會怎麼做呢?
最簡單的做法就是從頁面把欄位名,排序型別傳回來,然後拼接在SQL裡面.(在使用EasyUI前端框架的時候,這樣做非常容易)
然後修改ibatis框架,將order by #排序欄位# #排序型別#改為 order by $排序欄位$ $排序型別$
實現所謂的動態查詢,就像下面的連結所寫的
http://blog.sina.com.cn/s/blog_4dacfb0101016y6b.html
實驗模擬這個過程,
create table t (id int primary key ,name varchar(20),grade int);
insert into t values(1,'edmond',1);
insert into t values(2,'edmond',2);
insert into t values(3,'edmond',1);
insert into t values(4,'edmond',3);
insert into t values(5,'edmond',1);
insert into t values(6,'edmond',5);
-
public class Test {
-
private static String URL = "jdbc:mysql://127.0.0.1:3306/mvbox";
-
private static String USERNAME = "xx";
-
private static String PWD = "xx";
-
-
public static void main(String[] args) throws Exception {
-
//模擬從頁面傳輸過來的引數
-
String name = "edmond";
-
String sort = "grade";
-
String order = "desc";
-
dao(name, sort, order);
-
}
-
- private static void dao(String name, String sort, String order) throws Exception {
-
Class.forName("com.mysql.jdbc.Driver");
-
Connection con = DriverManager.getConnection(URL, USERNAME, PWD);
-
PreparedStatement ps = con.prepareStatement("select id,name,grade from t where name=? order by " + sort + " " + order);
-
ps.setString(1, name);
-
ResultSet rs = ps.executeQuery();
-
while (rs.next()) {
-
System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t" + rs.getInt(3));
-
}
-
con.close();
-
}
- }
可以看到上述程式碼存在注入漏洞
如果對引數order注入如下內容,即可以作為暴力攻破帳號密碼的方式,又可以使用sleep掛起資料庫.
String order = "desc,(select if(substring(user(),1,2)='xx',sleep(4),-1))";
攻擊方式參考:
如何避免注入攻擊,並且用ibatis實現動態排序查詢呢?
我感覺可以使用受控注入的方式.(自己想的一個名詞)
在監聽器中獲取資料庫所有的列名稱,然後使用AOP攔截DAO層的方法,
將前臺傳入的引數,對比監聽器中獲取的資料庫列名稱,如果沒有任何匹配,則直接報錯,或者給一個預設的排序
ibatis的SQL還是使用$符號的方式.
模擬程式碼如下
-
import java.sql.Connection;
-
import java.sql.DriverManager;
-
import java.sql.PreparedStatement;
-
import java.sql.ResultSet;
-
import java.sql.SQLException;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
public class Test {
-
private static String URL = "jdbc:mysql://127.0.0.1:3306/mvbox";
-
private static String USERNAME = "xx";
-
private static String PWD = "xx";
-
-
private static List<String> fieldList = new ArrayList<String>();
-
-
private static void getAllField() throws Exception {
-
Class.forName("com.mysql.jdbc.Driver");
-
Connection con = DriverManager.getConnection(URL, USERNAME, PWD);
-
PreparedStatement ps = con
-
.prepareStatement("select column_name from information_schema.columns where table_schema not in ('information_schema','test','mysql','information_schema')");
-
ResultSet rs = ps.executeQuery();
-
while (rs.next()) {
-
fieldList.add(rs.getString(1));
-
}
-
rs.close();
-
ps.close();
-
con.close();
-
}
-
-
public static void main(String[] args) throws Exception {
-
// 模擬監聽器啟動
-
getAllField();
-
// 模擬從頁面傳輸過來的引數
-
String name = "edmond";
-
String sort = "grade";
-
String order ="desc,(select if(substring(user(),1,2)='xx',sleep(4),-1))";
-
daoProxy(name, sort, order);
-
}
-
-
private static void daoProxy(String name, String sort, String order)
-
throws Exception {
-
if (fieldList.contains(sort)
-
&& (order.toLowerCase().equals("desc") || order.toLowerCase()
-
.equals("asc"))) {
-
dao(name, sort, order);
-
} else {
-
// 記錄日誌,進行錯誤處理
-
System.out.println("駭客,你媽媽喊你回家吃飯");
-
}
-
}
-
-
private static void dao(String name, String sort, String order)
-
throws Exception {
-
Class.forName("com.mysql.jdbc.Driver");
-
Connection con = DriverManager.getConnection(URL, USERNAME, PWD);
-
PreparedStatement ps = con
-
.prepareStatement("select id,name,grade from t where name=? order by "
-
+ sort + " " + order);
-
ps.setString(1, name);
-
ResultSet rs = ps.executeQuery();
-
while (rs.next()) {
-
System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t"
-
+ rs.getInt(3));
-
}
-
con.close();
-
}
- }
這樣即可以保證安全,又可以讓程式碼優雅.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1318239/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 再看ibatis Order By注入問題BAT
- ibatis分頁問題BAT
- MyBatis order by失效問題MyBatis
- Ibatis相容性問題BAT
- ibatis sqlmaping的問題BATSQLAPI
- 抓狂的ibatis中文問題BAT
- iBatis問題,救命啊!!!急急急!!!BAT
- 請教關於ibatis的問題BAT
- mysql order by 和 group by 順序問題MySql
- Ibatis的疑問BAT
- MySql5.7及以上 ORDER BY 報錯問題MySql
- 關於maven import org.apache.ibatis.io.Resources中ibatis包不存在問題MavenImportApacheBAT
- SpringJdbcDaoSupport的注入問題JdbcTempleSpringJDBC
- Ibatis 中文條件查詢不到資料問題BAT
- MySQL order by limit 分頁資料重複問題MySqlMIT
- 【SQL 學習】排序問題之order by與索引排序SQL排序索引
- 關於Ibatis 轉換 oracle date型別的問題BATOracle型別
- sqli-Labs————less-46(order by 之後的注入)SQL
- 〖使用iBatis做select後不提交也不回滾問題〗BAT
- SQL中rownum和order by的執行順序的問題SQL
- 【MySQL】order by 結果不準確的問題及解決MySql
- 如何解決sql注入安全漏洞問題SQL
- 遠端執行緒注入引出的問題執行緒
- Action注入屬性值、字尾以及常量問題
- 在學習Mybatis時遇見的問題 org.apache.ibatis.exceptions.PersistenceException:MyBatisApacheException
- Java ibatis配置問題導致Myeclipse啟動web專案失敗JavaBATEclipseWeb
- ibatisBAT
- 對於Spring中注入物件失敗的問題Spring物件
- 監聽器中spring注入相關的問題Spring
- php注入專題PHP
- Mybatis中org.apache.ibatis.binding.BindingException錯誤問題總結MyBatisApacheException
- [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains 的問題 MySQLExpressAIMySql
- 解決Spring中singleton中注入prototype Bean的問題SpringBean
- 題解 CF993E 【Nikita and Order Statistics】
- ibatis 使用文件BAT
- ibatis的CURDBAT
- ibatis配置例子BAT
- 讀了ibatis的jpetstore源程式,有個關於synchronized的問題請教一下BATsynchronized