SCRF && SSRF

csrf全称为:Cross-site request forgery,是一种常见的web攻击。在场景中,攻击者会伪造一个请求(通常是一个链接),然后欺骗目标用户点击,用户一旦点击,攻击也就完成了。
与xss的区别:csrf是借助用户的权限完成攻击,攻击者并没有拿到权限;而xss是直接盗取用户权限去进行破坏。
我们可以看到low难度的源代码中,并没有隐藏的token,这样我们的难度就小了很多。
然后我猜测这里的密码检测是直接将输入的进行拼接,检验password_new与password_conf是否一致。
于是可以先伪造一个简陋的链接:
http://192.168.1.102/dvwa-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
(注:里面的ip要改成自己的)
防御方案
1、当用户发送重要的请求时需要输入原始密码
2、设置随机 Token
3、检验 referer 来源,请求时判断请求链接是否为当前管理员正在使用的页面(管理员在编辑文章,
黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所以攻击失败)
4、设置验证码
5、限制请求方式只能为 POST
代码演示
未进行 csrf 校验的 WebA
后端代码实现
from flask import Flask, render_template, make_response
from flask import redirect
from flask import request
from flask import url_for
app = Flask(__name__)
@app.route('/', methods=["POST", "GET"])
def index():
if request.method == "POST":
# 取到表单中提交上来的参数
username = request.form.get("username")
password = request.form.get("password")
if not all([username, password]):
print('参数错误')
else:
print(username, password)
if username == 'laowang' and password == '1234':
# 状态保持,设置用户名到cookie中表示登录成功
response = redirect(url_for('transfer'))
response.set_cookie('username', username)
return response
else:
print('密码错误')
return render_template('temp_login.html')
@app.route('/transfer', methods=["POST", "GET"])
def transfer():
# 从cookie中取到用户名
username = request.cookies.get('username', None)
# 如果没有取到,代表没有登录
if not username:
return redirect(url_for('index'))
if request.method == "POST":
to_account = request.form.get("to_account")
money = request.form.get("money")
print('假装执行转操作,将当前登录用户的钱转账到指定账户')
return '转账 %s 元到 %s 成功' % (money, to_account)
# 渲染转换页面
response = make_response(render_template('temp_transfer.html'))
return response
if __name__ == '__main__':
app.run(debug=True, port=9000)
前端登录页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h1>我是网站A,登录页面</h1>
<form method="post">
<label>用户名:</label><input type="text" name="username" placeholder="请输入用户名"><br/>
<label>密码:</label><input type="password" name="password" placeholder="请输入密码"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
前端转账页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>转账</title>
</head>
<body>
<h1>我是网站A,转账页面</h1>
<form method="post">
<label>账户:</label><input type="text" name="to_account" placeholder="请输入要转账的账户"><br/>
<label>金额:</label><input type="number" name="money" placeholder="请输入转账金额"><br/>
<input type="submit" value="转账">
</form>
SSRF


什么是SSRF
服务器端请求伪造(SSRF)是指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。(利用一个可发起网络请求的服务当作跳板来攻击其他服务)
攻击者能够利用目标帮助攻击者访问其他想要攻击的目标
攻击者要求服务器为他访问URL
SSRF作用
端口扫描,指纹识别,漏洞利用,内网探针等
探测各种协议
http://192.168.64.144/phpmyadmin/
file:///D:/www.txt
dict://192.168.64.144:3306/info
ftp://192.168.64.144:21
探测网站的信息






