备份是个好习惯-BugKu

题目

拿到题目后先访问站点看看情况:

 

发现得到了类似md5的字符串,但是md5一般是16位或者32位,但这个是64位,试着分开看看:

d41d8cd98f00b204e9800998ecf8427e
d41d8cd98f00b204e9800998ecf8427e

 其实是两段一样的md5值,碰碰运气,看看能不能解,结果试了几个网站都没解出来,唯一解出来的还是个空密码:

 

那只能换个思路了,根据题目提示,应该存在备份文件,先扫个目录:

果然扫出来一个index.php.bak文件,访问下载来看看,初学php审计的我,只能借鉴一下大佬的解释,沾个大佬的wp。

 

<?php
/**
 * Created by PhpStorm.
 * User: Norse
 * Date: 2017/8/6
 * Time: 20:22
*/

include_once "flag.php";
//文件包含flag.php,可以理解为该语句等价于flag.php中的代码
//include_once和include都可用于文件包含,但include_once确保该文件只被包含一次

ini_set("display_errors", 0);
//将php.ini中的display_errors设为0,表示错误信息的类别为0
//在此题中可以忽略

$str = strstr($_SERVER['REQUEST_URI'], '?');
//$_SERVER['REQUEST_URI']的作用是获取域名后的路径
//如当前页面为:http://114.67.246.176:13750/aaa/bbb/ccc
//那么此时_SERVER['REQUEST_URI']="aaa/bbb/ccc"

//strstr的作用是找到字串在主串中的位置,并返回子串及子串后的内容
//如strstr("111,222,333","222")="222,333"

$str = substr($str,1);
//substr的作用是获取子串
//第一个参数提供原始串,第二个参数提供子串起点
//如substr("ABCDEFG", 2)="CDEFG"
//此时子串的起点为'C',因此返回"CDEFG"

$str = str_replace('key','',$str);
//str_replace的作用是把原始串中的特定子串替换为另一子串
//在这里的作用是把str中的"key"替换为""(空串),也就是删除str中所有的"key"

parse_str($str);
//parse_str的作用是解析特定的字符串
//如parse_str("year=2021&month=10&date=4")
//那么此时就会获得三个变量:year=20121, month=10, date=4

echo md5($key1);
echo md5($key2);
//分别输出key1和key2的md5值

if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag."取得flag";
}
//获取flag的条件


?>

说的很详细,我一小白都看懂了!!!

后面一看,要先找到两个key,使得key1和key2的md5值相同,但key1和key2的值不同,其实按道理应该不存在才对,原因就在于代码中的“==”,如果是“===”,那就不存在了,简单来说,"=="判定允许两侧的变量类型不同,若类型不同,则会转换为相同的类型再比较;"==="判定不允许两侧的变量类型不同,若类型不同直接返回false。而且,"=="判定在解释0e开头的哈希值时,会将其解释为0。

也就是说,只要md5(key1)和md5(key1)都由0e开头,并且key1!==key2,判定结果就为true。只需在网上查询0e开头的md5值即可:

 随便选两个:

key1=s878926199a
key2=s155964671a

构造一下提交上去看看:

?key1=s878926199a&key2=s155964671a

 很明显,没反应,这是因为代码中的这两句:

$str = substr($str,1);

$str = str_replace('key','',$str);

使得传入的参数变成了:

1=s878926199a&2=s155964671a

显然这是一个parse_str无法解析的赋值语句,那这里可以双写一下key,变成:

?kkeyey1=s878926199a&kkeyey2=s155964671a

也就是在key里再写一个key,这样过滤后的语句就可以被parse_str解析:

 成功拿到flag!!!

至于通篇没有定义flag的值,那么flag又是从哪来的呢?详情看大佬的最后部分

总结:学到了一些PHP函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余切66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值