计算器
计算结果是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
-
$str = strstr($_SERVER[‘REQUEST_URI’], ‘?’);
提取 ? 及之后的部分
结果:
$str = "?key1[]=a&key2[]=b"
-
$str = substr($str,1);
去掉开头的 ?
结果:
$str = "key1[]=a&key2[]=b"
-
$str = str_replace(‘key’,‘’,$str);
移除所有 ‘key’ 字符串
注意:这里会替换 key1 和 key2 中的 key 部分
替换后:
$str = "1[]=a&2[]=b"
-
parse_str($str);
解析字符串为变量
由于 key 被移除,现在解析成了:
1[]=a&2[]=b
然后 parse_str($str) 会解析这个字符串,创建变量:
$1 = ['a'] (变量名是 1,值是一个数组)
$2 = ['b'] (变量名是 2,值是一个数组)
-
但 $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}