一、题目链接
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语句的基础,对于不懂的函数,需要查询资料明白含义。构造双写字符串比较巧,不过这也是在看懂代码的基础上想出来的。
标签:Web,what,work,flag,CTFer,字符串,php,替换,双写 From: https://www.cnblogs.com/miraclewolf/p/17509510.html