BugKu 备份是个好习惯(扫描以及PHP弱类型中MD5绕过)

——题记——

这个题重要考察都PHP代码的理解以及PHP弱类型中MD5绕过题型的考察

PHP弱类型
string(字符串)
integer(整数)
array(数组)
double(浮点数)
boolean(布尔)
object
resource
NULL
题型1 strcmp 比较字符串大小
题型2 MD5绕过
方法1 科学计数法绕过 md5(‘QNKXDZO’)==md5(‘240610708’) ==‘0e289745…’
方法2 MD5特性 md5([1,2,3])==md5([4,5,6])==NULL

—————

打开链接 123.206.87.240:8002/web16/
得到字符串

d41d8cd98f00b204e9800998ecf8427ed41d8cd98f00b204e9800998ecf8427e

发现是MD5加密,但是解密为空字符,观察是两个相同的字符串连在一起,加上题目说“备份”,想到 下载源码备份文件
url/index.php.bak。
:备份文件的扩展名为 xx.swp 、xx.bak
——————————————————
还可以使用御剑扫描

本人弄了好长时间才弄懂御剑使用方法
在这里插入图片描述
将得到的备份文件用代码编译器打开(我使用的是Notepad++,其他的都可,只要能打开文件就行)

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

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag."取得flag";
}
?>

阅读代码(关键是MD5):

这里有几个函数:
  strstr(string,search,before_search):找到search字符串在string中第一次出现的位置,并把后面的字符串输出;before_search如果为true,则返回位置之前的字符串;默认为false;
  substr(string,start,length):看参数很容易理解,返回字符串的一部分;
  str_replace(find,replace,string,count):在字符串sting中找到字符串find,并把它替换成replace;
  parse_str(string,array):把查询字符串解析到变量中

然后我们可以知道这段代码的意思:代码从?后开始截取到str中,也就是变量后开始截取字符串;然后从位置1开始截到字符串结束;之后把字符串中的kay字段全用‘ ’替代,这个我们可以通过构造"kekeyy"来绕过;最后把key1和key2解析成变量;

MD5 来了 ^ _ ^

敲重点:
根据我们上面补充的知识点,代码要求我们构造出key1和key2的md5值相等,而它们本身却不相等,md5无法对数组进行构造,构造的结果都为NULL,这样我们只要让key1和key2是两个数组就好

构造url:/?kekeyy1[]=1&kekeyy2[]=2

得到flag

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值