一些与漏洞相关的面试题

发布时间:2023年12月29日

打点一般会用什么漏洞

优先以 java 反序列化这些漏洞像 shiro,fastjson,weblogic,用友 oa 等等进行打点,随后再找其他脆弱性易打进去的点。

因为 javaweb 程序运行都是以高权限有限运行,部分可能会降权。

描述外网打点的流程

靶标确认、信息收集、漏洞探测、漏洞利用、权限获取。最终的目的是获取靶标的系统权限 / 关键数据。在这个过程中,信息收集最为重要。掌握靶标情报越多,后续就会有更多的攻击方式去打点。比如:钓鱼邮件、web 漏洞、边界网络设备漏洞、弱口令等。

redis未授权了解过没

有一个 redis 的未授权访问漏洞,redis 在默认的情况下会绑定在 0.0.0.0:6379,  如果防火墙没有做策略限制,则外网可以访问到 redis 上,如果没有设置 redis  密码(默认为空),会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis  的数据(这对于用于验证码码来说威胁很大),而且攻击者在未授权访问 Redis 的情况下,可以利用 Redis 自身的提供的 config  命令像目标主机写 WebShell、写 SSH 公钥、创建计划任务反弹 Shell 等。

常见的中间件漏洞

iis: PUT漏洞、短文件名猜解、远程代码执行、解析漏洞
apache: 解析漏洞、目录遍历
nginx: 文件解析、目录遍历、CRLF注入、目录穿越
tomcat: 远程代码执行、war后门文件部署
jBoss: 反序列化漏洞、war后门文件部署
weblogic: 反序列化漏洞SSRF任意文件上传war后门文件部署
Apache Shiro 反序列化漏洞: Shiro rememberMe(Shiro-550) Shiro Padding Oracle Attack(Shiro-721)

平常如何发现shiro漏洞?

Apache Shiro 是一个 Java 安全框架,执行身份验证、授权、密码和会话管理。apacheShiro 框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。

shiro 反序列化漏洞:shiro 在 CookieRememberMeManaer 类中将 cookie 中 rememberMe  字段内容分别进行序列化、AES 加密、Base64 编码操作。攻击者构造一个恶意的对象,并且对其序列化,AES 加密,base64 编码后,作为 cookie 的 rememberMe 字段发送。Shiro 将 rememberMe 进行解密并且反序列化,最终造成反序列化漏洞。

登陆失败时候会返回 rememberMe=deleteMe 字段或者使用 shiroScan 被动扫描去发现

完整:

未登陆的情况下,请求包的 cookie 中没有 rememberMe 字段,返回包 set-Cookie 里也没有 deleteMe 字段

登陆失败的话,不管勾选 RememberMe 字段没有,返回包都会有 rememberMe=deleteMe 字段

不勾选 RememberMe 字段,登陆成功的话,返回包 set-Cookie 会有 rememberMe=deleteMe 字段。但是之后的所有请求中 Cookie 都不会有 rememberMe 字段

勾选 RememberMe 字段,登陆成功的话,返回包 set-Cookie 会有 rememberMe=deleteMe 字段,还会有 rememberMe 字段,之后的所有请求中 Cookie 都会有 rememberMe 字段

shiro 有几种漏洞类型

shiro 550

shiro 721

Apache Shiro 框架提供了记住我的功能(RemeberMe),用户登录成功后会生成经过加密并编码的 cookie。cookie 的 key 为  RemeberMe,cookie 的值是经过对相关信息进行序列化,然后使用 aes 加密,最后在使用 base64 编码处理形成的

在服务端接收 cookie 值时,按以下步骤解析:

> 检索 RemeberMe cookie 的值
>
> Base 64 解码
>
> 使用 ACE 解密(加密密钥硬编码)
>
> 进行反序列化操作(未作过滤处理)

在调用反序列化的时候未进行任何过滤,导致可以触发远程代码执行漏洞

