实训Day6

一、总结CSRF和XSS的区别

攻击原理

CSRF:CSRF攻击利用网站对用户身份的信任,通过伪造来自受信任用户的请求来攻击网站。攻击者构造一个请求,诱导用户在已登录的网站上执行该请求,从而冒充用户进行非法操作。这种攻击依赖于用户已经登录目标网站并生成了有效的认证信息(如Cookie)。

XSS:XSS攻击则是通过向目标网站注入恶意脚本(通常是JavaScript),当其他用户浏览该网站时,这些脚本会在用户的浏览器中执行,从而达到攻击的目的。XSS攻击的核心在于HTML注入,攻击者将恶意代码嵌入到网页中,当网页被加载时,恶意代码就会执行。

攻击目标

CSRF:CSRF攻击的目标主要是用户,通过伪造用户的请求来执行非法操作,如转账、修改密码等。攻击者并不直接获取用户的敏感信息,而是利用用户的身份进行攻击。

XSS:XSS攻击的目标主要是服务器和用户。攻击者可以通过XSS攻击获取用户的敏感信息(如Cookie、会话令牌等),进而控制用户的账户或进行其他恶意操作。同时,XSS攻击也可以对服务器造成威胁,如通过注入恶意脚本执行服务器上的敏感操作。

实现方式

CSRF:CSRF攻击通常通过构造一个看似合法的请求链接或表单,诱导用户点击或提交。这个请求会携带用户的认证信息(如Cookie),从而冒充用户进行操作。攻击者可以利用图片标签(<img>)、表单(<form>)等HTML元素来触发CSRF攻击。

XSS:XSS攻击的实现方式多种多样,包括反射型XSS、存储型XSS和基于DOM的XSS等。反射型XSS通过URL参数等方式将恶意脚本注入到网页中;存储型XSS则将恶意脚本存储在服务器上,当用户访问包含该脚本的页面时执行;基于DOM的XSS则通过修改页面的DOM结构来执行恶意脚本。

 防御策略

CSRF:防御CSRF攻击的主要策略包括使用CSRF令牌(Token)、验证HTTP Referer头部、设置Cookie的SameSite属性等。CSRF令牌是一种随机生成的字符串,用于验证请求的合法性;验证HTTP Referer头部可以确保请求来自受信任的源;设置Cookie的SameSite属性可以防止跨站请求携带Cookie。

XSS:防御XSS攻击的主要策略包括对用户输入进行严格的过滤和转义、设置Content-Security-Policy(CSP)策略、使用HTTP头指定内容类型等。过滤和转义可以防止恶意脚本被注入到网页中;CSP策略可以限制网页可以加载的外部资源;设置Content-Type头部可以防止浏览器将响应内容当作HTML解析。

二、CSRF攻击步骤

用户打开浏览器,访问受信任网站,输入用户名和密码请求登录网站;

在用户信息通过验证后,网站产生Cookie信息并返回给浏览器,此时用户登录网站成功,可以正常发送请求到网站;

用户未退出网站之前,在同一浏览器中,打开一个TAB页访问网站;

网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

浏览器在接收到这些攻击性代码后,根据网站的请求,在用户不知情的情况下携带Cookie信息,向网站发出请求。网站并不知道该请求其实是由发起的,所以会根据用户C的Cookie信息以的权限处理该请求,导致来自网站的恶意代码被执行。

三、总结CSRF手工构造POST型页面方法

  • 分析目标:确定你想要攻击的目标网站以及该网站中哪个页面或接口允许通过POST请求修改敏感数据。
  • 请求分析:使用开发者工具或抓包工具来分析通过POST请求提交数据的正常流程,包括请求的URL、请求头、请求体中的参数等。
  • 创建HTML文件:在本地或服务器上创建一个新的HTML文件,用于构建攻击页面。
  • 编写表单:在HTML文件中编写一个<form>标签,设置其action属性为目标网站的URL,method属性为POST。
  • 添加输入字段:根据目标请求的参数,在表单中添加相应的<input>标签,并设置其name属性与请求参数一致。为了隐藏表单内容,可以将<input>标签的type属性设置为hidden,或者通过CSS样式将其隐藏。
  • 提交按钮:添加一个提交按钮,诱导用户点击。
  • 发送链接:将攻击页面的URL通过电子邮件、社交媒体或其他渠道发送给目标用户。
  • 伪装页面:为了使攻击更具欺骗性,可以设计攻击页面以模仿目标网站的外观或主题,增加用户点击的可能性。

