2014-05-16 28 views
0

假設ColdFusion 10,0,13,287689和Oracle數據庫11g企業版版本11.2.0.2.0 - 64位生產。ColdFusion和Oracle SQL注入示例

有了這個例子...

<cfquery name="q" datasource="ds"> 
    update someTable set 
    #form.col#label = <cfqueryparam cfsqltype="cf_sql_varchar" value="#x#"> 
    where id = <cfqueryparam cfsqltype="cf_sql_decimal" value="#id#"> 
</cfquery> 

而且假設沒有數據驗證在#form.col#檢查,怎麼會這樣被利用?很明顯,他們可能會導致查詢失敗,並顯示一個無效的列,但我不認爲有任何辦法可以做更惡意的事情,因爲多個語句不能在單個<cfquery>中運行。因此,像這樣沒有工作...

#form.col#:

id = 1; delete from users; --comment everything else out... 

我知道,有選擇它更容易使用工會讓你無權查看的數據開採,但我對這個具體的更新聲明感到好奇。

+0

那麼...你在問什麼? – fyroc

+0

有沒有可能利用這個?我知道我可以使查詢失敗,但我沒有看到如何運行任何其他UPDATE,DELETE或SELECT。 – gfrobenius

+0

我可能是錯的,但這會被視爲代碼審查? – fyroc

回答

5

雖然傳統的SQL注入示例涉及順序SQL語句,但這只是一個簡單示例,用於突出顯示問題 - 如果任何查詢中的任何位置都允許未受保護的用戶派生文本,攻擊者就有可能使使用它。

在這個具體的例子,您的查詢是:

update someTable 
set #form.col#label = ? 
where id = ?` 

要濫用這種很簡單 - 喜歡的東西前綴一個真正col值:

public_column = (SELECT badly_encrypted_password 
FROM users WHERE username='admin'), <orig_value> 

得到的SQL則是:

update someTable 
set public_column = (SELECT badly_encrypted_password FROM users WHERE username='admin') 
    , <orig_value>label = ? 
where id = ?` 

哪一個當然會將該列的值設置爲s的結果ub-query,然後在另一個區域單獨選擇然後無意中返回敏感數據。

另外,攻擊者可能只是簡單地使用這種方法來破壞/刪除數據,並且根據Oracle的SQL語法允許的內容,也可能會有其他事情。

+0

除了在'form.col'上做一大堆數據驗證之外,還有一種方法可以防止出現這種情況嗎? – Jarede