面经总结

# 个人知识扫盲

  1. waf
    Web 应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web 应用防火墙是通过执行一系列针对 HTTP/HTTPS 的安全策略来专门为 Web 应用提供保护的一款产品。

  2. ips
    入侵防御系统 (IPS: Intrusion Prevention System) 是电脑网络安全设施,是对防病毒软件(Antivirus Programs)和防火墙 (Packet Filter, Application Gateway) 的补充。 入侵防御系统 (Intrusion-prevention system) 是一部能够监视网络或网络设备的网络资料传输行为的计算机网络安全设备,能够及时的中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为,能够帮助组织识别恶意流量,并主动阻止此类流量进入其网络。。
    IPS 一般也是在网络层旁路,可以理解为具备阻断能力的 IDS,是 IDS 的升级版(也有 IDS 检测到攻击通知阻断设备执行阻断动作的设备联动模式),可以覆盖网络层和应用层。

  3. ids
    IDS(intrusion detection system)入侵检测系统是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。它与其他网络安全设备的不同之处便在于,IDS 是一种积极主动的安全防护技术。
    IDS 工作在网络层,旁路部署,通过抓取和分析网络流量来发现攻击,主要关注网络层和传输层的数据包,如 IP、TCP、UDP 等协议。
    产品:奇安信天眼

  4. 旁路部署
    旁路部署是指安全设备在网络结构中处于旁路状态。在旁路模式下,安全设备只需要连接到交换机的指定镜像端口,所以形象的称之为 “旁路监控”;而串联模式一般是通过网关或者网桥的模式来进行监控,由于监控设备做了网关或者网桥,所以形象的称之为 “串联监控”。
    旁路部署可以应用于防毒墙、IDS、上网行为审计、流控等很多安全设备。・

  5. 交换机
    交换机工作在 OSI 模型的第二层,即数据链路层。 交换机的主要作用是连接多个以太网物理段,隔离冲突域,对以太网帧进行高速而透明的交换转发,自行学习和维护 MAC 地址信息。 希望这能帮到你。

  6. 路由器
    路由器属于 OSI 模型的第三层,即网络层。路由器的基本功能是把数据(IP 报文)传送到正确的网络,包括数据报的寻径和传送,子网隔离,抑制广播风暴,维护路由表,并与其它路由器交换路由信息,这是 IP 报文转发的基础,实现对 IP 数据报的过滤和记帐。

  7. 交换机和路由器之间的关系
    交换机负责连接网络设备(如交换机、路由器、防火墙、无线 AP 等)和终端设备(如计算机、服务器、摄像头、打印机等);路由器实现局域网与局域网的互联,局域网与 Internet 的互联。
    交换机不懂得 IP 地址,但它可以 “学习” MAC 地址,并把其存放在内部地址表中,通过在数据帧的始发者和目标接收者之间建立临时的交换路径,使数据帧直接由源地址到达目的地址。
    普通的交换机一般工作在 OSI 七层模型的第二层 - 数据链路层,负责局域网之间的连接,而路由器工作在 OSI 的第三层 - 网络层,负责广域网之间的连接。
    交换机都是根据 MAC 地址转发数据帧,而路由器是基于路由表转发数据包。
    总而言之,交换机是将不同 IP 地址的电脑连在一起,共享一根网线;路由器是将同一个 IP 给不同的电脑使用,就像一条大路分成很多条小路。一句话,路由器是接外网的,交换机是接内网的。

  8. 数据包从前端到后端的流程
    客户端向服务器发起请求,请求会被封装成数据包。数据包会经过客户端的网卡,然后通过网线传输到路由器。路由器会根据目标 IP 地址,将数据包转发到下一个路由器或者直接转发到目标服务器。数据包到达目标服务器后,会被服务器的网卡接收。服务器会对数据包进行解析,然后根据请求内容进行处理。服务器处理完请求后,会将响应结果封装成数据包,然后通过网卡发送回客户端。数据包会经过路由器,然后通过网线传输到客户端的网卡。客户端的网卡接收到数据包后,会将数据包传递给操作系统内核。操作系统内核会对数据包进行解析,然后将响应结果交给应用程序。

  9. NAT
    NAT 是指网络地址转换,是一种网络协议。当在专用网内部的一些主机本来已经分配到了本地 IP 地址(即仅在本专用网内使用的专用地址),但又想和因特网上的主机通信(并不需要加密)时,可使用 NAT 方法。这种方法需要在专用网(私网 IP)连接到因特网(公网 IP)的路由器上安装 NAT 软件。装有 NAT 软件的路由器叫做 NAT 路由器,它至少有一个有效的外部全球 IP 地址(公网 IP 地址)。这样,所有使用本地地址(私网 IP 地址)的主机在和外界通信时,都要在 NAT 路由器上将其本地地址转换成全球 IP 地址,才能和因特网连接。
    NAT 的实现方式有三种,即静态转换 Static Nat、动态转换 Dynamic Nat 和端口多路复用 OverLoad
    静态转换是指将内部网络的私有 IP 地址转换为公有 IP 地址,IP 地址对是一对一的,是一成不变的,某个私有 IP 地址只转换为某个公有 IP 地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
    动态转换是指将内部网络的私有 IP 地址转换为公用 IP 地址时,IP 地址是不确定的,是随机的,所有被授权访问上 Internet 的私有 IP 地址可随机转换为任何指定的合法 IP 地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当 ISP 提供的合法 IP 地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
    端口多路复用(Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation). 采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部 IP 地址实现对 Internet 的访问,从而可以最大限度地节约 IP 地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自 internet 的攻击。因此,网络中应用最多的就是端口多路复用方式。例如,假设有两个内部主机 A 和 B,它们都使用私有 IP 地址 192. 168.1.1 和 192. 168.1.2,并且它们都要访问外部网络。路由器使用公网 IP 地址 203.0.113.1,并且已经配置了 PAT。当主机 A 发送数据包到外部网络时,路由器会将源 IP 地址和源端口号转换为 203.0.113.1:10000,并将数据包发送到外部网络。当主机 B 发送数据包到外部网络时,路由器会将源 IP 地址和源端口号转换为 203.0.113.1:10001,并将数据包发送到外部网络。当外部网络返回数据包时,路由器会根据目标端口号将数据包转发到相应的内部主机。

  10. hids
    HIDS(主机入侵检测系统)是一种监视计算机或网络中可疑活动的应用程序。监视的活动可以包括外部参与者创建的入侵,也可以包括内部资源或数据的滥用。HIDS 具有监视和分析计算系统内部方面以及其网络接口上的任何传入 / 传出网络数据包的能力。它通过监视操作系统操作、跟踪用户行为并在没有人类干预的情况下独立运行来检测主机上的恶意行为。
    HIDS 则通过监测主机系统的系统日志、进程状态、文件变化等信息来检测安全事件,主要关注应用层和操作系统层的信息

  11. DOM 型 XSS 和反射型 XSS 的区别
    DOM 型 XSS 和反射型 XSS 的区别在于,DOM 型 XSS 不经过服务器,仅通过网页本身的 JavaScript 进行渲染触发,而反射型 XSS 是通过 URL 传递参数,服务器返回响应时,将参数中的恶意脚本代码反射回浏览器执行。DOM 型 XSS 的典型例子是在网页中插入一段恶意脚本代码,然后通过网页本身的 JavaScript 进行渲染触发。反射型 XSS 的典型例子是攻击者构造一个带有恶意脚本代码的 URL,然后将这个 URL 发送给受害者,当受害者点击这个 URL 时,恶意脚本代码就会被执行。

  12. 内网 ip 和外网 ip 的区别
    一般来说,10 开头的 IP 都是内网 IP,即 10.0.0.0 到 10.255.255.255 是内网 IP。而以下 IP 段的地址都是内网 IP 地址:172. 16.0.0 到 172. 31.255.255、192. 168.0.0 到 192. 168.255.255、169.254.x.x(其中 x.x 为任意数字)。如果您想判断一个 ip 是公网 IP 还是私网 ip,可以登录百度,搜索 IP 得到一个本机的外网 IP。然后打开路由器(确切的说是网关,网关可能是光猫也可能是路由器),然后登陆进入查看 WAN IP,这个是路由器连接上层网络的 IP。若 WAN IP 和百度查到的外网 IP 一致,那么这个就是公网 ip 了。

  13. Kerboeros 协议
    Kerberos 协议是一种网络认证协议,用于在计算机网络上进行身份验证。它提供了一种安全的身份验证机制,以防止未经授权的访问。
    Kerberos 协议的基本原理是:用户向 Kerberos 服务器请求一个票据,该票据用于向其他服务器证明用户的身份。Kerberos 服务器使用用户的密码来生成票据,并将其发送回用户。用户可以使用该票据来访问其他服务器,而无需再次输入密码。
    通过过滤出 kerboros 流量,我们在 req-body 字段中,可以找到 clientName 的值,表示的就是 pc 的用户名,serverName 的两个字段一个表示服务用户名,一个是就是域名。

  14. DHCP
    DHCP 协议是一种网络协议,用于在 TCP/IP 网络上分配 IP 地址。DHCP 代表动态主机配置协议。DHCP 协议允许计算机在网络上自动获取 IP 地址,而无需手动配置。DHCP 还提供了其他信息,例如子网掩码、默认网关和 DNS 服务器的地址。DHCP 服务器是负责分配 IP 地址的服务器。DHCP 客户端是需要 IP 地址的计算机。可以帮助识别连接到网络的计算机的主机名、MAC 地址和 IP 地址。在 hostname 字段中可以找到主机名,在 clientMac 字段中可以找到主机的 mac 地址,这样我们就能把主机 - 主机 mac 地址 - IP 地址给关联起来,可以描述出网络中的主机拓扑结构。

  15. dict 协议
    Dict 协议是一个在线网络字典协议,这个协议是用来架设一个字典服务的。Dict 服务器和客户机使用 TCP 端口 2628。Dict 协议是基于查询响应的 TCP 协议,它的目标是超越 Webster protocol,并允许客户端在使用过程中访问更多字典 12.

  16. redis 服务
    Redis 是一个使用 ANSI C 编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。它是一种 NoSQL 数据库,具有高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐。Redis 支持分布式,理论上可以无限扩展,是现在最受欢迎的 NoSQL 数据库之一。

  17. gopher 协议
    gopher 协议是一个古老且强大的协议,可以理解为是 http 协议的前身,他可以实现多个数据包整合发送。通过 gopher 协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。

  18. xml 文件
    XML 是一种用来传输和存储数据的可扩展标记语言。它由三部分组成:XML 文档声明,在文档的第一行;XML 文档类型定义,即 DTD,XXE 漏洞所在的地方;XML 文档元素。
    XML 的 DTD 实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
    内部实体:

    1
    2
    3
    4
    5
    6

    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY writer "Bill Gates">
    <!ENTITY copyright "Copyright W3School.com.cn">
    ]>

