[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 为不区分大小写进行替换

在访问/content.php?id=1的时候发现返回头中有CSP,这个CSP策略的意思是只能执行本页面的js语句。

看那个过滤,实际上有个逻辑错误,例如我想使用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/接收

小结

  1. xss的payload要根据加载的js写

  2. https://beeceptor.com/就试试http://requestbin.cn/

最后更新于