看起來有問題的函式
我正在探索postgresql資料庫,我看到了一個反復出現的模式:我正在探索postgresql資料庫,我看到了一個反復出現的模式。
CREATE OR REPLACE FUNCTION paginated_class(_orderby text DEFAULT NULL, _limit int DEFAULT 10, _offset int DEFAULT 0)
RETURNS SETOF pg_class
LANGUAGE PLPGSQL
AS $$
BEGIN BEGIN $$
return query execute'
select * from pg_class
order by '|| coalesce (_orderby, 'relname ASC'/span>) ||'
限制1美元,偏移1美元
'
使用 _limit, _offset;
END;
$$;
示例用法:
SELECT * FROM paginated_class(_orderby: ='reltype DESC, relowner ASC' )
重復的是:
_orderby是以text的形式傳遞。它可以是回傳SETOF型別的欄位的任何組合。例如:'relname ASC, reltype DESC'。
_orderby引數沒有經過消毒或任何方式的檢查 。
_limit和_offset是整數 。
DB Fiddle用于此。https://www.db-fiddle.com/f/vF6bCN37yDrjBiTEsdEwX6/1
問題:這樣的函式是否容易被SQL注入?
通過外部跡象,我們可以懷疑這樣的函式容易受到SQL注入的攻擊。
但是,我所有試圖找到引陣列合的嘗試都失敗了。
例如:
CREATE TABLE T(id int)。
SELECT * FROM paginated_class(_orderby: ='reltype; DROP TABLE T; SELECT * FROM pg_class')。)
將回傳"查詢錯誤:錯誤:不能作為游標打開多查詢計劃"。
我沒有發現利用漏洞的方法,如果它存在于UPDATE/INSERT/DELETE。
那么我們是否可以得出結論,這樣的函式實際上是安全的?
如果是這樣:那么就可以得出這樣的結論。
如果是這樣:那么為什么?
更新。可能的攻擊計劃
也許我沒說清楚:我問的不是一般的指導方針,而是對漏洞的實驗性利用或證明這種利用是不可能的。DB Fiddle for this: https://www.db-fiddle.com/f/vF6bCN37yDrjBiTEsdEwX6/4(當然你也可以提供其他)
到目前為止,我的結論是
A. 如果_orderby有以下部分,這種攻擊就有可能:
SELECT的輸出select * from pg_class以便它滿足RETURNS SETOF pg_class例如:
SELECT * FROM paginated_class(_orderby: ='relname; DELETE FROM my_table; SELECT * FROM pg_class')
對于2和3來說很容易。我不知道有什么方法可以完成第一部分。
這將產生。"error: cannot open multi-query plan as cursor"
。B. 如果不可能抑制第一個SELECT
那么:
- 每個postgresql函式都在單獨的事務中作業 。
- 由于錯誤,該事務將被回滾 。
- 沒有像Oracle那樣的自主交易 。
- 對于非交易的操作。我只知道與序列有關的操作
- 其他一切,無論是DML還是DDL都是事務性的 。
那么?我們可以得出結論,這樣的功能實際上是安全的嗎?
或者我錯過了什么?
UPDATE 2. 使用準備好的函式進行攻擊
從答案https://stackoverflow.com/a/69189090/1168212A. 有可能實施拒絕服務攻擊,把昂貴的計算放進去
B.
B. 副作用:
如果你把有副作用的函式放到ORDER BY子句中,你也可能會修改資料。
讓我們來試試后者:
CREATE FUNCTION harmful_fn()
RETURNS bool
LANGUAGE SiS
AS '
DELETE FROM my_table;
SELECT true;
'。
SELECT * FROM paginated_class(_orderby: =' harmful_fn()', _limit:=1)。)
https://www.db-fiddle.com/f/vF6bCN37yDrjBiTEsdEwX6/8
是的。
因此,如果攻擊者有權利創建函式:非DOS攻擊也是可能的。
我接受Laurenz Albe的回答,但是:有沒有可能在沒有函式的情況下進行非DOS攻擊呢?
有什么建議嗎?
uj5u.com熱心網友回復:
不,那是不安全的。攻擊者可以通過_orderby引數將任何代碼放入你的ORDER BY子句。
例如,你可以傳遞一個任意的子查詢,只要它只回傳一條記錄。(SELECT max(i) FROM generate_series(1, 10000000000) AS i)。如果查詢費用足夠高的話,這很容易被用來進行拒絕服務攻擊。或者,像這個例子一樣,你可以用臨時檔案造成一個(短暫的)空間不足的情況。
如果你把一個有副作用的函式放到ORDER BY子句中,你也可能會修改資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308000.html
標籤:
