【问题标题】:What does `${...}` that is not within a string mean in PHP?不在字符串中的`${...}`在PHP中是什么意思?
【发布时间】:2017-01-14 09:59:10
【问题描述】:

${...} 不在字符串中在 PHP 中是什么意思?我也想知道文档在哪里。

${"GLOBALS"}["a"]    = "b";
${${"GLOBALS"}["a"]} = "c";

上下文

我正在解决a wargame challenge on xcz.kr,它给了我这个混淆的 PHP 源代码(带有一些 HTML)。

<html>
<head>
<link rel="shortcut icon" href="../images/favicon.ico" type="image/x-icon">
<title>Prob21</title>
</head>
<body style="background-image:url('../images/content-tail.gif');">
<b>Title</b></br>
<i>PHP Obfuscation Crack</i></br></br>
<b>Description</b></br>
<font size="2px">
<a href="prob_files/prob21.html" target="_blank">View source</a></br></br>
<?
${"\x47\x4c\x4f\x42\x41\x4c\x53"}["\x67\x61\x73y\x61\x72\x6b\x6e\x64"]="\x62";${"\x47\x4c\x4f\x42AL\x53"}["r\x77\x6cii\x69\x71\x66\x76\x66\x70"]="i";function h($a){${"\x47\x4cO\x42\x41L\x53"}["\x70x\x7a\x77\x65\x61h\x72\x75\x71\x6f\x6b"]="\x62";${${"\x47LO\x42\x41\x4c\x53"}["\x70\x78z\x77\x65\x61\x68\x72u\x71\x6f\x6b"]}="";${"GL\x4fB\x41\x4c\x53"}["u\x78\x6fi\x69i\x6b\x61pcv"]="\x62";for(${${"\x47\x4c\x4f\x42A\x4c\x53"}["r\x77\x6c\x69\x69i\x71\x66\x76fp"]}=0;${${"\x47\x4c\x4f\x42A\x4cS"}["\x72\x77l\x69i\x69\x71\x66\x76\x66\x70"]}<5;${${"G\x4c\x4f\x42\x41\x4c\x53"}["\x72\x77\x6ci\x69\x69qf\x76\x66\x70"]}++){$ydzorvqk="\x61";$gflrozo="\x62";${"\x47\x4cOB\x41\x4cS"}["\x65\x72p\x78\x7a\x6fz\x64\x65y"]="i";${$gflrozo}=${${"G\x4c\x4f\x42AL\x53"}["\x67\x61sy\x61\x72k\x6e\x64"]}+ord(substr(${$ydzorvqk},${${"\x47\x4c\x4f\x42ALS"}["\x65rp\x78\x7a\x6fz\x64e\x79"]},1));}return${${"\x47\x4c\x4fBA\x4cS"}["\x75x\x6fi\x69i\x6b\x61\x70\x63v"]};}$jbojdbertutk="\x4b\x45\x59";$vtefigaylx="mu\x6e";${"G\x4cOB\x41L\x53"}["\x68p\x63eeyx\x74o"]="\x61";$ktjmdjm="a";${"\x47\x4c\x4f\x42ALS"}["\x6d\x69mt\x65\x6du\x63\x79\x62\x70c"]="\x6d\x75\x6e";${$jbojdbertutk}="\x43o\x6e\x67\x72a\x74\x75\x6ca\x74\x69\x6f\x6es\x21</\x62r\x3e\x4be\x79\x20i\x73 ?????????????????????";${"GL\x4f\x42\x41\x4cS"}["\x67\x6d\x66i\x66\x62f\x6c"]="\x61";${${"G\x4c\x4f\x42AL\x53"}["\x6d\x69\x6d\x74em\x75c\x79\x62p\x63"]}=@$_GET["\x6b\x65y"];${"GL\x4f\x42A\x4c\x53"}["w\x76d\x63\x78\x73\x64\x73\x71b"]="x";@${$ktjmdjm}=explode("-",${$vtefigaylx});$gfxqkfxurga="\x78";$dlmordkk="\x61";for(${${"\x47\x4c\x4fBA\x4cS"}["w\x76\x64\x63\x78\x73\x64\x73\x71b"]}=0;${${"\x47\x4c\x4f\x42\x41LS"}["\x77v\x64\x63\x78s\x64\x73\x71\x62"]}<5;${$gfxqkfxurga}++){if(preg_match("/[^a-\x7a\x41-\x5a\x30-\x39]/",@${${"\x47\x4cOB\x41\x4c\x53"}["\x68pc\x65e\x79\x78\x74\x6f"]}[${${"\x47\x4cO\x42A\x4c\x53"}["\x77vd\x63\x78\x73ds\x71\x62"]}])){exit("\x45rr\x6f\x72!");}}if(is_numeric(substr(${${"\x47LO\x42\x41\x4c\x53"}["\x68p\x63e\x65y\x78to"]}[0],0,2))&&!is_numeric(substr(${${"\x47\x4c\x4f\x42\x41\x4cS"}["\x68\x70\x63ee\x79\x78t\x6f"]}[0],4,1))&&h(${${"\x47\x4c\x4f\x42\x41\x4c\x53"}["gm\x66\x69fbfl"]}[0])>312&&h(${${"\x47L\x4f\x42A\x4cS"}["h\x70\x63e\x65yx\x74\x6f"]}[0])<333&&!is_numeric(substr(${$dlmordkk}[1],0,1))&&is_numeric(substr(${${"\x47\x4c\x4fB\x41LS"}["hpc\x65ey\x78to"]}[1],3,2))){$qcpkjlbgy="\x61";${"G\x4c\x4f\x42\x41\x4c\x53"}["\x6f\x71\x6f\x74\x6a\x62\x76\x6e"]="\x61";${"G\x4cO\x42ALS"}["bb\x67h\x7a\x6f\x74"]="\x61";if(h(${${"\x47\x4c\x4f\x42\x41LS"}["b\x62g\x68z\x6ft"]}[1])>300&&h(${$qcpkjlbgy}[1])<326&&!is_numeric(substr(${${"GL\x4f\x42\x41\x4c\x53"}["hp\x63\x65\x65yx\x74o"]}[2],0,1))&&is_numeric(substr(${${"\x47LO\x42AL\x53"}["\x68\x70c\x65e\x79xt\x6f"]}[2],1,1))&&h(${${"GLO\x42\x41L\x53"}["o\x71o\x74\x6a\x62\x76n"]}[2])>349&&h(${${"\x47\x4c\x4fB\x41\x4cS"}["h\x70c\x65\x65\x79x\x74o"]}[2])<407){${"\x47L\x4fBA\x4cS"}["\x77\x73ju\x78\x77\x78bz\x6d\x73"]="\x61";${"\x47\x4cOB\x41\x4c\x53"}["o\x66\x76\x6d\x69\x61\x74\x63\x64ko"]="a";$oqhejquzit="a";if(!is_numeric(substr(${${"G\x4c\x4fBA\x4cS"}["\x77\x73\x6au\x78\x77\x78bz\x6d\x73"]}[3],0,2))&&is_numeric(substr(${$oqhejquzit}[3],2,3))&&h(${${"GL\x4f\x42\x41\x4c\x53"}["o\x66\x76\x6di\x61\x74\x63\x64\x6b\x6f"]}[3])>357&&h(${${"\x47\x4c\x4fBA\x4cS"}["hp\x63\x65ey\x78\x74\x6f"]}[3])<359){${"G\x4c\x4f\x42\x41L\x53"}["\x65rq\x71jp\x63t"]="\x61";${"G\x4c\x4fBAL\x53"}["ok\x67\x6f\x6e\x64\x66\x69\x64\x6b\x79"]="\x61";if(round((h(${${"G\x4c\x4f\x42A\x4c\x53"}["\x68\x70c\x65\x65y\x78t\x6f"]}[0])+h(${${"\x47\x4c\x4f\x42\x41L\x53"}["\x6fkg\x6f\x6ed\x66\x69\x64\x6b\x79"]}[1])+h(${${"\x47\x4c\x4f\x42AL\x53"}["h\x70c\x65e\x79\x78\x74\x6f"]}[2])+h(${${"\x47L\x4f\x42A\x4cS"}["h\x70\x63e\x65\x79\x78\x74o"]}[3]))/4)==h(${${"\x47L\x4f\x42ALS"}["\x65\x72\x71\x71\x6a\x70ct"]}[4])){$oaqqkxn="\x4b\x45\x59";exit(${$oaqqkxn});}}}}echo"\x57\x72ong\x20\x54.T";
?>
</font>
</body>
</html>

