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

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

生活随笔

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

数据库

SQL注入的一般过程

發(fā)布時(shí)間:2023/12/15 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL注入的一般过程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

SQL注入的一般過(guò)程

  • 概述
  • SQL注入的步驟
  • 一道例題
  • 總結(jié)

概述

??SQL注入是指web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒(méi)有判斷或過(guò)濾不嚴(yán),攻擊者可以在web應(yīng)用程序中事先定義好的查詢(xún)語(yǔ)句的結(jié)尾上添加額外的SQL語(yǔ)句,在管理員不知情的情況下實(shí)現(xiàn)非法操作,以此來(lái)實(shí)現(xiàn)欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行非授權(quán)的任意查詢(xún),從而進(jìn)一步得到相應(yīng)的數(shù)據(jù)信息。SQL注入大致可以分為兩類(lèi):數(shù)字型注入和字符型注入。

SQL注入的步驟

??這里介紹下SQL注入的基本流程,需要明確的是在實(shí)際注入中,我們都是無(wú)法看到具體的后端代碼的,也就是無(wú)法知曉具體的SQL拼接過(guò)程。一般SQL注入分為以下7個(gè)步驟,目的是通過(guò)一步一步的注入來(lái)猜測(cè)出查詢(xún)語(yǔ)句和數(shù)據(jù)庫(kù)結(jié)構(gòu),最終暴露出數(shù)據(jù)庫(kù)中表的信息,實(shí)際操作中大家可以根據(jù)需要來(lái)進(jìn)行取舍。

1、判斷注入類(lèi)型,數(shù)字型還是字符型:
??首先,我們需要確定目標(biāo)是數(shù)字型還是字符型注入漏洞,以便我們進(jìn)一步進(jìn)行其它注入操作。如下面的php代碼片段所示,第一行代碼代表數(shù)字型的sql拼接,其中的變量在sql查詢(xún)語(yǔ)句拼接時(shí)并沒(méi)有用引號(hào)括起來(lái);第二行代碼是字符型,其中的變量使用了引號(hào)進(jìn)行拼接。

# 數(shù)字型 $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;"; # 字符型 $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

??下面介紹如何進(jìn)行判斷,如下代碼所示,首先我們假設(shè)注入類(lèi)型為數(shù)字型,分別輸入如下的語(yǔ)句。如果被測(cè)試對(duì)象是數(shù)字型,那么第一行測(cè)試語(yǔ)句會(huì)返回user_id為1的查詢(xún)結(jié)果,而第二行語(yǔ)句由于條件and 1=2不成立,所以查詢(xún)結(jié)果為空。如果被測(cè)試對(duì)象為字符型的話,將下面語(yǔ)句拼接到sql中,由于user_id的值都不匹配,所以應(yīng)該是都不返回任何結(jié)果,但是注意如果user_id本身是int類(lèi)型,實(shí)際查詢(xún)過(guò)程中是會(huì)返回結(jié)果的,這可能是因?yàn)閷?duì)輸入的字符進(jìn)行了截?cái)嗖⑥D(zhuǎn)換了類(lèi)型,造成1 and 1=2在字符類(lèi)型中會(huì)返回user_id為1的查詢(xún)結(jié)果。當(dāng)然如果第二個(gè)語(yǔ)句返回了結(jié)果,我們也可以以此判斷出該注入類(lèi)型是字符型。

1 and 1=1 1 and 1=2

??對(duì)于字符型注入判斷,我們也可以這樣進(jìn)行操作,如下面的兩條注入語(yǔ)句所示,如果是在數(shù)字型注入中,由于變量沒(méi)有加引號(hào),所以拼接后sql語(yǔ)法錯(cuò)誤,直接報(bào)錯(cuò),這和不回顯信息是有區(qū)別。因此如果下面的語(yǔ)句注入后提示sql語(yǔ)法錯(cuò)誤,那么我們可以直接判斷測(cè)試對(duì)象為數(shù)字型注入。而對(duì)于字符型注入,第一行語(yǔ)句輸入后和原本的引號(hào)前后完全閉合,且邏輯成立,所以回顯出user_id為1的數(shù)據(jù);第二行語(yǔ)句輸入后,前后引號(hào)也完全閉合,但邏輯不成立,所以返回結(jié)果為空。

1' and '1'='1 1' and '1'='2

??最后展示一下直接在MySql數(shù)據(jù)庫(kù)中的操作,大家可以更加直觀的感受下結(jié)果。

2、猜解sql查詢(xún)語(yǔ)句中的字段數(shù)
??在這一步中,我們嘗試去猜測(cè)出查詢(xún)語(yǔ)句中的字段個(gè)數(shù),如下注入語(yǔ)句所示,假設(shè)為字符型注入,先利用1'實(shí)現(xiàn)引號(hào)閉環(huán),再利用or 1=1這樣可以暴露出表中所有的數(shù)據(jù),最后利用order by num#去看是否報(bào)錯(cuò)來(lái)明確查詢(xún)語(yǔ)句中的字段數(shù),其中#號(hào)用于截?cái)鄐ql查詢(xún)語(yǔ)句。

1' or 1=1 order by 1 # 1' or 1=1 order by 2 # ...... ......

??當(dāng)然也可以采用1' or 1=1 union select 1, 2, 3 #的方式,sql查詢(xún)截圖示意如下。

3、確定字段的顯示順序
??這里我們直接使用union就行,如下截圖和代碼所示,這里我們故意擾亂了first_name和last_name的兩個(gè)位置,查詢(xún)出來(lái)結(jié)果中的1,2會(huì)指明數(shù)據(jù)字段在查詢(xún)語(yǔ)句中的位置。

1' union select 1, 2 #