四、说明token类CSRF利用方法

  • 生成Token:在用户登录成功后,服务器会生成一个随机的、唯一的Token,并将其保存在会话或数据库中,同时将该Token发送到客户端。
  • 传递Token:客户端在后续的请求中,需要将这个Token作为请求的一部分发送给服务器。对于表单提交,Token通常被添加为一个隐藏的表单字段;对于AJAX请求,Token则可能被添加到请求头中。
  • 验证Token:服务器在接收到请求后,会检查请求中是否包含了有效的Token,并且该Token是否与服务器保存的Token相匹配。如果Token不存在、已过期或不匹配,服务器将拒绝该请求,从而防止CSRF攻击。

五、SSRF常用伪协议

  • file://
  • 从文件系统中获取文件内容。攻击者可以通过构造包含file伪协议的URL,使服务器读取并返回敏感文件的内容,如/etc/passwd(存储用户账户信息)、/etc/hosts(显示系统网卡配置和IP地址)等。
  • dict://
  • 字典服务协议,用于访问字典资源。尽管其原始用途是查询词典内容,但在SSRF攻击中,它可以被用来扫描内网主机的开放端口。攻击者可以构造包含目标端口和dict命令的URL,通过观察响应来判断端口是否开放。
  • ftp://
  • 文件传输协议,用于在网络上进行文件传输。在SSRF攻击中,ftp协议虽然不常用,但理论上可以用于网络端口扫描。然而,由于ftp协议的特性,其扫描效率相对较低,且可能无法准确识别所有类型的服务。
  • gopher://
  • 分布式文档传递服务协议,虽然现在已经较少使用,但在SSRF攻击中仍具有强大的功能。gopher协议可以用于发送几乎任何类型的HTTP请求,包括GET和POST请求,因此可以攻击那些需要交互的应用。
  • http:// 和 https://
  • 超文本传输协议和安全超文本传输协议,用于在Web上传输数据。在SSRF攻击中,http和https协议是最常见的利用方式之一。攻击者可以通过构造包含恶意URL的请求,使服务器向目标网站发送请求,从而获取敏感信息或执行恶意操作。
  • ldap://
  • 轻量级目录访问协议,用于访问和维护分布式目录信息。在SSRF击中,ldap协议可以被用来查询内网中的LDAP服务器,获取敏感信息如用户账户、密码等。
  • tftp://
  • 简单文件传输协议,用于在网络上进行简单的文件传输。

六、SSRF pikachu靶场通关

1.

2.

以下是一个简单的C语言万年历的实训报告,供您参考: 一、实训目的 本次实训的主要目的是通过编写一个简单的C语言万年历程序,巩固C语言基本语法和编程思想,提高编程能力和解决问题的能力。 二、实训要求 1、能够使用C语言基本语法和控制语句编写程序。 2、能够使用数组来存储和操作数据。 3、能够使用函数来实现模块化编程。 4、能够使用指针来操作内存中的数据。 5、能够使用文件来读取和写入数据。 三、实训内容 1、程序功能 本程序实现了一个简单的万年历功能,可以通过输入年份和月份来显示该月的日历。 2、程序实现 以下是本程序的主要代码实现: ```c #include <stdio.h> // 判断是否为闰年 int is_leap_year(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return 1; } else { return 0; } } // 获取某个月份的总天数 int get_days(int year, int month) { int days[] = {31, 28 + is_leap_year(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return days[month - 1]; } // 获取某个日期是星期几 int get_weekday(int year, int month, int day) { if (month == 1 || month == 2) { year--; month += 12; } int c = year / 100; int y = year % 100; int w = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1; w = (w % 7 + 7) % 7; return w; } // 显示日历 void show_calendar(int year, int month) { int days = get_days(year, month); int weekday = get_weekday(year, month, 1); printf(" 日 一 二 三 四 五 六\n"); int i; for (i = 0; i < weekday; i++) { printf(" "); } for (i = 1; i <= days; i++) { printf("%2d ", i); if ((weekday + i) % 7 == 0) { printf("\n"); } } if ((weekday + days) % 7 != 0) { printf("\n"); } } int main() { int year, month; printf("请输入年份:"); scanf("%d", &year); printf("请输入月份:"); scanf("%d", &month); if (month < 1 || month > 12) { printf("月份输入错误!\n"); return 1; } printf(" %d年%d月\n", year, month); show_calendar(year, month); return 0; } ``` 四、实训总结 通过本次实训,我学会了如何使用C语言来编写一个简单的万年历程序,巩固了C语言基本语法和编程思想,加强了对函数、数组、指针、文件等概念和用法的理解,提高了编程能力和解决问题的能力。同时,我也意识到在编程过程中需要注重代码的规范、可读性和可维护性,这对于日后的开发工作非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值