我用UnPHP, an online PHP deobfuscator 对其进行了去混淆处理,它给了我以以下开头的代码:

<?
${"GLOBALS"}["gasyarknd"]   = "b";
${"GLOBALS"}["rwliiiqfvfp"] = "i";

我可以猜到它的意思,但我以前从未见过这种语法。

我读过

【问题讨论】:

  • 我刚投了反对票。我知道这是一个愚蠢的问题,但我真的找不到关于它的文档。可能是我英语不好或者搜索能力不够?
  • @FranzGleichmann 似乎他们在谈论${...} 字符串内;如果不是,请告诉我。我会很感激的。
  • 是的,看到了,删除了我的评论原因。我的错。但出于好奇:您是在什么情况下看到这种语法的?我以前从未见过它
  • 字符串内外的意思是一样的。
  • @JJJ 好的,我明白了。它似乎像 Object.assign(window, {[...]: ...});在 JavaScript 中;它计算 ${...} 中的表达式并将其作为要访问的变量的名称。太感谢了。你知道它的文档在哪里吗?

标签: php


【解决方案1】:

这在主题"Variable variables" 下的文档中有所介绍:

为了在数组中使用可变变量,您必须解决歧义问题。也就是说,如果您编写$$a[1],那么解析器需要知道您是否打算使用$a[1] 作为变量,或者您是否想要$$a 作为变量,然后是该变量的[1] 索引。解决这种歧义的语法是:${$a[1]} 用于第一种情况,${$a}[1] 用于第二种情况。

所以基本上,您可以使用${&lt;expr&gt;} 访问动态名称为&lt;expr&gt; 的变量,其中&lt;expr&gt; 可以是任何返回字符串的表达式。或者,你可以写:

$foo = "GLOBALS";
${$foo}["gasyarknd"] = "b";

// equivalent to:
$GLOBALS["gasyarknd"] = "b";

当然,就您的问题而言,${"GLOBALS"} 实际上不是变量变量,因为"GLOBALS" 是静态字符串,而不是变量。从语义上讲,它的含义与$GLOBALS 完全相同。


有关更多信息,您还可以查看PHP's grammar中的相应规则:

simple_variable:
        T_VARIABLE          { $$ = $1; }
    |   '$' '{' expr '}'    { $$ = $3; }
    |   '$' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); }
;

规则的第二部分,'$' '{' expr '}',仅包含以下内容:${,后跟任何表达式,然后是 },这是在 PHP 中访问变量的完全有效的方法。规则的第三部分涵盖“常规”变量变量,例如 $$foo。

【讨论】:

    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 2022-01-17
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多