web——备份是个好习惯(80)——Bugku

22 篇文章 0 订阅

0×00 靶场链接

http://123.206.87.240:8002/web16/

 
0×01 题目描述

点进去就是一串字符串

 

0×02 解题过程

仔细看一下是一串字符串重复了两次,题目提示要看备份文件,用御剑扫一扫。

点进去看看,没有变化

然后搜索资料知道一般备份文件是以bak结尾的,就在后面加上.bak

得到文件如下

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

include_once "flag.php";//引入flag.php文件代码
ini_set("display_errors", 0);//关闭php错误显示
$str = strstr($_SERVER['REQUEST_URI'], '?');//strstr获得URI从'?'之后的字符串(包括?)
$str = substr($str,1);//去掉'?',这里是从第一位开始截断的意思,所以为什么不一开始就不捕获'?'
$str = str_replace('key','',$str);//把字符串中的'key'用空''替换,可以使用类似这样的语句kkeyey进行绕过处理,这样就可以保留key关键字了
parse_str($str);//把字符串解析到变量当中,如parse_str('key1=a&key2=b');与$a=a;$b=b效果相同
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){//二者md5相等而key1,key2不等,可以采用php弱类型绕过
    echo $flag."取得flag";
}
?>

代码的意思是,将get的两个参数中的key替换为空(这里可以用kekeyy绕过),需要key1和key2经过md5加密之后的值相等,但是他们本身又不能相等。

Md5中有一些开头时0e的字符串,0e在比较的时候会被看作科学计数法,无论后面是多少,因此比较的时候MD5转码都为0,即相等

大概有这些都是的

QNKCDZO

240610708

s878926199a

s155964671a

s214587387a

s214587387a

然后构造的时候随便取两个就完了

kkeyey1= 240610708&kkeyey2= QNKCDZO,等等,不能随便取!开头全部为s的好像就不行,这个注意下就好了,然后key关键字绕过其他样式都行,比如kekeyy

还有一个绕过方法是利用数组

md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。

于是构造payload:?kkeyey1[]=1&kkeyey2[]=2

出来的更加简洁了

0×03 知识点

php弱类型

一共八种

标量类型:布尔boolean,整形integer,浮点float,字符string

复杂类型:数组array,对象object

特殊类型:资源resource,空null

因为是弱类型的语言,所以比较的时候无需看类型,只看值是否相等就可以了

其中

Php的一个数字和一个字符进行比较或者运算时,PHP会把字符串转换成数字再进行比较,PHP转换规则是,如果字符串以数字开头,那么就取开头的数字作为转换结果,如果无效就输出0.

Md5中有一些开头时0e的字符串,0e在比较的时候会被看作科学计数法,无论后面是多少,因此比较的时候MD5转码都为0,即相等

大概有这些都是的

QNKCDZO

240610708

s878926199a

s155964671a

s214587387a

s214587387a


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值