當前位置:
首頁 > 最新 > 輕鬆理解什麼是 SQL 注入

輕鬆理解什麼是 SQL 注入

作者:myh0st

作為長期佔據OWASP Top 10首位的注入,OWASP 對於注入的解釋如下:將不受信任的數據作為命令或查詢的一部分發送到解析器時,會產生諸如 SQL 注入、NoSQL 注入、OS 注入和LDAP 注入的注入缺陷。攻擊者的惡意數據可以誘使解析器在沒有適當授權的情況下執行非預 期命令或訪問數據。SQL 注入是最普遍存在的,也是往年危害最大的漏洞,今天我們就來簡單理解關於 SQL 注入的一切。


SQL 注入的字面意思

學習 SQL 注入首先要了解什麼是 SQL,在百度百科的解釋如下:結構化查詢語言 (Structured Query Language) 簡稱 SQL,是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係資料庫系統;同時也是資料庫腳本文件的擴展名。從解釋上來看,SQL 是用來對資料庫系統進行操作的結構化查詢語言,資料庫存儲數據,SQL 就是用來告訴數據我要什麼數據,我要存儲什麼樣的數據。關於資料庫,通常分為兩類,一類是關係型資料庫,還有一類是非關係型資料庫,那麼什麼是關係型資料庫,百度百科的解釋如下:關係資料庫,是建立在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的數據。標準數據查詢語言SQL就是一種基於關係資料庫的語言,這種語言執行對關係資料庫中數據的檢索和操作。當前主流的關係型資料庫有 Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL、浪潮 K-DB 等。關於非關係型資料庫,百度百科的解釋如下:非關係型資料庫,又被稱為 NoSQL(Not Only SQL ),意為不僅僅是 SQL( Structured QueryLanguage,結構化查詢語言),NoSqL 描述的是大量結構化數據存儲方法的集合,根據結構化方法以及應用場合的不同,主要可以將 NOSQL 分為以下幾類:(1)Column-Oriented面向檢素的列式存儲,其存儲結構為列式結構,同於關係型資料庫的行式結構,這種結構會讓很多統計聚合操作更簡單方便,使系統具有較高的可擴展性。這類資料庫還可以適應海量數據的增加以及數據結構的變化,這個特點與雲計算所需的相關需求是相符合的,比如 GoogleAppengine 的 BigTable 以及相同設計理念的 Hadoop 子系統HaBase 就是這類的典州代表。需要特別指出的是,Big Table 特別適用於 MapReduce 處理,這對於雲計算的發展有很高的適應性。(2)Key-Value。面向高性能並發讀/寫的緩存存儲,其結構類似於數據結構中的 Hash 表,每個 Key 分別對應一個 Value,能夠提供非常快的查詢速度、大數據存放量和高並發操作,非常適合通過主鍵對數據進行查詢和修改等操作。Key-Value 資料庫的主要特點是具有極高的並發讀/寫性能,非常適作為緩存系統使用。MemcacheDB、BerkeleyDB、Redis、Flare 就是 Key-Value 資料庫的代表。(3)Document-Oriented。面向海量數據訪問的文檔存儲,這類存儲的結構與 Key-Value 非常相似,也是每個 Key 別對應一個 Value,但是這個 Value 主要以 JSOn(JavaSriptObjectNotations) 或者 XML 等格式的文檔來進行存儲。這種存儲方式可以很方便地被面向對象的語言所使用。這類資料庫可在海量的數據中快速查詢數據,典型代表為 MongoDB、CouchDB 等。在了解完 SQL 之後,我們來理解一下什麼是注入:注入:顧名思義就是插入的意思,在這裡的意思就是在正常的 SQL 語句中,插入我們構造的語句,在獲取正常結果的情況,執行我們構造的 SQL 語句獲取額外的數據,導致數據泄漏。

在學習 SQL 注入實例之前,大家要先明白一些 http 協議的基礎,比如如何通過 GET/POST/cookie 的方式向頁面提交參數數據,這裡就不多說了,下面就以大家最熟悉的 php+mysql 作為例子來解釋 SQL 注入的過程。我們就以最常見的 GET 來作為理解的對象,假設有一個查看個人信息的頁面,鏈接如下:懂 http 協議的朋友肯定知道上面鏈接中哪個是提交的參數,是我們可以控制的並任意修改的,在瀏覽器請求這個鏈接的時候,參數 id 的值會被服務端,通過函數獲取,正常的 sql 語句如下:select * from users where id =;提交之前的鏈接後,id 的值 1 就會被帶入上面的查詢語句,如下:select * from users where id = 1;這樣做也沒什麼不妥,功能完全實現了,但是有了這群不按常理出牌的人之後,就不安全了,平民老百姓沒人去修改 url 上的參數,大部分根本不理解這個 url 是如何構成的,所以世界本來是安全的,有了這些搞安全的,世界就不安全了。當我們把 url 改成下面這樣:我們的參數 id 的值就變成了)這時的資料庫查詢語句就變成了:select * from users where id = -1 union select database()懂數據的肯定知道上面的語句的結果,返回的結果是原本程序做不到的,這就實現了 SQL 注入。關於 SQL 注入有兩個方面,一個是 SQL 注入漏洞:通過簡單的測試,測試這個參數存在 SQL 注入利用的可能就可以說這裡存在 SQL 注入漏洞還有一個就是 SQL 注入攻擊:在確定存在 SQL 注入漏洞的情況下,通過手工或者工具的方式,將資料庫中的敏感信息 dump 出來或者利用資料庫的特定獲取系統的許可權,這是一個利用的過程,在如今法律如此嚴格的情況下,在做滲透測試的時候,切記不要做這一步。


從上面的例子可以看出,我們的參數是通過拼接字元串的方式進行的,在寫 php 代碼的時候,通過獲取到參數值之後直接拼接到了 SQL 查詢語句的後面,不過你提交的參數是什麼都被當作 SQL 語句來執行了,那麼我們如何解決這個問題呢?如今為了解決 SQL 注入的問題,從一開始的過濾到現在使用的資料庫操作的庫,使用參數化查詢的方式,將用戶輸入或者參數的值全部當作字元串來處理,不管你輸入的是什麼,在 SQL 查詢語句中,你就是一個字元串,這樣你構造的查詢語句就被當作字元串來處理了,語句不被執行也就不會存在 SQL 注入的問題了。俗話說,只要是用戶輸入的都不可以信任,一個系統用戶可控的參數千千萬,只要有一個地方疏忽,那你之前做的一切就前功盡棄了,擴展一下,不僅僅是用戶輸入的不可信,只要是數據可以偽造的都不可信,比如 http 協議里的 Referer/user-agent 等。


說了這麼多廢話,這個文章的目的就是讓一些沒什麼基礎的人了解一下大家常說的 SQL 注入相關的東西,從上面的描述可以看出,想要學習 SQL 注入,最起碼的 http 協議是要學的,不同數據的查詢語句以及資料庫特性也是需要了解的,一個網站的數據處理流程也是需要了解的,在有基礎的情況下,了解 SQL 注入的原理,然後就是進階階段,以前的大佬經常發的文章關於繞過什麼的,慢慢積累就可以了。

網友評論:

@Cipher Saw

上述SQL注入舉例有誤:(1)顯示所有資料庫的名稱(注意SHOW語句不能用UNION聯合查詢):SHOW databases;(2)聯合查詢當前資料庫的名稱:UNION SELECT database();顯然,博主把兩者混淆了

●編號631,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

Web開發

更多推薦18個技術類微信公眾號

涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 黑客技術與網路安全 的精彩文章:

TAG:黑客技術與網路安全 |