备份是个好习惯
原文链接:https://blog.csdn.net/weixin_43578492/article/details/95527352加上自己的工具运用
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
个人收获:常用备份文件后缀:*.swp,*.bak
md5函数漏洞
php弱判断
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
题目描述
题目传送门:http://123.206.87.240:8002/web16/
解题思路
打开链接得到的一串暂时看不懂的编码。。。
小白什么都不懂,直接御剑扫描吧
PS:我的御剑扫不出,/(ㄒoㄒ)/~~
看大佬的wp是用源码泄露工具搞到的备份文件,以后可能会补上此方法
大佬的东西是真的好用,
地址:https://coding.net/u/yihangwang/p/SourceLeakHacker/git 谷歌打开
用法:
Usage :
python SourceLeakHacker.py [URL] [ThreadNumbers] [Timeout]
Example :
python SourceLeakHacker.py http://127.0.0.1/ 32 16
Tips :
32 threadNumber is recommended.
5 second timeout is recommended.(You can also use a decimal to set the timeout.)
If you have any questions, please contact [ wangyihanger@gmail.com ]
```
也即当前就是输入 python SourceLeakHacker.py http://123.206.87.240:8002/web16/ 32 16
可以得到
备份地址:http://123.206.87.240:8002/web16/index.php.bak
下载文件,内容如下:
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php";
ini_set("display_errors", 0); #@ini_set('display_errors', 1); display_errors':设置错误信息的类别。
$str = strstr($_SERVER['REQUEST_URI'], '?');
// strstr(str1,str2) 字符串str1中搜索str2,如果存在则返回str2及str2以后得剩余部分;
$str = substr($str,1);
// php 得substr() 这里省略了第三个参数 长度,所以从第一个开始截取到最后;
$str = str_replace('key','',$str);
// str_replace("world","Shanghai","Hello world!") 把hello world里面得world换成shanghai
parse_str($str);
把查询字符串解析到变量中:
//echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
代码知识点:
strstr() 函数 strstr(string,search,before_search) 搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE(区分大小写),stristr() 函数,这个不区分;
substr() 函数 substr(string,start,length) 返回字符串的一部分;
str_replace() 函数str_replace(find,replace,string,count)
替 换字符串中的一些字符(区分大小写)。
parse_str() 函数 parse_str(string,array) 把查询字符串解析到变量中
所以,整段代码的意思就是j截取URL?后的参数,并把gat到的变量中所有key替换为空格,不过这里我们可以用kkeyey绕过
if(md5($key1) == md5($key2) && $key1 !== $key2)
1
但是通过这段代码可以知道,我们传进去的变量,它们的md5值要相同,但它们本身却有不同,这里我们又要用到一个小知识点:
法一、md5()函数是无法处理数组的,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。
所以将key1,key2写成数组,内容再不一样就行啦
法二、利用==弱比较漏洞
科学计数法为*e***,如果两个字符串解密后是0e***那么他们两个就相等啦
下面几个都是开头为0e的
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
123456
得到FLAG
法一、构造Payload
http://123.206.87.240:8002/web16/?kekeyy1=QNKCDZO&kekeyy2=240610708
法二、构造Payload
http://120.24.86.145:8002/web16/index.php?kekeyy1[]=something&kekeyy2[]=anything
原网页给出的内容的字符串是两段相同的字符串拼接,MD5解密为空密码