php字符串函数、md5加密绕过--Bugku - 19备份是个好习惯

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

发布了30 篇原创文章 · 获赞 0 · 访问量 2045

猜你喜欢

转载自blog.csdn.net/s11show_163/article/details/103268028
今日推荐