PHP特性 web98
源码如下
include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
第一行:若$_GET存在,将$_GET
设为$_POST
的引用(&
符号表示引用)
传入/?a=1令条件成立
第二行:此时$_GET
已指向$_POST
,故实际检查$_POST['flag']
是否为'flag'
POST传入 flag=flag
第三层:$_GET指向
$_COOKIE,则检查
$_COOKIE['flag']是否为
'flag',若满足,将
$_GET改为
$_SERVER`的引用
通过cookie传入flag=flag
最后检查$_GET['HTTP_FLAG']
的值是否为'flag'
满足返回flag
此时$_GET
指向$_SERVER
,因此$_GET['HTTP_FLAG']
对应$_SERVER['HTTP_FLAG']
。
$SERVER['HTTP*']存储请求头信息,需在请求头中添加
Flag: flag`。
POST /?a=1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Cookie: flag=flag
FLAG: flag
flag=flag