SQL注入的常見方式及測試方法

2022-01-29 11:46:45 字數 2323 閱讀 3808

本文主要針對sql注入的含義、以及如何進行sql注入和如何預防sql注入讓小夥伴有個了解。適用的人群主要是測試人員,了解如何進行sql注入,可以幫助我們測試登入、發布等模組的sql攻擊漏洞,至於如何預防sql注入,按理說應該是開發該了解的事情~但是作為乙個棒棒的測試,搞清楚原理是不是能讓我們更加透徹地理解bug的產生原因呢~好啦,話不多說,進入正題~

sql注入是一種將sql**新增到輸入引數中,傳遞到伺服器解析並執行的一種攻擊手法。

sql注入攻擊是輸入引數未經過濾,然後直接拼接到sql語句當中解析,執行達到預想之外的一種行為,稱之為sql注入攻擊。

1)web開發人員無法保證所有的輸入都已經過濾

2)攻擊者利用傳送給sql伺服器的輸入引數構造可執行的sql**(可加入到get請求、post請求、http頭資訊、cookie中)

3)資料庫未做相應的安全配置

以php程式語言、mysql資料庫為例,介紹一下sql注入攻擊的構造技巧、構造方法:

$sql = "select * from article where id =",$id

正常情況下,應該返回乙個id=1的文章資訊。那麼,如果在瀏覽器位址列輸入:learn.me/sql/article.php?id=-1 or 1 =1,這就是乙個sql注入攻擊了,可能會返回所有文章的相關資訊。為什麼會這樣呢?

這是因為,id = -1永遠是false,1=1永遠是true,所有整個where語句永遠是ture,所以where條件相當於沒有加where條件,那麼查詢的結果相當於整張表的內容

有這樣乙個使用者登入場景:登入介面包括使用者名稱和密碼輸入框,以及提交按鈕。輸入使用者名稱和密碼,提交。

這是乙個post請求,登入時呼叫介面learn.me/sql/login.html,首先連線資料庫,然後後台對post請求引數中攜帶的使用者名稱、密碼進行引數校驗,即sql的查詢過程。假設正確的使用者名稱和密碼為user和pwd123,輸入正確的使用者名稱和密碼、提交,相當於呼叫了以下的sql語句:

select * from user where username = 'user' adn password = 'pwd123'

由於使用者名稱和密碼都是字串,sql注入方法即把引數攜帶的資料變成mysql中注釋的字串。mysql中有2種注釋的方法:

(1)'#':'#'後所有的字串都會被當成注釋來處理

使用者名稱輸入:user'#(單引號閉合user左邊的單引號),密碼隨意輸入,如:111,然後點選提交按鈕。等價於sql語句:

select * from user where username = 'user'#'adn password = '111'

'#'後面都被注釋掉了,相當於:

select * from user where username = 'user'

(2)'-- ' (--後面有個空格):'-- '後面的字串都會被當成注釋來處理

使用者名稱輸入:user'-- (注意--後面有個空格,單引號閉合user左邊的單引號),密碼隨意輸入,如:111,然後點選提交按鈕。等價於sql語句:

select * from user where username = 'user'-- 'and password = '111'

select * from user where username = 'user'-- 'and password = '1111'

'-- '後面都被注釋掉了,相當於:

select * from user where username = 'user'

因此,以上兩種情況可能輸入乙個錯誤的密碼或者不輸入密碼就可登入使用者名為'user'的賬號,這是十分危險的事情。

這是開發人員應該思考的問題,作為測試人員,了解如何預防sql注入,可以在發現注入攻擊bug時,對bug產生原因進行定位。

(1)嚴格檢查輸入變數的型別和格式

對於整數引數,加判斷條件:不能為空、引數型別必須為數字

對於字串引數,可以使用正規表示式進行過濾:如:必須為[0-9a-za-z]範圍內的字串

(2)過濾和轉義特殊字元

在username這個變數前進行轉義,對'、"、\等特殊字元進行轉義,如:php中的addslashes()函式對username引數進行轉義

(3)利用mysql的預編譯機制

把sql語句的模板(變數採用佔位符進行佔位)傳送給mysql伺服器,mysql伺服器對sql語句的模板進行編譯,編譯之後根據語句的優化分析對相應的索引進行優化,在最終繫結引數時把相應的引數傳送給mysql伺服器,直接進行執行,節省了sql查詢時間,以及mysql伺服器的資源,達到一次編譯、多次執行的目的,除此之外,還可以防止sql注入。具體是怎樣防止sql注入的呢?實際上當將繫結的引數傳到mysql伺服器,mysql伺服器對引數進行編譯,即填充到相應的佔位符的過程中,做了轉義操作。

SQL指令碼注入的不常見方法概括

我來說說他們的文章系統原理 全部文章均在資料庫存有乙個副本。另處根據模板生成乙個html頁面。我們就可以這樣來試一下可否注入 http 伺服器網域名稱 count.asp?id 1552 看一下是否出錯。如出錯說明有注入漏洞。然後正常攻擊。在本機建立一下post.htm的檔案和log.txt的文字檔...

SQL指令碼注入的不常見方法概括

大家在是否碰到過這樣的站點,全站文章系統採用fso靜態生成的html檔案來顯示。這樣做的好處一來可以減輕伺服器負擔,提高訪問速度。二來也阻止了sql注入式的攻擊。我來說說他們的文章系統原理 全部文章均在資料庫存有乙個副本。另處根據模板生成乙個html頁面。我們就可以這樣來試一下可否注入 http 伺...

SQL注入的測試方法

web應用程式的資料儲存與讀取通過資料庫完成,而這些讀寫的操作通過sql語句實現。實際專案中可能因為開發人員的疏忽或經驗問題,未對使用者可輸入的引數進行嚴格地校驗,導致使用者可能惡意地將sql命令帶入資料庫執行,實現注入的目的。1.搜尋型引數 判斷是否存在sql注入漏洞,需滿足以下四步 正常查詢資料...