-
1 # 趣科技學長
-
2 # Leowsn
SQL注入即是指web應用程式對使用者輸入資料的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程式中事先定義好的查詢語句的結尾上新增額外的SQL語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙資料庫伺服器執行非授權的任意查詢,從而進一步得到相應的資料資訊。
1、基於布林的盲注
因為web的頁面返回值都是True或者False,所以布林盲注就是注入後根據頁面返回值來得到資料庫資訊的一種辦法。 [1]
2、基於時間的盲注
當布林型注入沒有結果(頁面顯示正常)的時候,我們很難判斷注入的程式碼是否被執行,也可以說到底這個注入點存不存在?這個時候布林型注入就無法發揮自己的作用了。基於時間的盲注便應運而生,所謂基於時間的盲注,就是我們根據web頁面相應的時間差來判斷該頁面是否存在SQL注入點。 [1]
3、聯合查詢注入
使用聯合查詢進行注入的前提是我們要進行注入的頁面必須有顯示位。所謂聯合查詢注入即是使用union合併兩個或多個SELECT語句的結果集,所以兩個及以上的select必須有相同列、且各列的資料型別也都相同。聯合查詢注入可在連結最後新增order by 9基於隨意數字的注入,根據頁面的返回結果來判斷站點中的欄位數目。 [1]
4、基於錯誤資訊的注入
此方法是在頁面沒有顯示位,但是echo mysql_error();函式輸出了錯誤資訊的時候方能使用。優點是注入速度快,缺點是語句較為複雜,而且只能用limit依次進行猜解。總體來說,報錯注入其實是一種公式化的注入方法,主要用於在頁面中沒有顯示位,但是用echo mysql_error();輸出了錯誤資訊時使用。
-
3 # 程式猿小劉
所謂SQL注入,其實是程式漏洞,沒有什麼技術,比如下面的語句就可能被注入
SQL="SELECT * FROM ADMIN WHERE USER="" &REQUEST("USER")& "" AND PASS ="" &REQUEST("PASS")& """
別人可以精心設計一個PASS引數提交給你,使得你的SQL完成其它功能,例如PASS的值為:
abc" OR USER="admin
這時候SQL語句是什麼樣子,你看看:
SELECT * FROM ADMIN WHERE USER="admin" AND PASS="abc" OR USER="admin"
任何密碼都可以成功登入。
解決的方法:程式應該判斷user和pass這些引數裡面是否有引號等特殊符號。 我們在學習jdbc時,就可以接觸到 一般用佔位符?號代替
-
4 # Microphone吳
WEB安全之SQL注入
引言:
1、SQL注入步驟
a)尋找注入點,構造特殊的語句
傳入SQL語句可控引數分為兩類 1. 數字型別,引數不用被引號括起來,如 2. 其他型別,引數要被引號擴起來,如
b)使用者構造SQL語句(如:"or 1=1#;admin"#(這個注入又稱PHP的萬能密碼,是已知使用者名稱的情況下,可繞過輸入密碼)以後再做解釋)
c)將SQL語句傳送給DBMS資料庫
d)DBMS收到返回的結果,並將該請求解釋成機器程式碼指令,執行必要得到操作
e)DBMS接受返回結果,處理後,返回給使用者
因為使用者構造了特殊的SQL語句,必定返回特殊的結果(只要你的SQL語句夠靈活)
下面,我透過一個例項具體來演示下SQL注入 二、SQL注入例項詳解(以上測試均假設伺服器未開啟magic_quote_gpc)
1) 前期準備工作 先來演示透過SQL注入漏洞,登入後臺管理員介面 首先,建立一張試驗用的資料表:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL, `password` varchar(64) NOT NULL, `email` varchar(64) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;新增一條記錄用於測試:
INSERT INTO users (username,password,email)VALUES("MarcoFly",md5("test"),"[email protected]");接下來,貼上登入介面的原始碼
<html><head><title>Sql注入演示</title><meta http-equiv="content-type" content="text/html;charset=utf-8"></head><body ><form action="validate.php" method="post"><fieldset ><legend>Sql注入演示</legend><table><tr><td>使用者名稱:</td><td><input type="text" name="username"></td></tr><tr><td>密 碼:</td><td><input type="text" name="password"></td></tr><tr><td><input type="submit" value="提交"></td><td><input type="reset" value="重置"></td></tr></table></fieldset></form></body></html>附上效果圖:
登入失敗的提示:
到這裡,前期工作已經做好了,接下來將展開我們的重頭戲:SQL注入
2) 構造SQL語句 填好正確的使用者名稱(marcofly)和密碼(test)後,點選提交,將會返回給我們“歡迎管理員”的介面。 因為根據我們提交的使用者名稱和密碼被合成到SQL查詢語句當中之後是這樣的: select * from users where username="marcofly" and password=md5("test") 很明顯,使用者名稱和密碼都和我們之前給出的一樣,肯定能夠成功登陸。但是,如果我們輸入一個錯誤的使用者名稱或密碼呢?很明顯,肯定登入不了吧。恩,正常情況下是如此,但是對於有SQL注入漏洞的網站來說,只要構造個特殊的“字串”,照樣能夠成功登入。
比如:在使用者名稱輸入框中輸入:" or 1=1#,密碼隨便輸入,這時候的合成後的SQL查詢語句為: select * from users where username="" or 1=1#" and password=md5("") 語義分析:“#”在mysql中是註釋符,這樣井號後面的內容將被mysql視為註釋內容,這樣就不會去執行了,換句話說,以下的兩句sql語句等價:
select * from users where username="" or 1=1#" and password=md5("")等價於
select* from users where usrername="" or 1=1因為1=1永遠是都是成立的,即where子句總是為真,將該sql進一步簡化之後,等價於如下select語句:
select * from users 沒錯,該sql語句的作用是檢索users表中的所有欄位
上面是一種輸入方法,這裡再介紹一種注入的方法,這個方法又稱PHP的萬能密碼
我們再已知使用者名稱的條件下,可以不能密碼即可登入,假設使用者名稱:admin
構造語句:
select * from users where username="admin"#" and password=md5("")等價於
select * from users where username="admin"這樣即可不能輸入密碼登入上去的。
資料庫就會錯認為不用使用者名稱既可以登入,繞過後臺的驗證,已到達注入的目的。
同樣利用了SQL語法的漏洞。
看到了吧,一個經構造後的sql語句竟有如此可怕的破壞力,相信你看到這後,開始對sql注入有了一個理性的認識了吧~ 沒錯,SQL注入就是這麼容易。但是,要根據實際情況構造靈活的sql語句卻不是那麼容易的。有了基礎之後,自己再去慢慢摸索吧。 有沒有想過,如果經由後臺登入視窗提交的資料都被管理員過濾掉特殊字元之後呢?這樣的話,我們的萬能使用者名稱" or 1=1#就無法使用了。但這並不是說我們就毫無對策,要知道使用者和資料庫打交道的途徑不止這一條。
-
5 # 你看我獨角獸嗎
什麼是SQL注入(SQLi)?
SQL注入是一個網路安全漏洞,它使攻擊者能夠干擾應用程式對其資料庫的查詢。通常,它使攻擊者可以檢視他們通常無法檢索的資料。這可能包括屬於其他使用者的資料,或者應用程式本身能夠訪問的任何其他資料。在許多情況下,攻擊者可以修改或刪除此資料,從而導致應用程式內容或行為的永久更改。
在某些情況下,攻擊者可以升級SQL注入攻擊以破壞基礎伺服器或其他後端基礎結構,或者執行拒絕服務攻擊
成功的SQL注入攻擊有什麼影響?成功的SQL注入攻擊可能導致未授權訪問敏感資料,例如密碼,信用卡詳細資訊或個人使用者資訊。近年來,許多引人注目的資料洩露是SQL注入攻擊的結果,導致聲譽受損和監管罰款。在某些情況下,攻擊者可以獲取組織系統的持久後門,從而導致長期的妥協,並且可能在很長一段時間內未被發現。
SQL注入示例在不同情況下會出現各種SQL注入漏洞,攻擊和技術。一些常見的SQL注入示例包括:
檢索隱藏的資料,您可以在其中修改SQL查詢以返回其他結果。
顛覆應用程式邏輯,您可以在其中更改查詢以干擾應用程式的邏輯。
UNION攻擊,您可以在其中從不同的資料庫表中檢索資料。
檢查資料庫,您可以在其中提取有關資料庫版本和結構的資訊。
盲SQL注入,您控制的查詢結果不會在應用程式的響應中返回。
檢索隱藏資料考慮一個顯示不同類別產品的購物應用程式。當用戶單擊“禮物”類別時,其瀏覽器將請求URL:
https://insecure-website.com/products?category=Gifts
這使應用程式進行SQL查詢,以從資料庫中檢索相關產品的詳細資訊:
SELECT * FROM products WHERE category = "Gifts" AND released = 1
此SQL查詢要求資料庫返回:
所有詳細資訊(*)
從產品表
類別是禮物
併發布為1。
該限制released = 1用於隱藏未釋出的產品。對於未釋出的產品,大概是released = 0。
該應用程式未對SQL注入攻擊實施任何防禦措施,因此攻擊者可以構建如下攻擊:
https://insecure-website.com/products?category=Gifts"--
這將導致SQL查詢:
SELECT * FROM products WHERE category = "Gifts"--" AND released = 1
更進一步,攻擊者可以使應用程式顯示任何類別的所有產品,包括他們不知道的類別:
https://insecure-website.com/products?category=Gifts"+OR+1=1--
這將導致SQL查詢:
SELECT * FROM products WHERE category = "Gifts" OR 1=1--" AND released = 1
修改後的查詢將返回類別為Gifts或1等於1的1=1所有專案。由於始終為true,因此查詢將返回所有專案。
顛覆應用邏輯考慮一個允許使用者使用使用者名稱和密碼登入的應用程式。如果使用者提交使用者名稱wiener和密碼bluecheese,則應用程式將透過執行以下SQL查詢來檢查憑據:
SELECT * FROM users WHERE username = "wiener" AND password = "bluecheese"
如果查詢返回使用者的詳細資訊,則登入成功。否則,它將被拒絕。
SELECT * FROM users WHERE username = "administrator"--" AND password = ""
該查詢返回使用者名稱為的使用者,administrator並以該使用者身份成功登入攻擊者。
從其他資料庫表檢索資料如果在應用程式的響應中返回了SQL查詢的結果,則攻擊者可以利用SQL注入漏洞從資料庫中的其他表中檢索資料。這是使用UNION關鍵字完成的,該關鍵字使您可以執行附加SELECT查詢並將結果附加到原始查詢中。
例如,如果應用程式執行以下包含使用者輸入“ Gifts”的查詢:
SELECT name, description FROM products WHERE category = "Gifts"
然後攻擊者可以提交輸入:
" UNION SELECT username, password FROM users--
這將導致應用程式返回所有使用者名稱和密碼以及產品名稱和描述。
檢查資料庫在初步識別出SQL注入漏洞之後,獲取有關資料庫本身的一些資訊通常非常有用。這些資訊通常可以為進一步開發鋪平道路。
您可以查詢資料庫的版本詳細資訊。完成此操作的方式取決於資料庫型別,因此您可以從任何一種技術推斷出資料庫型別。例如,在Oracle上,您可以執行:
SELECT * FROM v$version
您還可以確定存在哪些資料庫表以及它們包含哪些列。例如,在大多數資料庫上,您可以執行以下查詢以列出表:
SELECT * FROM information_schema.tables
二階SQL注入一階SQL注入出現在應用程式從HTTP請求獲取使用者輸入的情況下,並且在處理該請求的過程中,以不安全的方式將輸入合併到SQL查詢中。
在二階SQL注入(也稱為儲存SQL注入)中,應用程式從HTTP請求中獲取使用者輸入並將其儲存以備將來使用。這通常是透過將輸入放入資料庫來完成的,但是在儲存資料時不會出現漏洞。稍後,當處理其他HTTP請求時,應用程式將以不安全的方式檢索儲存的資料並將其合併到SQL查詢中。
在開發人員意識到SQL注入漏洞並因此安全地處理輸入到資料庫的初始放置的情況下,通常會發生二階SQL注入。以後處理資料時,由於先前已將其安全地放置到資料庫中,因此認為該資料是安全的。此時,由於開發人員錯誤地認為資料是可信的,因此以不安全的方式處理資料。
總的來說,我們透過使用引數化查詢(也稱為預處理語句)而不是查詢中的字串連線,可以防止大多數SQL注入例項。
回覆列表
首先回答第一個問題:什麼是SQL 注入?
一般來說,駭客透過把惡意的sql語句插入到網站的表單提交或者輸入域名請求的查詢語句,最終達到欺騙網站的伺服器執行惡意的sql語句,透過這些sql語句來獲取駭客他們自己想要的一些資料資訊和使用者資訊,也就是說如果存在sql注入,那麼就可以執行sql語句的所有命令
那我延伸一個問題:sql注入形成的原因是什麼呢?
資料庫的屬於與網站的程式碼未嚴格分離,當一個駭客提交的引數資料未做充分的檢查和防禦的話,那麼駭客的就會輸入惡意的sql命令,改變了原有的sql命令的語義,就會把駭客執行的語句帶入到資料庫被執行。
現在回答第二個問題:我們常見的注入方式有哪些?
我們常見的提交方式就是GET和POST
首先是GET,get提交方式,比如說你要查詢一個數據,那麼查詢的程式碼就會出現在連結當中,可以看見我們id=1,1就是我們搜尋的內容,出現了連結當中,這種就是get。
第二個是Post提交方式是看不見的,需要我們利用工具去看見,我們要用到hackbar這款瀏覽器外掛
可以就可以這樣去提交,在這裡我搜索了2,那麼顯示的資料也就不同,這個就是資料庫的查詢功能,那麼的話,get提交比post的提交更具有危害性。
第二個是Post提交方式是看不見的,需要我們利用工具去看見,我們要用到hackbar這款瀏覽器外掛。