外部实体:

1
2
3
4
5
6
7

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
]>
<author>&writer;&copyright;</author>

  1. 常见端口与对应服务
    21:ftp 22:ssh 53:DNS 80:http 135/445:samba 服务 443:https 1433:sqlserver 1521:oracle 3306:mysql 3389:rdp 远程 8080:tomcat 8888: 宝塔 6378:redis 50050:cs

  2. 文件类型 MIME
    MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。
    MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
    浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理 URL, 因此 Web 服务器在响应头中添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会无法解析文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。
    MIME 通用结构为:

    1
    2

    type/subtype

  3. NTFS 数据流
    NTFS 数据流文件,也叫 Alternate data streams,简称 ADS,是 NTFS 文件系统的一个特性之一,允许单独的数据流文件存在,同时也允许一个文件附着多个数据流,即除了主文件流之外还允许许多非主文件流寄生在主文件流之中,它使用资源派生的方式来维持与文件相关信息,并且这些寄生的数据流文件我们使用资源管理器是看不到的。

  4. tomcat ajp 协议
    Apache Tomcat 支持 AJP 协议,用来通过反向代理到 Tomcat 的请求和相关的数据,AJP 协议的作用是,当一个请求包含请求主体时,一个未经允许的、包含请求主体首部分(或可能所有的)的 AJP 消息被发送到 Tomcat。在某些情况下,Tomcat 会把这个消息当作一个新的请求来处理,而不会当作请求主体。

  5. IIS
    IIS 是指 World Wide Web server 服务,IIS 是一种 Web(网页)服务组件,专业的说,IIS 可以赋予一部主机电脑一组以上的 IP 地址,而且还可以有一个以上的域名作为 Web 网站。简单来说:Internet Information Service(IIS)是 windows 开设 web 网页服务的组件,用来搭载网站运行程序的平台的。还能提供 FTP,SMTP 等服务。

  6. PHP 伪协议
    PHP 伪协议指的是 PHP 所支持的协议与封装协议,在 web 渗透漏洞利用中常用于配合文件包含进行 web 攻击,从而获取网站权限。
    常用伪协议与方法如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    file://
    allow_url_fopen=off/on allow_url_include=off
    ?file=file://C:phpinfo.txt
    用于访问本地文件系统

    php://filter
    allow_url_fopen=off/on allow_url_include=off
    ?file=php://filter/read=convert.base64-encode/resource=./index.php
    用于读取 php 文件源码内容

    php://input
    allow_url_fopen=off/on allow_url_include=on
    ?file=php://input, post 数据:<?php phpinfo ();?>
    访问请求的原始数据的只读流,将 post 请求的数据当作 php 代码执行

    zip://
    allow_url_fopen=off/on allow_url_include=off/on
    ?file=zip://file.zip%23phpinfo.txt
    访问压缩文件中的子文件,子文件可修改为任意后缀依然会被当作 php 执行

    data://
    allow_url_fopen=on allow_url_include=on
    ?file=data:test/plain;<?php phpinfo ();?>
    ?file=data:text/plain;base64,PD9waHAKcGhwaW5mbygpOwo/Pg==
    传递相应格式的数据来执行 php 代码

  7. sqlmap 扫 https 时,如果未经处理则会报错,因为 sqlmap 不能自动伪造证书。通常有两种办法处理:添加 --force-ssl 参数; 走本地代理端口访问。

  8. 指纹是组件上能标识对象类型的一段特征信息,用来在渗透测试信息收集环节中快速识别目标服务。对于你所渗透目标的操作系统、数据库、服务、开发语言、框架、中间件、CMS 等都包含了一些特征信息来标识它。通过发现这些特征信息并对它进行识别可以帮助我们快速地制定渗透策略,是渗透环节中关键的一步。常见的识别方式:源码特征信息提取;响应包 header 或者 body 特征信息提取;静态文件内容特征提取;静态文件 MD5 值匹配;根据请求协议识别;基于 URL 关键字识别。常用工具:whatweb (kali)

