記一次省賽總結

        一個隊伍有三我的,比賽環境中每一個隊伍有兩臺靶機,兩臺靶機上有兩個web。php

        比賽一共三個小時,前30分鐘爲修復時間,後兩個半小時爲對抗時間,每一個靶機上都有一個flag,flag半小時刷新一輪。git

        根據以往的線下賽的經驗,在加固階段要作的有:github

        1.備份源碼web

              兩臺靶機,一我的進行備份已經足夠,windows平臺上使用scp就行,十分方便,比賽給的兩個web都是php寫的。數據庫

        2.佈置抓取流量的wafwindows

              線下賽佈置waf很重要,可以第一時間反應過來本身是怎麼被打的,waf 用的是下面這一款,可以記錄詳細的攻擊流量,而且對於一些常見的攻擊也可以阻擋,具體的佈置方法就是找web目錄下全部文件都會包含的config.php或者對於框架性web來講直接找入口文件index.php,而後只需在index.php或config.php中對waf進行包含就能夠了,通常放在文件的最前面,包含結束之後,由於waf會進行寫日誌文件,因此須要給waf寫文件的權限,通常靶機的權限是可以給waf chmod寫權限的數組

https://github.com/dr0op/k4l0ng_WAF

        3.掃後門,找洞cookie

             按照出題人的通常套路,總會在web目錄下的某個文件下留個後門,因此可使用提早準備好的D盾對以前已經備份下來的web源碼進行後門掃面,web1是用原生的php寫的,在掃面後檢測到web1的目錄中發現了n多後門,因此此時應該迅速把全部預留的後門註釋掉,而且記下相應的路徑,放在批量腳本中。web2是一個框架應用,只存在一個後門,在用D盾掃事後發現後門直接註釋便可,除了後門之外就須要手工找洞了。mvc

        4.寫批量腳本app

        這次比賽本科組一共有44個隊伍,所以手動提交flag確定很慢,所以批量提交flag的腳本須要提早準備好,咱們比賽中使用的是學弟寫的腳本,腳本會自動讀取flags.txt中的flag,其中的格式必須是「ip+----+flag」,flags.txt的flag是批量攻擊腳本中寫入的

import requests ips = [] flags = [] def submit_flag_auto(ip,flag): url = "http://192.168.80.1/lms/portal/sp/hz_flag.php" headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", "Referer": "http://192.168.80.1/lms/portal/sp/hz_flag.php", "Cookie": "SSCSum=11; zlms-sid=hqfg26bm4766uanj9vm3fel9f7; webcs_test_cookie=lms_cookie_checker; lms_login_name=302-13" } data = { "melee_ip":ip, "melee_flag":flag } response = requests.post(url,headers=headers,data=data) print(response.text) with open("flags.txt","r",encoding="utf-8")as f: for line in f.readlines(): line = line.strip() line = line.split("----") ip = line[0] flag = line[1] ips.append(ip) flags.append(line) for i1,i2 in zip(ips,flags): submit_flag_auto(i1,i2)

          在攻擊階段要作的是:1.利用已有的exp打;2.挖新的洞:3.權限維持

          web2是ashop,也是基於mvc的形式,目錄結構以下所示

        index.php也就是入口文件,static和view一般是一些靜態文件,config是配置文件,data是數據庫文件,model是和數據庫交互的文件,那麼就須要審計controller文件夾和core文件夾,由於邏輯都在這兩個文件夾中,咱們在比賽中主要找到了兩個web2的洞,一個任意文件讀取,一個反序列話漏洞。

       反序列化漏洞:

       

 

在index.class.php文件中能夠發現這一句,爲客戶端設置了一個cookie值,而且在login.class.php中進行解序列化,因此咱們只須要將payload替換了原始的AshopToken,而後訪問login.php就能夠觸發反序列化漏洞。

因此咱們只須要在客戶端替換AshopToken值就能夠讀取flag文件了.

      任意文件讀取:

     

  在index.class.php中存在這樣一個show_pic()函數,能夠看到最終會調用file_get_contents函數讀取$pic變量,那麼$pic變量又是調用get函數之後的返回值,在這裏咱們跟蹤get函數,在core文件夾下面存在init.php文件,裏面存在以下代碼:

    get函數會對超全局數組GET進行transcribe函數,而且檢測$_GET[$str]變量是否存在,若存在則返回此變量的值,那麼transcribe函數又是進行了什麼操做?

  

 transscribe函數實際上會對GET函數消毒處理,可是對於任意文件讀取漏洞並不起做用,因此咱們只要訪問show_pic.php?file=../../../../../../../flag.txt就能訪問到flag文件了。

         比賽中的不足:

    雖然提早準備了不死馬,可是並無利用漏洞佈置上去,因此下次比賽中應該手速快一點,先利用漏洞佈置不死馬維持好權限,接下來再批量拿flag。

相關文章
相關標籤/搜索