用户登陆成功后会生成经过加密并编码的  cookie,在服务端接收 cookie 值后,Base64 解码 -->AES 解密 --> 反序列化。攻击者只要找到 AES  加密的密钥,就可以构造一个恶意对象,对其进行序列化 -->AES 加密 -->Base64 编码,然后将其作为 cookie 的  rememberMe 字段发送,Shiro 将 rememberMe 进行解密并且反序列化,最终造成反序列化漏洞。

WebLogic 权限绕过的姿势?

`CVE-2020-14883` 是一个 `Console` 的未授权访问,而 `CVE-2020-14883` 是在利用未授权访问的前提下,在 `Console` 进行代码执行,于是远程攻击者可以构造特殊的 `HTTP` 请求,在未经身份验证的情况下接管 `WebLogic Server Console` ,并在 `WebLogic Server Console` 执行任意代码。

1、 通过静态资源来绕过权限验证,防止被重定向到登陆界面。

2、 通过请求 `.portal` ,控制处理的 `Servlet` 是渲染 `UI` 的 `MBeanUtilsInitSingleFileServlet` 。

3、 通过编码后的 `../` ,让最终渲染的模版是 `console.portal` 。

综合起来,才造成了最终的未授权访问。

Fastjson 漏洞利用原理?

在请求包里面中发送恶意的 json 格式 payload,漏洞在处理 json 对象的时候,没有对 @type 字段进行过滤,从而导致攻击者可以传入恶意的  TemplatesImpl 类,而这个类有一个字段就是_bytecodes,有部分函数会根据这个_bytecodes 生成 java  实例,这就达到 fastjson 通过字段传入一个类,再通过这个类被生成时执行构造函数。

FastJson 是一个由阿里巴巴研发的 java 库,可以把 java 对象转换为 JSON 格式,也可以把 JSON 字符串转换为对象。

通俗理解就是:漏洞利用 fastjson autotype 在处理 json 对象的时候,未对 @type 字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程 rmi 主机,通过其中的恶意类执行代码。

攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大影响。

Fastjson RCE 的本质就是在反序列化时会调用目标类的 setter 方法。以 com.sun.rowset.JdbcRowSetImpl Gadget 为例,类中的 setAutoCommit 方法中通过 connect 方法调用了 lookup 方法,且 lookup 方法的参数又能通过  setDataSourceName 方法设置,即其参数可控。那么就会导致 JNDI 注入,最终实现任意命令执行。

Java 处理 Json 格式数据有三个比较流行的类库:

- Gson (google 维护) 
- Jackson
- Fastjson 

讲一下MongoDB 未授权访问漏洞

[MongoDB] 服务安装后,默认未开启权限验证。如果服务监听在 0.0.0.0,则可远程无需授权访问[数据库]

?    3.0 之前版本的 MongoDB, 默认监听在 0.0.0.0,3.0 及之后版本默认监听在 127.0.0.1。

?    3.0 之前版本,如未添加用户管理员账号及数据库账号,使用 --auth 参数启动时,在本地通过 127.0.0.1 仍可无需账号密码登陆访问数据库,远程访问则提示需认证;

?    3.0 及之后版本,使用 --auth 参数启动后,无账号则本地和远程均无任何数据库访问权限。

jndi 注入是什么