# 常见漏洞

# SQL 注入

# 原理

由于程序没有细致的过滤用户输入的数据,造成 SQL 字符串拼接,进而恶意的 SQL 语句被执行,造成数据库信息泄露,网页篡改,数据库被恶意操作等。

# 挖掘

SQL 注入漏洞的位置有很多,但是最常见的是在 Web 应用程序中的输入字段,例如登录表单、搜索表单、注册表单等。攻击者可以通过在这些输入字段中注入恶意代码来执行 SQL 命令,从而获取敏感数据或控制数据库。此外,SQL 注入漏洞还可能存在于 Web 应用程序中的其他位置,例如 URL 参数、HTTP 标头、Cookie 等。

# 方法

联合注入、报错注入、延时注入、布尔注入、DNS 注入、宽字节注入、堆叠注入,二次注入。

# 函数

1
2
3
4
5
6
7
8
9

文件读写
show varibles like "% secure_file_priv"
select 1,2,3,load_file ('/etc/passwd')
select 1,2,3,4 into outfile '/var/www/html/shell.php'

报错注入
updatexml ()
extractvalue ()

# 防御

  1. 输入验证:对用户输入进行验证,只允许输入预期的数据类型和长度。(正则过滤)
  2. 参数化查询:使用参数化查询可以防止 SQL 注入攻击。参数化查询是指将 SQL 语句和参数分开处理,参数不会被解释为 SQL 语句的一部分。(php 转义、预编译)
  3. 最小权限原则:数据库用户应该只被授予最小权限,以限制攻击者能够访问的数据。
  4. 防火墙:使用防火墙可以限制对数据库的访问,只允许来自特定 IP 地址或端口的请求。
  5. waf 设备

