NPUCTF部分WP
[我的第一次ctf线上比赛经历]
*西工大ctf公开赛 [toc]
*由于是校外通道,题目做得异常的艰辛。。。。
*这次比赛学到了许多,这次经历还是挺不错的,能做出题目也是很开心呀。。
*菜还是菜得明白哈哈哈哈哈,加油吧!
[web]查源码(50)
直接F12得到flag
[web]RealEzPHP(190)
ps:我发现题目的分数会越来越少。。。
这题在做题的过程中学到了许多。
拿到题还是熟悉的骷髅头,查看源码发现了time.php页面,发现源代码:
<?php
#error_reporting(0);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$c = new HelloPhp;
if(isset($_GET['source']))
{
highlight_file(__FILE__);
die(0);
}
@$ppp = unserialize($_GET["data"]);
一眼可见,核心代码应该是unserialize那里的反序列化操作。
之前一直不知道反序列化是啥(之前部门讲过,不过那时候连php都不怎么会Orz),就去B站看了看,看了一个同时大一新生的up主发的视频,大概已经了解得比较清楚了,感谢up主,已三连哈哈哈哈哈。
大概可以知道传入data参数为序列化之后的字符串,反序列化后触发__destruct函数里面的操作,打印我们想要的结果,其中变量a,b的值是我们可控的。
然后就开始构造payload,最开始不知道$b($a)表示啥意思,手动敲了敲代码,发现应该是b的内容可以当函数名字来调用。
既然可以直接调用函数的话,首先想到的是一句话拿shell,发现变量函数屏蔽掉了eval等函数,
后面想到了看源码,file_get_contents,发现源码里面啥也没有。。。后面又想到直接看flag文件,发现找不到。。。。佛了。。。
后面去Google找php有啥关于shell的函数,找到的函数大部分都被屏蔽掉了,后面才找到assert函数,直接payload
/time.php?data=O:8:"HelloPhp":2:{s:1:"a";s:10:"phpinfo();";s:1:"b";s:6:"assert";}
发现此函数可以用,顺手Ctrl+F,得到flag。
后面想构造$_post拿shell发现失败了也不知道啥原因。不过已经得到flag了,真的超开心,在我之前只有16个人做出来了!!!!开心
后记:一位学长提到可以用file_put_contents提权,但是我操作了半天也没弄好,学长也指点了很久,最后还是放弃了,这里还是要感谢star学长,谢谢!!!
[Crypto]这是什么觅駡(108)
打开看是一张图片
右下角看首字母还是很有直觉,分别对应了星期几的首字母,但是红圈把我迷惑了,以为红圈的里面不算,结果没有成功解出来,Google了日历密码发现跟我想的一样(我太聪明了),然后后面还是把他试出来了。
其中,找到每个符号对应的日期,再对应到字母表中很容易解出结果(具体可以看图):flag{calendar}。
[Crypto]Classical Cipher(135)
这道题下载源码下来发现压缩包密码要自己解,后面对应了已有的明文密文对应关系,很容易看出,这个密文就是把明文对应的字母表翻转了过来,a对应z,b对应y,以此类推。
打开压缩包后发现一张图,可以看出是猪圈密码,但是是猪圈密码的变形,在Google上找到图对应了出来,但是那个象形图还是不知道是啥,就在Google图片上搜索了一下,也找到了对应关系,解出flag{classicalcode}。