csrf学习笔记(Python)

一、csrf是什么

csrf:cross-site-request-forgrey,跨站请求伪造。

我们伪造了一个跨站请求,让登录状态的用户点击,就会执行伪造的请求,因为是用户自己的点击,服务器会认为这是用户在做操作。

二、实施条件

1、用户愿意点击链接(如果对方服务器存在xss漏洞,写一个存储型xss,只要用户加载页面就会实施我们伪造的请求,不过既然都写存储型了,何必再用csrf)

2、用户打开链接的浏览器与他登录账户的浏览器是同一个(如果默认浏览器与登录浏览器不同,将无法跨浏览器实现获取到session)

3、用户没有实行严格的IP、Referer等校验(比如校验了Referer必须以"http://主机名"开始等)

4、用户点击链接时处于登录状态,但我们拿不到cookie(如果能拿到cookie就直接用伪造用户身份进行登录了)

5、能抓到对方修改信息的接口

三、怎么实施

容易露馅版:

1、伪造一个用户修改的url链接,并将我们想修改的参数放进去(基于get请求)

http://192.168.17.133/php/csrfdemo.php?password=123abc&repassword=123abc

2、最好将后边拼接的参数转码,否则不要太太太太明显

http://192.168.17.133/php/csrfdemo.php%3f%70%61%73%73%77%6f%72%64%3d%31%32%33%61%62%63%26%72%65%70%61%73%73%77%6f%72%64%3d%31%32%33%61%62%63

3、发给用户,至于如何让他点链接,这就涉及到社会工程学了……

基础版:

1、抓包到用户的修改界面,用burp工具,生成CSRF POC

2、复制代码到html文件中,修改value中的值,删去不需要的地方(这需要诱使用户进入链接后再点击才行,可以添加一点吸引人的素材)

或者写这样的钓鱼网站(只要点入链接就会执行修改)……

3、将该链接发给用户,当用户点击就会跳转到我们指定的页面,并执行伪造的命令(最好将html文件命名得迷惑一点,类似康帅傅这种迷惑度……)

4、用户密码被改成123456

有点Referer校验版:

1、用户设置了Referer校验:必须包含HOST(不那么严格,仅包含),直接修改文件名,使其包含HOST!(前提是浏览器版本不会去掉文件名!)

token版:

用户的每一个请求都会刷新token,因此为了获取新鲜可用的token,采用ajax或者引入jQuery进行异步提交,不刷新用户页面的情况下先获取token,再进行信息修改

1、(Windows中)写一个ajax的js文件,用外部引入js的形式,写进用户的服务器中

2、用外部引入js的形式,写进用户的服务器中(下面仅仅是举个例子,实际中要找用户服务器上我们可以进行输入的地方,比如服务器上的留言、发帖等可以被用户加载到的地方)

3、当用户访问到该存储信息时,会直接被修改密码

四、防御

1、不要在url中使用明文操作,抓包一抓一个准,敏感信息修改使用post请求

2、严格检查Referer头部信息,非本网站的请求拒绝;

3、做增删改之类的操作要进行二次校验,再次校验管理员密码

4、设置session过期时间,避免持续保持登录状态被利用

5、避免交叉漏洞(即使有token的情况下,利用xss漏洞仍然能够完成修改)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CSRF(Cross-Site Request Forgery)是一种常见的网络安全漏洞,攻击者利用用户的身份发起恶意请求。为了防止CSRF攻击,常常需要在请求中使用CSRF-Token来验证请求的合法性。在Python中,可以通过以下几种方式获取并使用CSRF-Token来进行防护: 方法一: 使用requests库发送POST请求获取CSRF-Token,并将其作为请求参数发送。具体代码如下所示: ```python import requests import json def get_csrf_token(): headers = {} # 请根据需要设置请求头 get_token_url = "https://zsb.nwpu.edu.cn/f/ajax_get_csrfToken" response = requests.post(get_token_url, headers=headers) csrf_token = json.loads(response.text)['data'] return csrf_token ``` 方法二: 使用requests库创建Session对象,先请求登录页面获取CSRF-Token,然后使用获取到的CSRF-Token登录并进行其他操作。具体代码如下所示: ```python import requests import re def login_with_csrf_token(): login_url = 'http://example.com/login' session = requests.Session() # 先请求登录页面获取CSRF-Token login_page = session.get(login_url).text csrf_token = re.findall('csrf_token=(.*?)&', login_page)[0] # 使用获取到的CSRF-Token登录 data = { 'username': 'admin', 'password': '123456', 'csrf_token': csrf_token } login_result = session.post(login_url, data=data) # 在同一个Session下进行其他操作 data = { 'param1': 'value1', 'param2': 'value2', 'csrf_token': csrf_token } result = session.post('http://example.com/other_operation', data=data) ``` 方法三: 在请求参数中嵌入CSRF-Token。具体代码如下所示: ```python import requests def send_request_with_csrf_token(): url = 'http://example.com/submit_form' csrf_token = '1234567890abcdef' params = { 'param1': 'value1', 'param2': 'value2', 'csrf_token': csrf_token } response = requests.get(url, params=params) ``` 以上是三种常见的使用CSRF-Token的方式,具体使用哪种方式取决于你的实际需求和场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值