# 绕过

# 关键字过滤

  1. 大小写转换
  2. 注释符绕过:--, /**/,#(%23)
  3. 内联注释绕过:/!select/(注释中的语句为 MYSQL 特有的语句,这些语句在其它数据库中不会运行,但会在 MYSQL 中运行)
  4. 双关键字绕过
  5. 编码绕过

# 空格过滤

  1. 使用注释符
  2. 两个空格
  3. 使用 ()

# 判断数据库类型

  1. 页面报错信息
  2. 查询数据库独有的数据表
  3. 测试各数据库独有的连接符
  4. 查询数据库版本

# MySQL 数据库站点无法连接的常见原因

  1. 数据库只允许本地连接
  2. 站库分离
  3. 数据库服务器端口被占用或更改了端口
  4. 访问权限不正确
  5. 数据库未启动

# MySQL 写 shell

  1. 通过 outfile 写入 shell
  2. 将一句话木马作为数据插入表中并查询导出
  3. 开启全局日志写入 shell
  4. 慢查询日志写入 shell(仅有在查询时间超过系统设定时间时才会写入 shell)

# MySQL 无法写 shell 的原因

  1. My.ini 配置 secure-file-priv 为空或 / 则可以导出导入无限制
  2. 绝对路径不正确
  3. 没有读写权限
  4. 没有开启全局日志或慢查询日志

# SSRF

# 原理

服务器请求伪造,服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制,服务器就以服务器自己的身份去访问其他服务器的资源。

# 挖掘

  1. 分享:通过 URL 地址分享网页内容
  2. 转码服务:通过 URL 地址把原地址的网页内容调优使其适合手机屏幕浏览
  3. 在线翻译:通过 URL 地址翻译对应文本内容
  4. 图片加载与下载:通过 URL 地址加载或下载图片
  5. 图片、文章收藏功能
  6. 未公开的 api 实现以及其他调用 URL 的功能
  7. 从 URL 关键字中寻找,Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain

# 方法

  1. dict 协议,泄露安装软件版本信息,查看端口,操作内网 redis 服务等:dict://serverip:port / 命令:参数

    1
    2

    curl -v 'http://sec.com/ssrf.php?url=dict://127.0.0.1:6379' // 利用 dict 探测端口

  2. file 协议,在有回显的情况下,利用 file 协议可以读取任意内容

    1
    2

    curl -v 'http://sec.com/ssrf.php?url=file:///etc/passwd' // 利用 file 协议查看文件

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

    1
    2

    curl -v 'http://sec.com/ssrf.php?url=gopher%3A%2F%2F127.0.0.1%3A6379/_....' // 利用 gopher 反弹 shell

  4. http/s 协议,探测内网主机存活

# 绕过

  1. 采用短网址绕过
  2. 对 ip 地址进行进制转换
  3. 利用特殊域名,比如 example.io 可以指向任意域名,则 127.0.0.1.example.io 最终会被解析为 127.0.0.1
  4. 利用 [::],比如 http://127.0.0.1 >> http://[::127.0.0.1]
  5. 利用句号,比如 127.0.0.1 >> 127。0。0。1
  6. CRLF 编码绕过
  7. 使用封闭的字母和数字
  8. 当限制只能使用 http 协议时,可以采取 302 跳转或短地址
  9. 限制为 example.com 域名时,采用 http 基本身份认证的方式绕过,即 http://www.xxx.com@www.xxc.com,在对 @解析域名中,不同的处理函数存在处理差异

# 源码中的危险函数

file_get_contents,fsockopen,curl_exec,fopen,readfile。

# XSS

# 原理

web 页面插入恶意 Js 代码,浏览器解析执行获取用户 cookie。

# 挖掘

  1. 重灾区:评论区、留言区、个人信息、订单信息等
  2. 针对型:站内信、网页即时通讯、私信、意见反馈
  3. 存在风险:搜索框、当前目录、图片属性等

# 方法

存储型 XSS,反射型 XSS,DOM 型 XSS

# 防御

  1. 正则过滤(标签 /js 代码 / 事件)
  2. 用户的输入进行 html 编码输出(无法进行闭合)
  3. 服务端设置会话 Cookie 的 HTTP Only 属性(不能获取 cookie)

# 绕过

  1. 爆破寻找是否存在能够使用的标签和属性。
  2. 利用一些框架或模板的特性,比如在 使用 JavaScript template literal 的页面中 ,如果 `` 之间包含 ${code},就会执行 code。

# XSS 的功能

获取 cookie、获取管理员 ip、xss 蠕虫、钓鱼攻击、前端 JS 挖矿、键盘记录、屏幕截图。

# CSRF

# 原理