4、獲取當(dāng)前數(shù)據(jù)庫(kù)
??通過(guò)前面的字段數(shù)確定以及顯示順序確定,我們就可以結(jié)合union操作來(lái)獲取數(shù)據(jù)庫(kù)中的信息了。如下代碼和截圖所示,展示了獲取數(shù)據(jù)庫(kù)名的操作,根據(jù)前面已經(jīng)獲取到的字段數(shù)以及位置關(guān)系,假設(shè)有兩個(gè)字段,那么下面的查詢(xún)語(yǔ)句將會(huì)把數(shù)據(jù)庫(kù)的名稱(chēng)放在第二個(gè)字段中。

1' union select 1, database() #

5、獲取數(shù)據(jù)庫(kù)中的表
??在獲取到當(dāng)前數(shù)據(jù)庫(kù)名后,我們可以進(jìn)一步獲取其中表的信息。如下代碼和截圖所示,展示了獲取數(shù)據(jù)庫(kù)中表的信息,information_schema是MySql自帶的信息數(shù)據(jù)庫(kù),用于存儲(chǔ)數(shù)據(jù)庫(kù)元數(shù)據(jù)(關(guān)于數(shù)據(jù)的數(shù)據(jù)),例如數(shù)據(jù)庫(kù)名、表名、列的數(shù)據(jù)類(lèi)型、訪問(wèn)權(quán)限等,其中的表實(shí)際上都是視圖。information_schema的tables表記錄了數(shù)據(jù)庫(kù)中表的信息,指定table_schema的名稱(chēng)即可顯示對(duì)應(yīng)數(shù)據(jù)庫(kù)中表的信息。

1' union select 1, group_concat(table_name) from information_schema.tables where table_schema=database() #

6.獲取表中的字段名
??進(jìn)一步獲取其中的字段名,假設(shè)要獲取的表為users,如下面的代碼和截圖所示。information_schema的columns表存儲(chǔ)了表中列的信息,也就是表中字段信息,指定table_name表名,即可獲取到對(duì)應(yīng)表的字段信息。

1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users' #

7、下載數(shù)據(jù)
??最后根據(jù)需要,我們獲取表中的信息。這里需要注意的是,我們假設(shè)原來(lái)的注入語(yǔ)句中只有兩個(gè)查詢(xún)字段,所以這里select后也只能跟兩個(gè)group_concat,想一次性看多余的信息,只能在一個(gè)group_concat中進(jìn)行組合。

1' or 1=1 union select group_concat(user_id, first_name, last_name), group_concat(password) from users #

一道例題

??這里以2019年的極客大挑戰(zhàn)的LoveSQL為例題進(jìn)行講解,遠(yuǎn)程環(huán)境可以在BUUCTF上獲取。打開(kāi)遠(yuǎn)程環(huán)境,網(wǎng)站的頁(yè)面是這樣的,給了些許提示表明是sql注入,所以接下來(lái)我們直接按照sql注入的一般過(guò)程看看。

1、確定注入類(lèi)型
??該題目中有兩個(gè)輸入框,也就是說(shuō)有兩個(gè)可以拼接sql的地方,我們?cè)谄渲腥我庖粋€(gè)地方進(jìn)行注入即可。如下截圖所示,1' or 1=1 #,這是按照字符型注入的規(guī)則輸入的萬(wàn)能密碼,也就是說(shuō)后臺(tái)數(shù)據(jù)庫(kù)在查詢(xún)時(shí),該sql語(yǔ)句的邏輯一定成立。

??如下圖所示,是嘗試字符型注入后的結(jié)果,數(shù)字型的注入大家可以自己嘗試一下,不會(huì)成功。

2、確定字段數(shù)和顯示順序
??在初步嘗試登錄成功后,回顯了一個(gè)奇怪的字符串,看起來(lái)很像flag,經(jīng)過(guò)各種嘗試后發(fā)現(xiàn)并不是,所以接下來(lái)還是按照sql注入的步驟進(jìn)行。我們注入1' union select 1, 2, 3 #,注入過(guò)程和效果如下圖所示,發(fā)現(xiàn)Hello處顯示了2,Your password is處顯示了3,再經(jīng)過(guò)其它測(cè)試發(fā)現(xiàn)查詢(xún)的字段數(shù)只有3列。結(jié)合之前登錄成功的界面,可以猜到第2列對(duì)應(yīng)的是用戶名,第3列對(duì)應(yīng)的是密碼。


3、獲取數(shù)據(jù)庫(kù)以及表信息
??這里我將sql注入的步驟融合了,經(jīng)過(guò)前面的注入類(lèi)型確定和字段數(shù)確定,接下來(lái)的步驟才是真正尋找信息的過(guò)程。如下代碼和截圖所示,展示了泄露出數(shù)據(jù)庫(kù)表信息的過(guò)程。

# 注入語(yǔ)句 1' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema=database() #


??根據(jù)ctf獨(dú)特的命名風(fēng)格,我們猜測(cè)大概率flag在表l0ve1ysq1中,接下來(lái)是泄露出表字段信息,如下代碼和截圖所示。

# 注入語(yǔ)句 1' union select 1, 2, group_concat(column_name) from information_schema.columns where table_name="l0ve1ysq1" #


??最后看一下表中的數(shù)據(jù)到底是啥,可以發(fā)現(xiàn)flag在password字段中,由于數(shù)據(jù)太長(zhǎng),flag前半部分在右邊無(wú)法全部截圖。

# 注入語(yǔ)句 1' union select 1, 2, group_concat(password) from l0ve1ysq1 #


??當(dāng)然進(jìn)一步確定flag所在id后,可以這樣打印出來(lái)。

# 注入語(yǔ)句 1' union select 1, 2, group_concat(password) from l0ve1ysq1 where id=16 #

總結(jié)

不忘初心,砥礪前行!

總結(jié)

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

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