iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0

前言

:你有聽過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參數,就可能受到這種攻擊。

Case Study

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


上一篇
[Day8] HTTP Response Splitting - HTTP回應拆分
下一篇
[Day10 ] NAT Slipstreaming
系列文
讓Web開發者森77的Hacking Trick30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
HackerCat
iT邦新手 2 級 ‧ 2021-10-03 21:56:52

真的很多人不知道ORM Injection
所以我去教育訓練都會講一下這個東西~

不過我實務上也沒用過ORM Injection成功利用漏洞QQ

克雷格 iT邦新手 4 級 ‧ 2021-10-03 22:13:32 檢舉

Hi大大

我也沒有成功利用過XD,會寫這篇主要是因為SQLi太多人講了XD,想提一些比較不常被提起的攻擊(雖然很多算過時了)

我要留言

立即登入留言