指利用受害者尚未失效的身份认证信息、(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害人的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(转账,改密码等)。

# 方法

  1. GET 型:直接改 URL 就好
  2. POST 型:想办法利用用户数据提交表单

# 防御

  1. 校验 token:让请求带上一个额外的 csrf_token,来确保请求是通过网站的前端页面发送的。这个 csrf_token 由服务器颁发,不要放到 cookie 里,要通过其他方式提供给网站的前端页面,一种方式是放到 DOM 上。前端请求时就会从 DOM 找出这个 csrf_token,作为一个参数带上,让服务端校验。
  2. 使用严格的 SameSite:Cookie 有一个 SameSite 属性,设置为严格模式(非 none 值),可以让其他网站的中跨域请求不带上 Cookie。
  3. 通过 Referer 判断:如果在网站中发送的请求,HTTP 头字段 Referer 中的域名就是当前网站。如果是其他网站发起的请求,Referer 就是这个网站域名。服务端可以利用这个 Referer 判断请求是否在网站页面中发起的。此外还可以利用 Origin 头字段,它通常在跨域请求时会携带上。但 Referer 并不完全可靠,在一些老旧的浏览器在实现上可能会有一些问题,有丢失的可能。
  4. 人机校验:加一个短信校验、邮箱校验、谷歌万恶的九宫格什么的,确保是一个人在尝试发这个请求。可以吊打所有攻击,缺点是用户体验不太好。

# 绕过

# CSRF_TOKEN 的位置

前端页面中(DOM 或全局变量中)

# CSRF_TOKEN 原理

前端请求时就会从 前端页面(DOM 或全局变量)找出这个 csrf_token,作为一个参数带上,让服务端校验。

# CSRF_TOKEN 绕过

  1. 更改请求方式
  2. 点击劫持
  3. 使用自己的 token,利用后台漏洞,替换对方的 token 进行验证

# XXE

# 原理

XXE 全称 XML External Entity Injection,也就是 XML 外部实体注入。它是对解析 XML 输入的应用程序的一种攻击。当配置不当的 XML 处理器处理包含对外部实体的引用的 XML 输入时,就会发生此攻击。
服务端解析用户提交的 XML 文件时,未对 XML 文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理,并且实体的 URL 支持 file:// 和 ftp:// 等协议,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站等危害

# 挖掘

使用 xml 格式提交数据的位置

# 方法

  1. 通过 DTD 外部实体声明

    1
    2
    3
    4
    5
    <?xml version=1.0?>
    <!DOCTYPE a [
    <!ENTITY b SYSTEM "file:///etc/passwd">
    ]>
    <q>&b;</q>

  2. 通过 DTD 文档引入外部 DTD 文档,再引入外部实体声明

    1
    2
    3
    4

    <?xml version=1.0?>
    <!DOCTYPE a SYSTEM "http://example/1.dtd">
    <q>&b;</q>

# 防御

  1. 禁用外部实体
  2. 过滤和验证用户提交的 XML 数据
  3. 使用虚拟补丁程序,API 安全网关或 Web 应用程序防火墙(WAF)来检测和阻止 XXE 攻击
  4. 修补或升级 XML 处理器和库。使用依赖项检查器。

# 绕过

  1. 换协议或利用协议特征
  2. 编码绕过
  3. 外部引用

# 反序列化

# 原理

攻击者控制了序列化后的数据,将有害数据传递到应用程序代码中,发动针对应用程序的攻击。

# 挖掘

  1. 远程和进程间通信
  2. 连线协议、Web 服务、消息代理
  3. 缓存 / 持久性存储区
  4. 数据库、缓存服务器、文件系统
  5. HTTP cookie、HTML 表单参数、API 身份验证令牌

# 方法

  1. 在 java 和 php 所构造的 class,存在一些特殊成员,会在特定情况下自动调用,而不用程序主动调用。常见的如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    __construct () 创建对象时自动调用
    __destruct () 在销毁对象时自动调用
    __call () 在对象中调用一个不可访问方法时,__call () 会被调用
    __callStatic () 在静态上下文中调用一个不可访问方法时调用
    __get () 读取不可访问属性的值时,__get () 会被调用
    __set () 在给不可访问属性赋值时,__set () 会被调用
    __isset () 当对不可访问属性调用 isset () 或 empty () 时,__isset () 会被调用
    __unset () 当对不可访问属性调用 unset () 时,__unset () 会被调用
    __sleep () serialize () 函数会检查类中是否存在一个魔术方法__sleep () , 如果存在,该方法会鲜卑调用,然后再执行序列化操作
    __wakeup () unserialize () 会检查是否存在一个 __wakeup () 方法,如果存在会先调用__wakeup 方法,预先准备对象需要的资源
    __toString () __toString() 方法用于一个类被当成字符串时应增氧回应
    __invoke () 当尝试以调用函数的方式调用一个对象时,__invoke () 方法会被自动调用
    __set_state () 字 PHP 5.1.0 起调用 var_export () 导出类时,此静态 方法会被调用
    __clone () 当复制完成时,如果定义了 __clone 方法,则新创建的对象(复制生成的对象)中的 __clone () 方法会被调用,可用于修改属性的值。

  2. session 反序列化漏洞

  3. phar 反序列化漏洞

  4. pop 链构造:指从现有运行环境中寻找一系列的代码或指令调用,然后根据需求构造出一组连续的调用链。

# 防御

  1. 对反序列数据加密或签名,且加密密钥和签名密钥不要使用硬编码
  2. 对反序列化接口添加认证授权
  3. 设置反序列化服务仅在本地监听或者设置相应防火墙策略
  4. 禁止使用存在漏洞的第三方框架库
  5. 过滤、禁用危险函数
  6. 过滤 T3 协议或限定可连接的 IP
  7. 设置 Nginx 反向代理,实现 t3 协议和 http 协议隔离

# 绕过

  1. 利用加号绕过(注意在 url 里传参时 + 要编码为 %2B)
  2. 利用数组对象绕过,如 serialize (array ($a)); a 为要反序列化的对象 (序列化结果开头是 a,不影响作为数组元素的 $a 的析构)。
  3. 利用引用进行绕过
  4. 16 进制绕过字符的过滤

# 反序列化对象特征

  1. java 序列化数据特征:序列化文件头,数据 16 进制中以 ac ed 00 05 开头
  2. tcp:必有 ac ed 00 05,这个 16 进制流基本上也意味者 java 反序列化的开始
  3. http:必有 rO0AB,其实这就是 aced0005 的 base64 编码的结果

# 文件上传漏洞

# 原理

文件上传漏洞原理是指在有上传功能的系统中,如果没有对用户上传的文件进行有效的检查过滤,那么恶意用户就可以上传包含脚本的文件,如 Webshell,然后通过访问这些文件的方式,来执行服务端命令,从而控制 Web 网站或者服务器的漏洞

# 挖掘

查找文件上传功能点常见位置比如文件后台、会员中心,文件扫描(通过扫描工具获取敏感信息)

# 方法

统一写在绕过部分

# 防御

  1. 文件上传的目录设置为不可执行
  2. 判断文件类型:MIME Type、后缀检查,白名单,黑名单,图片 resize 或压缩
  3. 使用随机数改写文件名和文件路径
  4. 单独设置文件服务器的域名
  5. 使用安全设备防御

# 绕过

  1. 基于前端 js 的防御:
    a. burp 抓包修改绕过
    b. 禁用指定 js 文件

  2. 基于后端的防御:
    a. MEME:抓包修改 content-type
    b. 基于 body 标识头:二进制添加文件标识

  3. 基于简单过滤:
    a. 双写后缀
    b. 大小写

  4. 基于后端黑名单:
    a. fuzz 可上传名单

b. htaccess 文件:htaccess 文件是 Apache 服务器中的一个配置文件,全称是 Hypertext Access (超文本入口)。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride 指令来设置。攻击者可以上传覆盖.htaccess 文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。需要注意的是,htaccess 文件的作用域为其所在目录与其所有的子目录,不过若是子目录也存在.htaccess 文件,则会覆盖父目录的.htaccess 效果。

c. user.ini 文件:该配置文件同样也是目录的配置文件。.user.ini 使用范围很广,不仅限于 Apache 服务器,同样适用于 Nginx 服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)。
自 PHP 5.3.0 起,.user.ini 是一个能被动态加载的 ini 文件,此类文件仅被 CGI/FastCGI SAPI 处理。不需要重启服务器中间件,只需要等待 user_ini.cache_ttl 所设置的时间(默认为 300 秒),即可被重新加载.

