4.11Bugku:计算器,alert,你必须让他停下,头等舱,备份是个好习惯

计算器

在这里插入图片描述
计算结果是91,但是输入发现只能输入一位数字
为什么丫!!!
可以通过js或者HTML部分控制输入的位数

方法一

打开源代码找到HTML部分,发现
在这里插入图片描述
有一个maxlength,我们需要输入两位,那么修改为两位(双击修改为2)即可得到flag

方法二

F12打开,选择网络部分,点击页面刷新,可以看到有js文件,打开其中有一个js文件就是有flag信息的
在这里插入图片描述

alert

打开环境,发现有很多弹窗,打开源代码看看到底怎么回事
果然有很多alert,翻到最底部看到有一串奇怪的字符串,这其实是unicode编码
在这里插入图片描述
随便线上找到一个解码的网站,解码得到flag
在这里插入图片描述
为什么这是unicode编码,你怎么知道!!!
unicode编码有三种特征字符头部有&#,和&#x,和\u

你必须让他停下

打开环境,页面在不断刷新,并且提示需要将页面停下来

方法一

发现,在不断刷新页面的同时所给的jpg图片不同,所以可以使用bp抓包并送到repeat模块进行反复发送(send),到第10.jpg时出现flag

请添加图片描述
请添加图片描述

方法三

学习到刷新页面是js在起作用,那么可以禁用js
第一步,在地址栏输入about:config,并且选择接受风险并继续

在这里插入图片描述

第二步,输入java,找到JavaScript.enable,双击true变成false,这样就禁用了js
在这里插入图片描述

返回页面,F12打开,选择查看器,这时候可能还是看不到flag,多刷新几次就可以在10.jpg找到flag了
在这里插入图片描述

在这里插入图片描述

方法三

在之前发现不断刷新页面可以的到不同的jpg并且提示flag is here~
那么我们点开源代码,不断刷新找到flag为止

在这里插入图片描述

在这里插入图片描述

头等舱

打开环境,什么都没有,源代码中也没有
F12打开,选择网络,刷新,看看文件/,可以发现flag(我是误打误撞,并不理解)
看了别人的wp,发现头等舱是响应头的意思,嗯~~~…

在这里插入图片描述
flag{f86baf4e6fb3af35647f679b6d06af79}
这个题还可以用bp抓包得到flag
这也提示我在以后做题时,多看看响应头什么的

备份是个好习惯

题目提示有备份,使用在kali中使用direarch
扫出这些东西
在这里插入图片描述
别看了,/flag没有flag😅
既然说了是备份文件,看看/index.php.bak(备份文件一般都是.bak或者.swp)
以notepad打开
在这里插入图片描述

<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');   //php strstr() 函数搜索一个字符串在另一个字符串中是否存在,如果是,返回该字符串及后面剩余部分(即?和之后的内容);
$str = substr($str,1);                         // 返回第一个字符后面的字符; 相当于把?后面的字符返回(不包含?);
$str = str_replace('key','',$str);             // 把 key 替换成空格
parse_str($str);                               //把查询字符串解析到变量中
echo md5($key1);                               //key1 回显
 
echo md5($key2);                               //key2 回显
if(md5($key1) == md5($key2) && $key1 !== $key2){   //比较,若key1 和key2的md5值相等,且key1、key2 不等;得到flay
    echo $flag."取得flag";
}
?

这时候会利用到PHP的MD5弱比较
例如我们用GET传参,传入?key1[]=1&key2[]=2

URL: http://example.com/path/to/script.php?key1[]=a&key2[]=b

  1. $str = strstr($_SERVER[‘REQUEST_URI’], ‘?’);

    提取 ? 及之后的部分

    结果:$str = "?key1[]=a&key2[]=b"

  2. $str = substr($str,1);

    去掉开头的 ?

    结果:$str = "key1[]=a&key2[]=b"

  3. $str = str_replace(‘key’,‘’,$str);

    移除所有 ‘key’ 字符串

    注意:这里会替换 key1 和 key2 中的 key 部分

    替换后:$str = "1[]=a&2[]=b"

  4. parse_str($str);

    解析字符串为变量

    由于 key 被移除,现在解析成了:

    1[]=a&2[]=b

    然后 parse_str($str) 会解析这个字符串,创建变量:

    $1 = ['a'] (变量名是 1,值是一个数组)

    $2 = ['b'] (变量名是 2,值是一个数组)

  5. 但 $key1 和 $key2 没有被定义! 因为 key1 和 key2 被替换成了 1 和 2
    由于 $key1 和 $key2 不存在,PHP 会:
    把它们当作NULL处理
    md5(null) 的结果是:
    d41d8cd98f00b204e9800998ecf8427e
    所以两次 echo md5(…) 都会输出相同的值(这也解释了在最开始的页面有一串MD5字符串,解码出来时NULL)

那么想要绕过,就必须在经过所有函数处理后还剩下key1变量名和key2变量名
这里使用双写绕过
?kkeyey1[]=1&kkeyey2[]=2
得到flag{2455eaf57eda368d3b230e022d3dfd2a}
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值