我們?nèi)绾伪Wo(hù)我們的代碼不受黑客和不良行為的影響键思?
SQL注入是一個(gè)網(wǎng)絡(luò)安全漏洞衩藤,攻擊者可以利用它更改對數(shù)據(jù)庫的SQL查詢。這可用于檢索一些敏感信息驳糯,例如數(shù)據(jù)庫結(jié)構(gòu)篇梭,表,列及其基礎(chǔ)數(shù)據(jù)酝枢。
例如恬偷,假設(shè)應(yīng)用程序使用以下查詢來獲取某人的登錄詳細(xì)信息:
SELECT USERNAME,PASSWORD from USERS where USERNAME='<username>' AND PASSWORD='<password>';
這里,username
和password
是由用戶提供的輸入帘睦。假設(shè)攻擊者' OR '1'='1
在兩個(gè)字段中都給出了輸入袍患。因此,SQL查詢將類似于:
SELECT USERNAME,PASSWORD from USERS where USERNAME='' OR '1'='1' AND PASSWORD='' OR '1'='1';
該查詢產(chǎn)生一個(gè)正確的語句竣付,因此用戶登錄诡延。此示例描述了SQL注入的最基本類型。
SQL注入可用于任何地方以從數(shù)據(jù)庫中獲取任何敏感信息卑笨。
注意:這是最基本的示例孕暇,僅用于理解目的。在現(xiàn)實(shí)世界中赤兴,您幾乎找不到任何此類案例妖滔。
您可以使用此備忘單來查看如何在不同的SQL數(shù)據(jù)庫提供程序上進(jìn)行查詢。
如何檢測SQ??L注入的存在桶良?
在大多數(shù)情況下座舍,SQL注入可以很容易地通過提供無效參數(shù),如檢測到'
陨帆,'' a' or 1=1--
曲秉,"a"" or 1=1--"
采蚀,or a = a
,a' waitfor delay '0:0:10'--
承二,1 waitfor delay '0:0:10'--
榆鼠,%26
,' or username like '%
亥鸠,等你可以再觀察應(yīng)用程序的行為變化妆够。
您可以嘗試分析服務(wù)器響應(yīng)的長度以及發(fā)送響應(yīng)所花費(fèi)的時(shí)間。諸如'
负蚊,a' or 1=1--
等的有效負(fù)載可能會顯示數(shù)據(jù)庫服務(wù)器響應(yīng)中的更改神妹。但是,如果沒有變化家妆,那么我們嘗試使用像這樣的有效負(fù)載觸發(fā)時(shí)間延遲a' waitfor delay '0:0:10'--
鸵荠。這可能會使服務(wù)器在發(fā)送響應(yīng)之前延遲特定時(shí)間。
確定網(wǎng)站是否容易受到攻擊后SQL Injection
伤极,我們可以嘗試從數(shù)據(jù)庫中提取一些敏感信息蛹找。
在此之前,我們需要確定number of columns
SQL查詢返回的內(nèi)容塑荒。這很重要熄赡,因?yàn)槿绻覀儑L試提取的列數(shù)與查詢實(shí)際返回的列數(shù)不相等,那么它將返回錯(cuò)誤齿税。
我們可以使用order by
命令確定列數(shù)。例如:
[www.onlineshopping.com/products.php?pid=8](http://www.onlineshopping.com/products.php?pid=8) order by 1 -- //
www.onlineshopping.com/products.php?pid=8 order by 2 -- //// If the parameter is a string then you need to add ' after it.www.onlineshopping.com/products.php?usr=b' order by 3 -- //
www.onlineshopping.com/products.php?usr=a' order by 4 -- //
--
意義在于它是SQL中的注釋指示符炊豪,它使查詢的其余部分成為注釋×杌現(xiàn)在為了保留space
after --
,我們在其后添加任何字符词渤,以便space
在HTTP request
牵舱。根據(jù)SQL數(shù)據(jù)庫提供程序的不同,我們可能還會使用#
或/* */
進(jìn)行注釋缺虐。
繼續(xù)此過程芜壁,直到遇到錯(cuò)誤。如果在使用有效負(fù)載時(shí)遇到錯(cuò)誤高氮,order by 5
但在使用時(shí)卻沒有order by 4
慧妄,這意味著查詢返回4
列。
如何使用SQL注入進(jìn)行利用
一旦你知道應(yīng)用程序容易受到SQL注入和你已經(jīng)確定的列數(shù)剪芍,我們試圖找到有關(guān)數(shù)據(jù)庫塞淹,如必要的信息DB name
,DB user name
罪裹,DB version
饱普,table names
运挫,column names
所需要的表,等退房的SQL注入小抄查找相應(yīng)的查詢套耕。
SQL注入的類型
-
基于錯(cuò)誤:這種SQL注入依賴于
error messages
數(shù)據(jù)庫服務(wù)器拋出的錯(cuò)誤谁帕,這可能會向我們提供有關(guān)數(shù)據(jù)庫結(jié)構(gòu)的一些有用信息。 -
基于聯(lián)合的:此技術(shù)使用SQL
UNION
運(yùn)算符組合兩個(gè)SELECT
查詢的結(jié)果并返回單個(gè)表冯袍。通過將結(jié)果附加到對數(shù)據(jù)庫進(jìn)行的原始查詢匈挖,攻擊者可以從其他表中提取信息。 -
盲注:當(dāng)應(yīng)用程序容易受到攻擊
SQL Injection
但的結(jié)果SQL query
未在中返回時(shí)颠猴,就會發(fā)生這種情況HTTP response
关划。在這種情況下,我們在數(shù)據(jù)庫中查詢?nèi)魏蝨rue / false語句翘瓮,并查看true和false條件的更改贮折。它有兩種類型: -
基于內(nèi)容的:在此技術(shù)中,
response
在發(fā)送true
條件和false
條件時(shí)资盅,將使用任何條件語句查詢數(shù)據(jù)庫服務(wù)器调榄,并分析服務(wù)器中的條件差異。 - 基于時(shí)間的:此技術(shù)依賴于注入SQL查詢呵扛,該查詢使數(shù)據(jù)庫根據(jù)指定的條件等待特定的時(shí)間每庆。服務(wù)器發(fā)送回響應(yīng)所花費(fèi)的時(shí)間確定查詢是對還是錯(cuò)。
-
帶外注入(不常見):這不是一種很常見的類型今穿,
SQL Injection
因?yàn)樗Q于數(shù)據(jù)庫服務(wù)器上啟用的功能缤灵。它依賴于數(shù)據(jù)庫服務(wù)器的能力,使像一個(gè)Web請求HTTP
蓝晒,DNS
以及ftp
將數(shù)據(jù)發(fā)送給攻擊者腮出。
如何保護(hù)您的代碼免受SQL注入?
- 切勿直接用用戶輸入構(gòu)造查詢芝薇。相反胚嘲,請使用參數(shù)化語句。他們確保安全處理傳遞給SQL查詢的輸入洛二。
- 清理用戶輸入始終是一件好事馋劈。另外,應(yīng)進(jìn)行適當(dāng)?shù)?strong>輸入驗(yàn)證晾嘶,例如妓雾,名稱不能為數(shù)字或電話號碼不能為字母。但是变擒,有時(shí)可以繞開它君珠。
- 使用安全的驅(qū)動程序與SQL數(shù)據(jù)庫進(jìn)行交互。它們自動防止所有SQL注入攻擊娇斑。例如策添,適用于python的SQLAlchemy材部。
資源資源
-
SQL Map是一個(gè)開放源代碼工具,
automates
用于處理detecting
和exploiting
注入SQL漏洞唯竹。 - 此存儲庫上有一些很酷的資源
SQL Injection
乐导。其中包括一些備忘單和許多有用的有效負(fù)載,這些負(fù)載可以根據(jù)用例使用浸颓。
翻譯自:https://medium.com/better-programming/a-beginners-guide-to-sql-injection-163c1ad2257f