d. 利用存储型 xss,在上传的正常文件中夹杂恶意代码

e. soap 协议(简单对象访问协议):SOAP (Simple Object Access Protocol) 简单对象访问协议是交换数据的一种规范,在 Web Service 中,交换带结构信息。可基于 HTTP 等协议,使用 XML 格式传输,抽象于语言实现、平台和硬件。即多语言包括 PHP、Java、.Net 均可支持。配合 XXE 实现攻击

f. 根据系统特性绕过:后缀添加空格,添加点,添加冒号,基于特性被删除(windows);后缀添加 斜杠 ,基于特性被删除(windows/linux);后缀添加 NTFS 数据流(::$DATA),基于特性(windows)。

g. 利用容器解析特性:在 Apache1.x,2. x 中 Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。因此对于 apache 而言,一个 test.php.qwea 文件依然会将其解析为 php。如果所有的后缀 apache 都不认识,那么就会把该文件当做默认的类型,一般来说默认类型就是 text/plain。在 window 中的认识的后缀都记录在 /apche/conf/mine.types 中,在 Ubuntu 下在 /etc/mime.types;%20%00 空字节代码解析漏洞,例如我们可以请求如下 URI:/test [0x20]/../admin/index.php,这个 URI 不会匹配上 location 后面的 /admin/,也就绕过了其中的 IP 验证;但最后请求的是 /test [0x20]/../admin/index.php 文件,也就是 /admin/index.php,成功访问到后台

h. 临时文件上传

i. 条件竞争:我们使用多线程并发的访问上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的 php 文件,一旦我们成功访问到了上传的文件,那么它就会向服务器写一个 shell

j. 二次渲染:将一句话木马插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取 webshell。

k. 临时文件上传

  1. 基于后端白名单
    a. htaccess 文件(在 httpd.conf 文件中配置 mod_rewrite 模块开启,同时需要将 AllowOverride None 改为 AllowOverride All)
    b. html 文件(存储型 xss)
    c. 利用文件包含漏洞:包含解析存在 webshell 的文件;tomcat ajp 协议任务文件包含;thinkphp 任意文件包含日志 getshell
    d. 容器解析特征:IIS 目录解析,5.X/6.0 版本,目录名包含.asp、.asa、.cer、.cdx、目录下文件都按照 asp 解析执行(/text.asp/1.jpg);IIS 文件名解析,5.X/6.0 版本,文件名包含.asp;、.asa;、.cer;、.cdx;、优先按照 asp 解析执行(/1.aps;1.jpg)
    e. 配置不当:PHP CGI 解析漏洞,php.ini 配置文件 cgi.fix_pathinfo=1,则在(/1.jpg/1.php)和(/1.jpg/.php)中,1.jpg 以 php 来解析
    f. 编辑器漏洞:UEditor 任意文件上传;FCKeditor 编辑器;EWEbeditor 编辑器;DotNetTextBox 编辑器;Kedit 编辑器;Cute Editor 在线编辑器

# 文件包含漏洞

# 原理

在通过 PHP 的相应函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入,这通常需要包括两个条件: include () 等函数通过动态变量的方式引入需要包含的文件;用户能够控制这个动态变量。

常见函数包括:

1
2
3
4
5
6