JNDI RCE 漏洞产生的原因就在于当我们在注册 RMI 服务时,可以指定 Codebase url,也就是远程要加载类的位置,设 置该属性可以让 JDNI 应用程序在加载时去寻找我们指定的类 ( 例如:http://ip:port/EvilObject.class) 。 

这里还有一个比较重要的点,也是触发恶意代码的点。就是当 JNDI 应用程序通过 lookup (RMI 服务的地址) 方法调用指 定 Codebase url  上的类后,会调用被远程调用类的构造方法,所以如果我们将恶意代码放在被远程调用类的构造方法中时, 漏洞就会触发。

简述下log4j2漏洞

Apache Log4j2 是一个基于 Java 的日志记录工具。Apache Log4j 2.x <= 2.14.1 版本存在远程代码执行漏洞。  漏洞的主要原因是 log4j2  的接收器对于不可靠来源的输入没有过滤,攻击者则可以利用此特性通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。由于 Log4j2  组件在处理程序日志记录时存在 JNDI 注入缺陷,未经授权的攻击者利用该漏洞,可向服务器发送恶意的数据,触发 log4j2  组件的缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。

为了输出日志时能够方便地输出任意位置的 java 对象,Log4j2 引入了一个叫 Lookup  的统一接口。这个接口允许在写日志的时候,按照具体的实现逻辑去查找对象的位置,并输出对象的内容。这里的对象通常在内存中,但由于 java  支持对象的序列化 / 反序列化,它也可以存储在硬盘文件里,甚至是远程服务器上。

我们提到的 JNDI 就是对 Lookup  接口的一种实现。其本身也是一个接口,提供了命名关键字到对象的映射目录,允许开发者提供一个名称,即可获取到对象的内容。LDAP,即轻量级目录访问协议,是 JNDI 的一种底层实现,它可以让我们方便的查询分布式数据库。既然是分布式的,LDAP  允许从远程服务器加载对象。而这里加载对象时使用的不是一般的反序列化方法,而是通过「命名引用」功能,支持直接从远程下载 class  文件并加载对象。

于是,Log4j2 中就暗含了注入漏洞:允许传入参数解析为 LDAP 协议,从远程服务器下载 class 文件并执行。这个功能本来是为了方便开发,使 java 对象位置对上层应用透明,却不料酿成大祸

简述下struts2漏洞

Struts2 是 apache 项目下的一个 web 框架,使用 OGNL 作为默认的表达式语言,由于 OGNL  能够创建或更改可执行代码,因此能够为使用它的任何框架引入严重的安全漏洞,多个 Apache Struts 2 版本容易受到 OGNL  安全漏洞的攻击。

webshell 的利用

Webshell 是黑客经常使用的一种恶意脚本,其目的是获得对服务器的执行操作权限,比如执行系统命令、窃取用户数据、删除 web  页面、修改主页等。黑客通常利用常见的漏洞,如 SQL 注入、远程文件包含 (RFI)、FTP,甚至使用跨站点脚本攻击 (XSS)  等方式作为社会工程攻击的一部分,最终达到控制网站服务器的目的。

黑客可以用 web 的方式,通过 asp 或 php 木马后门控制网站服务器,包括上传下载文件、查看数据库、执行任意程序命令等。

Webshell 可以嵌套在正常网页中运行,且不容易被查杀。它还可以穿越服务器防火墙,由于与被控制服务器或远程主机交互的数据都是通过 80  端口传递,因此不会被防火墙拦截,在没有记录流量的情况下,Webshell 使用 post 包发送,也不会被记录在系统日志中,只会在 Web  日志中记录一些数据提交的记录。

- WebShell 的分类 ①根据文件大小分类:大马和小马 (通常指的是一句话木马,能够使用菜刀这类工具去直接连接它) ②根据脚本名称分类:jsp、asp、aspx、php

- WebShell 的利用

  寻找页面上传点

  写好一句话木马(上传木马),比如如下的 PHP 一句话木马的代码:

  `_POST['shell']); ?>`

  然后寻找上传后的文件位置(绝对路径),可以用蚁剑、中国菜刀等工具连接到主机进行接下来的操作,比如提权。

- WebShell 有哪些特征?

  - 持久化远程访问

    Webshell 脚本通常会包含后门,黑客上传 Webshell 之后,就可以充分利用 Webshell  的后门实现远程访问并控制服务器,从而达到长期控制网站服务器的目的。此外,在上传完 Webshell  之后,黑客会选择自己修复漏洞,以确保没有其他人会利用该漏洞。通过这种方式,黑客就可以一种低调的姿态,避免与管理员进行任何交互,同时仍然获得相同的结果。

- 提权

  在服务器没有配置错误的情况下,Webshell 将在 web 服务器的用户权限下运行,而用户权限是有限的。通过 Webshell,黑客可以利用系统上的本地漏洞来实现权限提升,从而获得  Root 权限,这样黑客基本上可以在系统上做任何事情,包括安装软件、更改权限、添加和删除用户、窃取密码、阅读电子邮件等等。

- 隐藏性极强

  Webshell 可以嵌套在正常网页中运行,且不容易被查杀。它还可以穿越服务器防火墙,由于与被控制服务器或远程主机交互的数据都是通过 80  端口传递,因此不会被防火墙拦截,在没有记录流量的情况下,Webshell 使用 post 包发送,也不会被记录在系统日志中,只会在 Web  日志中记录一些数据提交的记录。

- WebShell 常用的 PHP 函数

  Webshell 几乎适用于所有 Web 编程语言。之所以关注 PHP,是因为它是 web 上使用最广泛的编程语言。下面是 PHP 中一些执行 shell 命令最常用的函数。

  - system()

    system () 函数将命令作为参数,并输出结果。

    下面的示例是在 Windows 操作系统上运行 dir 命令,然后返回 PHP 文件所在目录的目录列表。

    ```php
    <?php
        echo system('ls -al');
    ```

exec()

exec () 功能是将命令作为参数,但不输出结果。

如果指定了第二个可选参数,则返回结果为数组。否则,如果回显,只显示结果的最后一行。

```php
<?php
    echo exce('ls -al');
    echo exce('ls -al',$array);
    var_dump($array);
```

shell_exec()

shell_exec () 函数类似于 exec (),但是,其整个输出结果为字符串。

```php
<?php
    echo shell_exce('ls -al');
```

passthru()

passthru () 执行一个命令并返回原始格式的输出。

```php
<?php
    echo passthru('ls -al');
```

- proc_open()

  proc_open () 可以创建一个处理程序(流程),实现脚本和要运行的程序之间的通信。

- 倒引号

  PHP 会首先执行 shell 命令中倒引号(`)内的内容

命令执行漏洞常见函数

- System 函数的语法是: system (string $command [, int &end-inline-katex-->return_var ] )
  - 同 C 版本的 system () 函数一样
  - 本函数执行 command 参数所指定的命令,并且输出执行结果
  - 命令执行后的返回值为输出值的最后一行
  - 函数本身也会打印全部的输出值
- Exec 函数的语法为:exec (string $command [, array &$output [, int &c194a9eg<!-- begin-inline-katexreturn_var]] )
  - 这个函数的作用是执行 command 参数所指定的命令
  - 命令执行后的值为输出值的最后一行
  - 函数本身不会打印任何内容
- Passthru 函数的语法为:passthru (string $command [, int &end-inline-katex-->return_var ] )
  - 同 exec () 函数类似
  - passthru () 函数也是用来执行外部命令 command 的
  - 当所执行的系统命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec () 或 system () 函数。
- Shell_exec 函数的语法为: shell_exec (string $cmd)
  - cmd 是要执行的命令 
  - String 是参数的数据类型,也就是字符串。
  - 函数会在命令执行完成后将全部的输出值作为字符串输入返回值,本身并不打印任何信息。 
  - Shell_exec 函数的用法同反引号形同,注意是反引号(``)而不是普通单引号(’’)。

如何判断网站是否有 CDN?

- 传统访问:用户访问域名 --> 解析服务器 IP--> 访问目标主机
- 普通 CDN:用户访问域名 -->CDN 节点 --> 真实服务器 IP--> 访问目标主机
- 带 WAF 的 CDN:用户访问域名 -->CDN 节点(云 WAF)--> 真实服务器 IP--> 访问目标主机

很简单,使用不同地方的 ping 服务,查看对应 IP 地址是否唯一,如果不唯一则极有可能是使用了 CDN

1、通过 ping 命令,查看回显情况 2、windows 系统环境下,使用 nslookup 进行查询,看返回的域名解析的情况 3、超级 ping 工具,比如”all-tool.cn/tools   /ping“「看 ip 结果」

如何判断靶标站点是 windows/linux?

1、大小写检测:windows 大小写不敏感,而 linux 大小写敏感。 

2、PING 指令:根据 TTL 值,winodws 一般情况下 > 100,linux<100 TTL (生存时间值):该字段指定 IP 包被路由器丢弃之前允许通过的最大网段数量。

如何建立隐藏用户?

1、net user test$ 123456 /add [建立隐藏用户]
2、net localgroup administrators test$ /add
文章来源:https://blog.csdn.net/2301_76786857/article/details/135285125
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。