1.
御剑扫描隐藏界面:
url输入index.php.bak跳转至index.php.bak是个下载文件,下载后可得源码。
2.
- strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
- substr(string,start,length)
参数 描述 string 必需。规定要返回其中一部分的字符串。 start 必需。规定在字符串的何处开始。
正数 - 在字符串的指定位置开始
负数 - 在从字符串结尾开始的指定位置开始
0 - 在字符串中的第一个字符处开始length 可选。规定被返回字符串长度。默认是直到字符串的结尾。
正数 - 从 start 参数所在的位置返回的长度
负数 - 从字符串末端返回的长度 - str_replace(find,replace,string,count)在string中找到find替换为replace,此次操作替换count次(count非必需,可选)
<?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'], '?');#REQUEST_URL,检验其是否含有‘?’表示检验该请求url是否传参
$str = substr($str,1); #将url第1个字符'?'截断只取后面传参部分给str。
$str = str_replace('key','',$str);#找到请求url中的子串'key'替换为空格
parse_str($str);#解析该字符串
echo md5($key1);
echo md5($key2);#输出key1和key2的值,判断解析是否成功
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
下文系转载:
在做到Bugku的一道题目时,感觉知识点有些多,这里总结一下。
题目连接http://120.24.86.145:8002/web16/
打开界面只有这一串字符串
尝试各种解密解码格式都没有效果,可以观察到整个字符串是d41d8cd98f00b204e9800998ecf8427e的两段重复,其实是MD5加密,最后再揭晓。
那现在怎么办呢,按照题目 备份是个好习惯,是让我们寻找 .bak文件的,也就是说
存在某个文件的.bak文件可以访问,那就试试 http://120.24.86.145:8002/web16/index.php.bak,就拿到了提示文件,好确实有点让新手小白有点难以接受,这里想推荐一航大佬的一款源码泄露工具,可以自动访问常见的CTF线索文件,如果返回正常说明文件存在。
下载地址 https://coding.net/u/yihangwang/p/SourceLeakHacker/git?public=true
运行效果:
我们可以看出有 index.php 和index.php.bak 的状态码为200 ,说明文件存在。
文件下载下来,这里用sublim打开:
<?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”;
}
?>
整段代码的意思是将get的两个参数中的key替换为空(这里可以用kekeyy绕过),然后对key1,key2的值进行md5加密,并进行比较,
如果md5加密的值一样而未加密的值不同,就输出flag.
有两种方法绕过:
1,md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。
2,利用==比较漏洞
如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。
下列的字符串的MD5值都是0e开头的:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
最后看看d41d8cd98f00b204e9800998ecf8427e是什么意思,拿到MD5解密试一下,结果为NULL,也就是说这是NULL的MD5值,因为默认是没有传入key1和key2的,这两个值也就是null.
后半段转自:https://blog.csdn.net/zpy1998zpy/article/details/80582974