:你有聽過SQL Injection嗎?
:有阿
:那你知道怎麼防範嗎?
:參數化查詢、ORM...
:那你聽過ORM Injection嗎?
:= =
物件關聯對映 Object Relational Mapping 簡稱ORM,存在於資料庫和Model資料容器之間,可以讓開發者/使用者更簡單安全的去資料庫拿取資料,它是利用程式語言去操作資料庫語言,實現物件導向概念,同時把SQL的語法進行封裝的一種模式,而且通常會提供一組Safe Function來防止SQL Injection攻擊。但若使用者使用接受User input的自訂function,就特別容易遭到攻擊。
而ORM Injection就是對ORM generate的data access model進行注入。這種攻擊實際上跟SQL Injection很像,差別是ORM Injection是ORM Layer產生的程式碼中存在Injection漏洞。因此不會使用SQL語法進行攻擊。可參考: List of object–relational mapping software
ORM產生的object可以使用SQL或SQL的變種對資料庫進行CRUD(Create, Read, Update, Delete),但若是一個Web Application使用了未經檢查/處理的input參數,就可能受到這種攻擊。
Hibernate
這是一個2020年發現的漏洞,Hibernate是一個Java的ORM框架,可以讓Java開發者使用它來與MySQL、PostgreSQL互動,攻擊者可以透過利用特定的DBMS功能突破HQL語法,將HQL轉換為SQL語法
public static String doubleQuotes(String input) {
return input.replaceAll("'", "''");
上述的程式碼看起來已經正確的檢查已經清理(input.replaceAll),但攻擊者只要再'
前加上一個backslash\
就可以簡單的繞過限制如:attack\'
或是一個底層資料庫為Mysql而且允許FILE權限被資料庫用戶使用,就可以透過以下方法,從Escape HQL,注入SQL到最後的INTO OUTFILE寫入一個web shell:
100 or 6<>'\'' ) or 1=? into outfile "shell.jsp" -- - '
假設一個透過Hibernate查詢語法進行的SQL查詢注入:SELECT column FROM table WHERE id = <injection>
以下是網路上別人整理出來可以用於測試HQL Injection的Cheetsheet
也可以參考PayloadsAllTheThings/HQL Injection
Ruby on Rails ActiveRecord
Orders.find_all "customer_id = 123 AND order_date = '#{@params['order_date']}'"
只要往order_date發送OR 1--
就可以成功注入。
下篇預告: NAT Slipstreaming
真的很多人不知道ORM Injection
所以我去教育訓練都會講一下這個東西~
不過我實務上也沒用過ORM Injection成功利用漏洞QQ
Hi大大
我也沒有成功利用過XD,會寫這篇主要是因為SQLi太多人講了XD,想提一些比較不常被提起的攻擊(雖然很多算過時了)