MYSQL注入天書之基礎知識


第一部分/page-1 Basic Challenges

Background-1 基礎知識

此處介紹一些mysql注入的一些基礎知識。

(1)注入的分類---仁者見仁,智者見智。

下面這個是阿德瑪表哥的一段話,個人認為分類已經是夠全面了。理解不了跳過,當你完全看完整個學習過程后再回頭看這段。能完全理解下面的這些每個分類,對每個分類有屬於你的認知和了解的時候,你就算是小有成就了,當然僅僅是sql注入上。

基於從服務器接收到的響應 

▲基於錯誤的SQL注入

▲聯合查詢的類型

▲堆查詢注射

SQL盲注

•基於布爾SQL盲注

•基於時間的SQL盲注

•基於報錯的SQL盲注

基於如何處理輸入的SQL查詢(數據類型) 

•基於字符串

•數字或整數為基礎的

基於程度和順序的注入(哪里發生了影響)

★一階注射

★二階注射

一階注射是指輸入的注射語句對WEB直接產生了影響,出現了結果;二階注入類似存儲型XSS,是指輸入提交的語句,無法直接對WEB應用程序產生影響,通過其它的輔助間接的對WEB產生危害,這樣的就被稱為是二階注入.
基於注入點的位置上的 

▲通過用戶輸入的表單域的注射。

▲通過cookie注射。

▲通過服務器變量注射。 (基於頭部信息的注射)

 

(2)系統函數

介紹幾個常用函數:
1. version()——MySQL版本
2. user()——數據庫用戶名
3. database()——數據庫名
4. @@datadir——數據庫路徑
5. @@version_compile_os——操作系統版本

  1. 字符串連接函數

    函數具體介紹 http://www.cnblogs.com/lcamry/p/5715634.html

  2. concat(str1,str2,...)——沒有分隔符地連接字符串
    2. concat_ws(separator,str1,str2,...)——含有分隔符地連接字符串
    3. group_concat(str1,str2,...)——連接一個組的所有字符串,並以逗號分隔每一條數據
    說着比較抽象,其實也並不需要詳細了解,知道這三個函數能一次性查出所有信息就行了。
  3. 一般用於嘗試的語句

    Ps:--+可以用#替換,url提交過程中Url編碼后的#為%23

    or 1=1--+

    'or 1=1--+

    "or 1=1--+

    )or 1=1--+

    ')or 1=1--+

    ") or 1=1--+

    "))or 1=1--+

    一般的代碼為:

    $id=$_GET['id'];

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

    此處考慮兩個點,一個是閉合前面你的 ' 另一個是處理后面的 ' ,一般采用兩種思路,閉合后面的引號或者注釋掉,注釋掉采用--+ 或者 #(%23)

  4. union操作符的介紹

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

    SQL UNION 語法

    SELECT column_name(s) FROM table_name1

    UNION

    SELECT column_name(s) FROM table_name2

    注釋:默認地,UNION 操作符選取不同的值。如果允許重復的值,請使用 UNION ALL。

    SQL UNION ALL 語法

    SELECT column_name(s) FROM table_name1

    UNION ALL

    SELECT column_name(s) FROM table_name2

    另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。

    (6)sql中的邏輯運算

    這里我想說下邏輯運算的問題。

    提出一個問題Select * from users where id=1 and 1=1; 這條語句為什么能夠選擇出id=1的內容,and 1=1到底起作用了沒有?這里就要清楚sql語句執行順序了。

    同時這個問題我們在使用萬能密碼的時候會用到。

    Select * from admin where username='admin' and password='admin'

    我們可以用 'or 1=1# 作為密碼輸入。原因是為什么?

    這里涉及到一個邏輯運算,當使用上述所謂的萬能密碼后,構成的sql語句為:

    Select * from admin where username='admin' and password=''or 1=1#'

    Explain:上面的這個語句執行后,我們在不知道密碼的情況下就登錄到了admin用戶了。

    原因是在where子句后,我們可以看到三個條件語句 username='admin' and password=''or 1=1。三個條件用and和or進行連接。在sql中,我們and的運算優先級大於or的元算優先級。因此可以看到 第一個條件(用a表示)是真的,第二個條件(用b表示)是假的,a and b = false,第一個條件和第二個條件執行and后是假,再與第三個條件or運算,因為第三個條件1=1是恆成立的,所以結果自然就為真了。因此上述的語句就是恆真了。

     

     

     

     

     

    Select * from users where id=1 and 1=1;

    Select * from users where id=1 && 1=1;

    Select * from users where id=1 & 1=1;

    上述三者有什么區別?是一樣的,表達的意思是 id=1條件和1=1條件進行與運算。

    的意思是id=1條件與1進行&位操作,id=1被當作true,與1進行 & 運算 結果還是1,再進行=操作,1=1,還是1(ps:&的優先級大於=)

    Ps:此處進行的位運算。我們可以將數轉換為二進制再進行與、或、非、異或等運算。必要的時候可以利用該方法進行注入結果。例如將某一字符轉換為ascii碼后,可以分別與1,2,4,8,16,32.。。。進行與運算,可以得到每一位的值,拼接起來就是ascii碼值。再從ascii值反推回字符。(運用較少)

    (7)注入流程

    我們的數據庫存儲的數據按照上圖的形式,一個數據庫當中有很多的數據表,數據表當中有很多的列,每一列當中存儲着數據。我們注入的過程就是先拿到數據庫名,在獲取到當前數據庫名下的數據表,再獲取當前數據表下的列,最后獲取數據。

    現在做一些mysql的基本操作。啟動mysql,然后通過查詢檢查下數據庫:

    show databases; 

    這個實驗用到的數據庫名為security,所以我們選擇security來執行命令。

    use security; 

    我們可以查看下這個數據庫中有哪些表

    show tables; 

    現在我們可以看到這里有四張表,然后我們來看下這張表的結構。

    desc emails; 

    在繼續進行前台攻擊時,我們想討論下系統數據庫,即information_schema。所以我們使用它

    use information_schema 

    讓我們來看下表格。

    show tables; 

    現在我們先來枚舉這張表

    desc tables; 

    現在我們來使用這個查詢:

    select table_name from information_schema.tables where table_schema = "security"; 

    使用這個查詢,我們可以下載到表名。

    Mysql有一個系統數據庫information_schema,存儲着所有的數據庫的相關信息,一般的,我們利用該表可以進行一次完整的注入。以下為一般的流程。

    猜數據庫

    select schema_name from information_schema.schemata

    猜某庫的數據表

    select table_name from information_schema.tables where table_schema='xxxxx'

    猜某表的所有列

    Select column_name from information_schema.columns where table_name='xxxxx'

    獲取某列的內容

    Select *** from ****

    上述知識參考用例:less1-less4


免責聲明!

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



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