前言:
在看这篇wp之前首先我们要了解文件包含,php伪协议读取,rot13编码,其具体含义即用法自行上网搜索,在文中不做进一步解释。
一、审题
扔给了我们一个道具?暂时还不知道这是要干嘛,所以我们进入靶场看看。
进入靶场后发现是一段php代码,好了有到了快乐的审计环节,首先我们看看代码什么意思:
<?php
highlight_file(__FILE__);
error_reporting(0);
include("seed.php");
//mt_srand(*********);
echo "Hint: ".mt_rand()."<br>";
if(isset($_POST['guess']) && md5($_POST['guess']) === md5(mt_rand())){
if(!preg_match("/base|\.\./i",$_GET['file']) && preg_match("/NewStar/i",$_GET['file']) && isset($_GET['file'])){
//flag in `flag.php`
include($_GET['file']);
}else{
echo "Baby Hacker?";
}
}else{
echo "No Hacker!";
} Hint: 1219893521
No Hacker!
大体观察一下我们最终要的函数是什么,可以看到有一个inclue文件包含且file参数是可控的,因此基本上可以肯定是文件包含的题了,不过这里对file参数做了过滤我们先不管,先看这里有个新奇的东西mt_rand()和注释的mt_srand(),看到这里的时候确实有点懵住了,不过我们好像题目扔给了我们一个工具所以我们先去看看那个网址讲了写啥。(自己仔细看,这里不做解释了)然后我们下载压缩包并把它拖入我们的centos进行解压,命令为:tar -xzf php_mt_seed-4.0.tar.gz。解压缩之后,我们跟着提示进入php_mt_seed-4.0目录下,随之输入提示中的命令time ./php_mt_seed 1219893521,然后可以看到程序已经开跑了
可以看到跑出来几个参数,我们选取第一个1145146(当然也有可能是其他的)作为我们的mt_srand()。
二、编写脚本
直接上代码:
<?php
mt_srand(1145146);
echo mt_rand();
echo mt_rand();
跑出来一串字符串 12198935211202031004,我们取与题目中的出现的字符串不一样的的一串即后面半串1202031004作为guess参数传参,我们试试会不会进入第一个if循环输出Baby Hacker?
我们发现成功进入循环,接下来只要进入第二个if循环就可以读取文件了
三、 伪协议读取源代码
看到include自然而然想到php伪协议读取源代码即:
file=php://filter/read=convert.base64-encode/resource=flag.php
但这里明显过滤了base,且必须含有NewStar字符串,所以我们使用rot13编码进行绕过,并将NewStar字符串嵌入,所以我们的payload为:
file=php://filter/NewStar/read=string.rot13/resource=flag.php
得到flag,进行rot13解码即可。
总结
主要还是考察对新东西的快速理解,还有一些其他的绕过技巧,平时要养成边刷题边把题目里的一些技巧记录下来的好习惯,这样在其他的题目里的绕过才会更得心应手。