F5 PAM 认证模块
F5实现了自己的pam进行认证,模块路径为/usr/lib/httpd/modules/,其中,涉及到login.jsp授权的是mod_f5_auth_cookie.so文件。
反汇编之后,大概是这样的。我们能够请求/tmui/login.jsp而不需要进行身份验证。
总结
在apache的处理中,;是被当作普通字符的,不会解析。
/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd
此时,由于请求的是/tmui/login.jsp,根据pam认证模块里,/tmui/login.jsp不需要认证,接着,该请求会被转发到 tomcat上,最终tomcat请求:
/tmui/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd
在web.xml 是有该配置的
<servlet-mapping>
<servlet-name>org.apache.jsp.tmui.locallb.workspace.fileRead_jsp</servlet-name>
<url-pattern>/tmui/locallb/workspace/fileRead.jsp</url-pattern>
</servlet-mapping>
请求/hsqldb;,apache本身会对/hsqldb进行认证,根据httpd.conf的配置,是匹配不到/hsqldb;的
<Location /hsqldb>
<RequireAll>
AuthType Basic
AuthName "BIG\-IP"
AuthPAM_Enabled on
AuthPAM_IdleTimeout 1200
require valid-user
Require all granted
</RequireAll>
</Location>
但正是因为tomcat对于;处理上的差异,导致了身份的绕过,%0a也是一个道理
F5实现了自己的pam进行认证,模块路径为/usr/lib/httpd/modules/,其中,涉及到login.jsp授权的是mod_f5_auth_cookie.so文件。
反汇编之后,大概是这样的。我们能够请求/tmui/login.jsp而不需要进行身份验证。
总结
在apache的处理中,;是被当作普通字符的,不会解析。
/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd
此时,由于请求的是/tmui/login.jsp,根据pam认证模块里,/tmui/login.jsp不需要认证,接着,该请求会被转发到 tomcat上,最终tomcat请求:
/tmui/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd
在web.xml 是有该配置的
<servlet-mapping>
<servlet-name>org.apache.jsp.tmui.locallb.workspace.fileRead_jsp</servlet-name>
<url-pattern>/tmui/locallb/workspace/fileRead.jsp</url-pattern>
</servlet-mapping>
请求/hsqldb;,apache本身会对/hsqldb进行认证,根据httpd.conf的配置,是匹配不到/hsqldb;的
<Location /hsqldb>
<RequireAll>
AuthType Basic
AuthName "BIG\-IP"
AuthPAM_Enabled on
AuthPAM_IdleTimeout 1200
require valid-user
Require all granted
</RequireAll>
</Location>
但正是因为tomcat对于;处理上的差异,导致了身份的绕过,%0a也是一个道理
请求拆分有多危险?Golang 中的一个漏洞,或者我们如何在 Portainer 中发现 RCE 并入侵 Uber
Docker 容器是通过 Docker API 进行管理的,但允许访问 Docker API 并不安全,因此通过 Websocket 接口使用了 TCP 代理方案。由于请求包含唯一的容器标识符 — id ,因此无需身份验证即可完成代理。它充当特定容器的 API 密钥。
这个查询发送给 Docker api,POST /exec/uuid/start。然后建立一个 Websocket 连接,通过TCP
代理到容器,用户可以在网站上运行命令
Docker 容器是通过 Docker API 进行管理的,但允许访问 Docker API 并不安全,因此通过 Websocket 接口使用了 TCP 代理方案。由于请求包含唯一的容器标识符 — id ,因此无需身份验证即可完成代理。它充当特定容器的 API 密钥。
这个查询发送给 Docker api,POST /exec/uuid/start。然后建立一个 Websocket 连接,通过TCP
代理到容器,用户可以在网站上运行命令
特定 API 提供商的工作流程
还可以创建 Dork 来定位特定的 API 提供商及其端点。这对于为用户的 API 密钥创建自动检查的公司尤其有用。了解 API 密钥的上下文和语法后,搜索空间可以大大减少。
了解特定的 API 提供商后,我们可以获取与 API 提供商的正则表达式匹配且位于 API 调用上下文中的所有键,然后我们可以使用内部数据库或 API 端点检查它们的有效性。
例如,假设一家公司(HalCorp)为用户提供了一个 API,用于读取和写入其帐户。通过创建我们自己的 HalCorp 帐户,我们发现 API 密钥的形式为[a-f]{4}-[a-f]{4}-[a-f]{4}
还可以创建 Dork 来定位特定的 API 提供商及其端点。这对于为用户的 API 密钥创建自动检查的公司尤其有用。了解 API 密钥的上下文和语法后,搜索空间可以大大减少。
了解特定的 API 提供商后,我们可以获取与 API 提供商的正则表达式匹配且位于 API 调用上下文中的所有键,然后我们可以使用内部数据库或 API 端点检查它们的有效性。
例如,假设一家公司(HalCorp)为用户提供了一个 API,用于读取和写入其帐户。通过创建我们自己的 HalCorp 帐户,我们发现 API 密钥的形式为[a-f]{4}-[a-f]{4}-[a-f]{4}
但是这个类并不能用于调试,因为fastjson中用ASM生成的代码没有linenumber、trace等用于调试的信息,所以不能调试。不过通过在Expression那个窗口重写部分代码,生成可用于调式的bytecode应该也是可行的(我没有测试,如果有时间和兴趣,可以看下ASM怎么生成可用于调试的字节码)
Java利用技巧——Jetty Servlet型内存马
前言 在上篇文章介绍了Jetty Filter型内存马的实现思路和细节,本文介绍Jetty Servlet型内存马的实现思路和细节 0x01 简介 本文将要介绍以下内容: 实现思路 实现代码 Zimbra环境下的Servlet型内存马 0x02 实现思路 同样是使用Thread获得webappclassloaer,进而通过反射调用相关方法添加Servlet型内存马 0x03 实现代码 1.添加Servlet Jetty下可用的完整代码如下: <%@ page import="java.lang.reflect.Field"%> <%@ page import="java.lang.reflect.Method"%> <%@ page import="java.util.Scanner"%> <%@ page import="java.io.*"%> <% String servletName = "myServlet"; String urlPattern = "/servlet"; Servlet servlet = new Servlet() { @Override public void init(ServletConfig servletConfig)...
前言 在上篇文章介绍了Jetty Filter型内存马的实现思路和细节,本文介绍Jetty Servlet型内存马的实现思路和细节 0x01 简介 本文将要介绍以下内容: 实现思路 实现代码 Zimbra环境下的Servlet型内存马 0x02 实现思路 同样是使用Thread获得webappclassloaer,进而通过反射调用相关方法添加Servlet型内存马 0x03 实现代码 1.添加Servlet Jetty下可用的完整代码如下: <%@ page import="java.lang.reflect.Field"%> <%@ page import="java.lang.reflect.Method"%> <%@ page import="java.util.Scanner"%> <%@ page import="java.io.*"%> <% String servletName = "myServlet"; String urlPattern = "/servlet"; Servlet servlet = new Servlet() { @Override public void init(ServletConfig servletConfig)...
如何通过在 PNG 图片中隐藏 JavaScript 来绕过 CSP
将恶意的JavaScript库隐藏在PNG图像中并发布推文,然后通过利用绕过其内容安全策略(CSP)的XSS将其包含在易受攻击的网站中。
将恶意JavaScript库隐藏到PNG图像中并发布推文,然后利用XSS攻击绕过其内容安全策略(CSP)将其包含在易受的网站中。这不是科幻小说……而是HTML Canvas。
TL;DR -使用 HTML Canvas,您可以将任何 JavaScript 代码(或整个库)到 PNG 图像中,方法可以将每个源字符代码转换为一个像素。然后可以将图像上传到受信任的网站(如 Twitter 或 Google)(通常由 CSP 列入白名单),然后作为 HTML 文档中的图像的远程加载。最后,通过使用 canvasgetImageData方法,可以从图像内容中提取隐藏“的 JavaScript”并执行它。有时这可能会导致安全策略,使攻击者能够包含整个外部外部JavaScript 库
将恶意的JavaScript库隐藏在PNG图像中并发布推文,然后通过利用绕过其内容安全策略(CSP)的XSS将其包含在易受攻击的网站中。
将恶意JavaScript库隐藏到PNG图像中并发布推文,然后利用XSS攻击绕过其内容安全策略(CSP)将其包含在易受的网站中。这不是科幻小说……而是HTML Canvas。
TL;DR -使用 HTML Canvas,您可以将任何 JavaScript 代码(或整个库)到 PNG 图像中,方法可以将每个源字符代码转换为一个像素。然后可以将图像上传到受信任的网站(如 Twitter 或 Google)(通常由 CSP 列入白名单),然后作为 HTML 文档中的图像的远程加载。最后,通过使用 canvasgetImageData方法,可以从图像内容中提取隐藏“的 JavaScript”并执行它。有时这可能会导致安全策略,使攻击者能够包含整个外部外部JavaScript 库
TL;DR -使用 HTML Canvas,您可以将任何 JavaScript 代码(或整个库)到 PNG 图像中,方法可以将每个源字符代码转换为一个像素。然后可以将图像上传到受信任的网站(如 Twitter 或 Google)(通常由 CSP 列入白名单),然后作为 HTML 文档中的图像的远程加载。最后,通过使用 canvasgetImageData方法,可以从图像内容中提取隐藏“的 JavaScript”并执行它。有时这可能会导致安全策略,使攻击者能够包含整个外部外部JavaScript 库
由于Content-Security-Policy响应标头能够有效阻止XSS、点击劫持和其他代码注入攻击,因此使用越来越广泛。然而,许多网站配置了众多的政策,小区错误报告,将整个域而不是特定资源列入白名单,或者使用 unsafe-inline 或 unsafe-eval 指令,这可能会导致绕过政策
由于Content-Security-Policy响应标头能够有效阻止XSS、点击劫持和其他代码注入攻击,因此使用越来越广泛。然而,许多网站配置了众多的政策,小区错误报告,将整个域而不是特定资源列入白名单,或者使用 unsafe-inline 或 unsafe-eval 指令,这可能会导致绕过政策
Canvas 2D API 的方法返回一个对象,该对象表示光纤指定部分的底层原材料数据。此方法不受光纤的变换矩阵的影响。如果指定的精确超出光纤的边界,则返回的对象中光纤指定部分的光纤为透明黑色。
使用 Canvas 隐藏 PNG 图像中的文本
按照您可以复制并粘贴到浏览器的 JavaScript 控制台中的示例,从给定的字符串开始创建 PNG 图像,例如:“Hello, World!”。打开新选项卡,然后about:blank打开 JavaScript 控制台并粘贴以下代码
上面的代码使用putImageData表示“Hello, World!”字符串中每 3 个字符的组作为每个像素的 RGB(红色、绿色和蓝色)级别的方法创建了一个图像。在浏览器的控制台中运行它后,您会在左上角看到一个小图像
使用 Canvas 隐藏 PNG 图像中的文本
按照您可以复制并粘贴到浏览器的 JavaScript 控制台中的示例,从给定的字符串开始创建 PNG 图像,例如:“Hello, World!”。打开新选项卡,然后about:blank打开 JavaScript 控制台并粘贴以下代码
上面的代码使用putImageData表示“Hello, World!”字符串中每 3 个字符的组作为每个像素的 RGB(红色、绿色和蓝色)级别的方法创建了一个图像。在浏览器的控制台中运行它后,您会在左上角看到一个小图像
现在我们有了一个代表“Hello, World!”字符串的 PNG 图像。您可以将以下代码复制并粘贴到 JavaScript 控制台中,以将生成的 PNG 图像转换为原始文本字符串
如上所示,JavaScript 代码选择刚刚创建的图像元素,并使用getImageData将其转换为原始文本字符串。使用 时getImageData,您将获得一个ImageData具有包含大数组的属性的对象data。如前所示,每个像素的数组中有四个条目ImageData:r、g、b和alpha。因此,数组看起来像[pixel1R, pixel1G, pixel1B, pixel1Alpha, ..., pixelNR, pixelNG, pixelNB, pixelNAlpha]。
如上所示,JavaScript 代码选择刚刚创建的图像元素,并使用getImageData将其转换为原始文本字符串。使用 时getImageData,您将获得一个ImageData具有包含大数组的属性的对象data。如前所示,每个像素的数组中有四个条目ImageData:r、g、b和alpha。因此,数组看起来像[pixel1R, pixel1G, pixel1B, pixel1Alpha, ..., pixelNR, pixelNG, pixelNB, pixelNAlpha]。
存在漏洞的网站
现在我们知道如何将文本字符串“存储”到图像中以及如何将该图像转换回其原始字符串。现在假设隐藏 JavaScript 代码而不是简单的文本字符串,并将生成的 PNG 图像上传到 Twitter。可以绕过将 Twitter 图像列入白名单的内容安全策略,并可以利用 XSS 从“受信任”的来源加载 JavaScript 内容。
现在我们知道如何将文本字符串“存储”到图像中以及如何将该图像转换回其原始字符串。现在假设隐藏 JavaScript 代码而不是简单的文本字符串,并将生成的 PNG 图像上传到 Twitter。可以绕过将 Twitter 图像列入白名单的内容安全策略,并可以利用 XSS 从“受信任”的来源加载 JavaScript 内容。