CTFer成长记录——Web专题·双写绕过

发布时间 2023-06-27 17:39:33作者: MiracleWolf

一、题目链接

http://a.y1ng.vip:1126/employeeswork/

二、题意解析

  访问该网址:

  发现是一些不明觉厉的英文:

  关于Y1ng公司所有员工的通知:

  如果你认为你对自己的工作感到满意,你可以使用函数work_worthy()。

  但是是否值得,只会由我的机器人Precoce de Malingre来判断。

那么点开它给的链接试试:

给了一些php代码,还有个include'flag.php'的特征,那么可以尝试能否直接访问flag.php以获取flag。

结果是空白页面,查看源代码发现也没有任何东西。那么说明直接访问flag.php是行不通的。

接着回到题目所给的PHP代码中,include语句的作用类似C语言中的#include ,都是使用一个文件的内容。那么这里题目可能是想让我们从flag.php中输入东西,然后根据下面的判断语句来获取更多的信息。

这里直接执行了source=true,于是有了我们看到含有代码的页面,那么如果我们不对source进行赋值,改对work进行赋值,也许就可以获取flag了。

四、解法步骤

代码分析:

 1 include 'flag.php';
 2 if (isset($_GET['source']) && $_GET['source'] == 'true') {
 3     show_source(__FILE__);
 4     exit;
 5 }
 6 if (isset($_GET['work'])) {
 7     $what_is_your_attitude_of_your_work = $_GET['work'];  //将work的值赋值给what_is变量
 8     $what_you_say_can_gain_more_income = "y1ng_pretty_handsome";//这里将what_you变量的值赋值为y1ng_pre
 9     $what_Precoce_de_Malingre_said = preg_replace(        //接着对what_Pre利用preg_replace()函数进行赋值。
10 "/$what_you_say_can_gain_more_income/",'', $what_is_your_attitude_of_your_work 11 );
    // $temp = preg_replace(A,B,C)函数接受三个参数,A表示搜索模式:可以是字符串或字符串数组
                          B表示替换结果,C表示要搜索并替换的字符串
  因此preg_replace(A,B,C)函数的的意义是:在what_is中进行查找,找到what_you的内容,并将其替换为空,然后最后的结果赋值给what_Pre
  
12 if ($what_Precoce_de_Malingre_said === $what_you_say_can_gain_more_income) {
      //只要替换后的结果仍然等于替换前的结果,那么执行work_worthy()函数
13 work_worthy(); 14 } 15 } 16 ?>

我们想执行最后的判断语句,就必须让替换后的what_is等于替换前的what_you,换句话说,我们需要传入work的值,使得它经过what_you的替换后等于what_you。

但是一般情况下替换后,字符串就会改变,这里也不是空替换,必须替换一个字符串。

这时候可以使用双写该字符串,让函数替换掉重复的字符串,这样就达到了目的。

 

这样我们将what_you的值传入work两遍(在任意位置再复制一遍即可),那么替换函数会将what_you的内容替换成空字符串,于是就可以达到替换前后一致的效果,最后得到flag:

四、总结

这道题稍微难点,需要一些看懂php语句的基础,对于不懂的函数,需要查询资料明白含义。构造双写字符串比较巧,不过这也是在看懂代码的基础上想出来的。