Include:包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但整个 php 文件继续执行。
Require:跟 include 唯一不同的是,当产生错误时候,include 会继续运行而 require 停止运行。
Include_once:这个函数跟 include 函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。如果已经执行一遍那么就不重复执行了。
Require_once:这个函数跟 require 函数作用几乎相同,与 include_once 和 include 类似。
php.ini 配置文件:allow_url_fopen=off 即不可以包含远程文件。php4 存在远程包含 & amp; 本地包含,php5 仅存在本地包含。

# 挖掘

  1. 白盒审计
  2. url 中存在使用 php 文件作为参数(例如 http://example.com?url=index.php)

# 方法

  1. 包含日志文件:/var/log/apache2/access.log, /var/log/nginx/access.log
  2. 包含图片木马
  3. 包含 session 文件
  4. file 协议
  5. 如果是 php 后端,可能存在 php 伪协议

# 防御

  1. 设置白名单
  2. 过滤危险字符
  3. 设置文件目录
  4. 关闭危险设置

# 绕过

都挺基础的,就不重复了,参考前面的绕过方法

# 逻辑漏洞

# 任意用户密码重置

未经用户本身授权,在未知他人的重置密码链接或手机验证码的情况下,通过构造重置密码链接或穷举验证码等方法直接重置他人密码的一种攻击方式。任意用户密码重置影响系统的稳定性,可由此作为攻击入口,进行持续攻击。

  1. 验证码无时间限制
  2. 验证码在 Response 包中回显
  3. 验证码为固定值
  4. 密码重置步骤未进行校验
  5. 未验证 cookie 信息
  6. 用户名,手机 / 邮箱号,验证码三者未进行匹配性验证
  7. 在本地客户端进行验证码校验
  8. 修改密码处 id 值可替换
  9. 修改信息时替换,添加字段值
  10. 验证码与手机 / 邮箱号未进行匹配性验证

# 短信轰炸

一般就是接口没有做好时间限制或者访问限制。

# 支付漏洞

过于信任线段传入的数据,导致出现支付漏洞

# 忘记密码绕过

# 验证码复用

后端不删验证码是吧

# 越权

# 水平越权

水平越权指的是攻击者尝试访问与他拥有相同权限的用户的资源,怎么理解呢?比如某系统中有个人资料这个功能,A 账号和 B 账号都可以访问这个功能,但是 A 账号的个人信息和 B 账号的个人信息不同,可以理解为 A 账号和 B 账号个人资料这个功能上具备水平权限的划分。此时, A 账号通过攻击手段访问了 B 账号的个人资料,这就是水平越权漏洞。
常见场景:1. 基于用户身份 id;2. 基于对象 id;3. 基于文件名

# 垂直越权

垂直越权是不同级别之间或不同角色之间的越权,垂直越权还可以分为向上越权和向下越权。向上越权指的是一个低级别用户尝试访问高级别用户的资源,比如说某个系统分为普通用户和管理员用户,管理员有系统管理功能,而普通用户没有,那我们就可以理解成管理功能具备垂直权限划分,如果普
通用户能利用某种攻击手段访问到管理功能,那我们就称之为向上越权。向下越权是一个高级别用户访问低级别用户信息。

# 命令执行

# 绕过

  1. 空格过滤绕过
    使用以下符号:

    1
    ${IFS}, ${IFS}$1, <>, <, >, {cat,/etc/passwd}

  2. 关键词过滤绕过
    以 cat 为例,使用以下办法:
    、、、

ca\t, cat''t, a=l;b=s;ab, /bin/ca*, /bin/ca?, /binca [tc]
、、、
或者换成其它命令:head, tail, less, tac

# 模板注入

模板引擎(这里特指用于 Web 开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,利用模板引擎来生成前端的 html 代码,模板引擎会提供一套生成 html 代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板 + 用户数据的前端 html 页面,然后反馈给浏览器,呈现在用户面前。
SSTI 就是服务器端模板注入(Server-Side Template Injection)
当前使用的一些框架,比如 python 的 flask,php 的 tp,java 的 spring 等一般都采用成熟的的 MVC 的模式,用户的输入先进入 Controller 控制器,然后根据请求类型和请求的指令发送给对应 Model 业务模型进行业务逻辑判断,数据库存取,最后把结果返回给 View 视图层,经过模板渲染展示给用户。
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。

测试方法:4 4

# PHP 命令执行函数

  1. system ():函数执行有回显,将执行结果输出到页面上。
  2. passthru ():函数执行有回显,将执行结果输出到页面上。
  3. exec (): 函数执行无回显,默认返回最后一行结果
  4. shell_exec (): 函数执行默认无回显,通过 echo 可将执行结果输出到页面。
  5. popen ():打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
  6. proc_open ():函数与 Popen 函数类似,但是可以提供双向管道
  7. pcntl_exec ():函数的作用是在当前进程空间执行指定程序
更新于