0x01 源码

  1. <?php
  2. include("flag.php");
  3. $_GET?$_GET=&$_POST:'flag';
  4. $_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
  5. $_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
  6. highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

第一行:如果存在get传参,则把post传参地址给get,可以简单理解为post覆盖了get,否则get没有传参,直接跳过,因为’flag’只是一个字符串,没有赋值操作。
第四行,如果get参数HTTP_FLAG的值为flag,就读取文件,也就是输出flag
第三、四行无效。

0x02 Payload

  1. ?1=2
  2. post
  3. HTTP_FLAG=flag

三目运算符

三目运算符的执行需要是语句

  1. $a = 1;
  2. $a == 2 ? $a = 3 : '4';
  3. var_dump($a);

此例题返回的是1,因为$a !=2 时,’4’不是语句,不能改变$a的值,因此为无效语句