什麼是sql注入?我們常見的提交方式有哪些?

i網絡心連心


所謂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時,就可以接觸到 一般用佔位符?號代替


程序猿小劉


什麼是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

此處的關鍵是,雙破折號序列--是SQL中的註釋指示符,意味著查詢的其餘部分將被解釋為註釋。這樣可以有效刪除查詢的其餘部分,因此不再包含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'

如果查詢返回用戶的詳細信息,則登錄成功。否則,它將被拒絕。

在這裡,攻擊者可以簡單地使用SQL註釋序列--從WHERE查詢子句中刪除密碼檢查,而無需密碼即可以任何用戶身份登錄。例如,提交用戶名administrator'--和空白密碼將導致以下查詢:

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注入實例。


大魔王Hacker


WEB安全之SQL注入

引言:

在開發網站的時候,出於安全考慮,需要過濾從頁面傳遞過來的字符。通常,用戶可以通過以下接口調用數據庫的內容:URL地址欄、登陸界面、留言板、搜索框等。這往往給駭客留下了可乘之機。輕則數據遭到洩露,重則服務器被拿下。

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]');

接下來,貼上登入界面的源代碼

<title>Sql注入演示/<title>

附上效果圖:

當用戶點擊提交按鈕的時候,將會把表單數據提交給validate.php頁面,validate.php頁面用來判斷用戶輸入的用戶名和密碼有沒有都符合要求(這一步至關重要,也往往是SQL漏洞所在)

! <title>登錄驗證/<title>

Microphone吳


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();輸出了錯誤信息時使用。


Leowsn


首先回答第一個問題:什麼是SQL 注入?

一般來說,黑客通過把惡意的sql語句插入到網站的表單提交或者輸入域名請求的查詢語句,最終達到欺騙網站的服務器執行惡意的sql語句,通過這些sql語句來獲取黑客他們自己想要的一些數據信息和用戶信息,也就是說如果存在sql注入,那麼就可以執行sql語句的所有命令

那我延伸一個問題:sql注入形成的原因是什麼呢?

數據庫的屬於與網站的代碼未嚴格分離,當一個黑客提交的參數數據未做充分的檢查和防禦的話,那麼黑客的就會輸入惡意的sql命令,改變了原有的sql命令的語義,就會把黑客執行的語句帶入到數據庫被執行。

現在回答第二個問題:我們常見的注入方式有哪些?

我們常見的提交方式就是GET和POST

首先是GET,get提交方式,比如說你要查詢一個數據,那麼查詢的代碼就會出現在鏈接當中,可以看見我們id=1,1就是我們搜索的內容,出現了鏈接當中,這種就是get。

第二個是Post提交方式是看不見的,需要我們利用工具去看見,我們要用到hackbar這款瀏覽器插件

可以就可以這樣去提交,在這裡我搜索了2,那麼顯示的數據也就不同,這個就是數據庫的查詢功能,那麼的話,get提交比post的提交更具有危害性。

第二個是Post提交方式是看不見的,需要我們利用工具去看見,我們要用到hackbar這款瀏覽器插件。

以上便是我的回答,希望對你有幫助。




分享到:


相關文章: