第一次打比较正式的比赛,也看到了自己有多么菜。
Web
easy_parse
考察prase_str()变量覆盖漏洞
打开链接只看到“an easy web”,可以在网页源代码的注释部分找到一部分源码:
parse_str函数的作用就是解析字符串并注册成变量。使用这个函数在注册变量之前不会验证当前变量是否存在,所以会直接覆盖掉已有变量,造成变量覆盖漏洞。
构造payload: ?a=boom=givemeflag,拿到flag。
web_1
考察PHP类型转换将超过精度的浮点数转换为整数
打开之后可以看到一些源码。
补充:
对于“==”的类型转换,PHP首先读取这个浮点数,然后进行类型转换。
当给定的数的精度超过了double类型的精度(小数点后15)位时,就会四舍五入取整。
这不是PHP的问题,是double所存储的精度的问题。
这时候只要让id等于0.999999999999999999……就可以成功绕过。
payload: ?id=0.999999999999999999999999999999
成功得到flag。
爆破
考察使用Burp Suite暴力破解
题目名称提示了“爆破”,那肯定是要暴力破解了。
打开之后发现一段正则表达式:
所以可以推测出pass的值应该为skctf?????,问号部分为从00000到99999的五位整数。
同时在网页源代码里发现如下提示:
访问一下那个页面,随便写个数字上去,抓包,Ctrl+I,爆破位置设置在五位数字上:
Payload设置如下:
开始爆破,发现在payload为77777时回显有变化,所以知道正确的值应该是77777,将这个数字替换掉之前随便写的数字,得到flag。
这道题跟Bugku的“输入密码查看flag”的做法几乎一模一样,只是需要自己判断格式和在网页源代码中寻找需要爆破的页面。可以参考一下:https://www.jianshu.com/p/51a2b325b5ea
login
一道比较特殊的SQL注入题
打开之后就一个登录页面,但是在响应头里发现了一些Base64加密的字符串:
将它们解码可以得到一段源码:
$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){
}
很显然是SQL注入题。大概意思就是可以通过构造一个不存在的用户名来登录,但是需要有这个用户名对应的密码的MD5值,可以用union select来实现。
随便构造一个不存在的用户和不存在的密码,POST方式提交即可。
payload:username=admin123' union select 1,'25d55ad283aa400af464c76d713c07ad'%23&password=12345678
显示"login success!"之后就能看到flag了。
blog
考察用脚本爆破MD5截断验证、vim异常退出产生.swp文件泄露、extract变量覆盖
打开之后是一个很普通的博客页面,进入LINK下的“勿进”页面:
可以看到一段源码,是熟悉的MD5截断验证:
而且刷新之后MD5的值不会发生变化。
直接使用脚本爆破,爆破使用的脚本如下:
import hashlib
for i in range (1000000):
a=str(i)
md5=hashlib.md5(a.encode('utf-8')).hexdigest()
if md5[0:5]=='6a35b':
break
print (a)
运行一下得到value的值为487697,构造payload: ?value=487697
进入下一个页面:
很明显是vim异常退出的知识点。
既然是登录页面,那么应该是login.php,.swp的文件名应该是.login.php.swp,果然有这个文件:
下载之后访问,可以看到一部分源码:
}else{
ob_end_flush();
header('Location: ./admin.php');
$_SESSION['isadmin'] = 1;
if($username === 'admin' && md5($password) === $md5)
{
extract($_POST);
if(isset($_POST['username'])&&isset($_POST['password']))
{
$md5 = 'fac6d830e795e0ccbd36da173ddc3ac0';
试着去破解了一下这串MD5,没得到结果,看来不是爆破MD5。
注意到“extract($_POST)”,说明这里应该有变量覆盖漏洞。
extract() 该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
所以可以直接构造一个任意的密码,并传入一个md5参数,用这个密码的MD5值覆盖掉之前的MD5。
payload: username=admin&password=123456&md5=e10adc3949ba59abbe56e057f20f883e
成功登录:
flag在This is admin page这篇文章里:
RE
真正的签到题!
用IDA打开就能看到flag
(悄悄吐槽一句那个“假的签到题”对我等逆向小白真的是十分不友好……)
Crypto
签到题
考察十六进制转文本
开头有0x,推测这是十六进制的字符串。去掉开头的0x,将其余部分转换为字符串即可。
紧急报文
考察ADFGX密码的解密
在实验吧做过一道相同加密方式的题目,所以很容易知道这是ADFGX密码,对照着密文表一个个解出来就行。
附网上搬来的密文表:
阅读顺序是先竖后横
对照之后就可以解出flag:buedoctf
rsa
很基础的RSA题目,用CTF-RSA-tool解密
将密文存为一个文本文档,用CTF-RSA-tool解密就可以得到flag。
(比赛过程中我的CTF-RSA-tool居然崩了,好在最后关头被我救回来了,否则这么多分就没了啊orz)
misc
Excel
Excel解密题,其实用WinHex就能找到flag
这道题我其实纠结了很久,又是写脚本又是暴力破解,都没成功,最后机缘巧合之下发现居然在WinHex里直接搜索flag就能找到flag。
这道题成功地让我感到自己的智商受到了侮辱……
morse
最基本的音频隐写题,考察摩斯密码的解密
题目名称提示了“Morse”,文件又是音频,那肯定是音频中藏有摩斯密码。
用Audition打开可以很容易地发现一个声道里有摩斯密码:
解密这些摩斯密码就能得到flag。
easy_stego
最基本的图片隐写,考察查看图片详细信息
把图片下载下来,在图片详细信息中的标记里就能找到flag。
unzip
大概是考察UNIX时间戳和一小部分暴力破解吧
这道题没放hint之前一直不知道该怎么做,后来放了一个hint:"时间戳",于是百度了一下:
时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。
可以看到.zip文件的创建时间,但是不知道秒数,这时候可以先生成一个时间戳,再使用工具爆破秒数。
先利用创建时间生成一个秒数为0的时间戳,再使用ziprello爆破:
因为只有60个可能的密码,所以秒破:
用这个密码解压压缩包,在压缩包内的flag.txt文件里可以找到flag。
bwm
考察图片隐写中的盲水印
有两张图片,这种情况下要么是将两张图片进行异或运算,然后在异或得到的图片里找flag,要么是盲水印,而这道题是盲水印。
用BlindWaterMark工具可以获得盲水印的图片:
flag就在图上。
下面是有思路但是没做出来的
Web
Simple_JWT
考察JWT的伪造
一个JWT实际上就是一个字符串,它由三部分组成:头部、载荷与签名。JWT中常用的签名算法是 HS256。签名是用前两部分通过HS256加密算法得出来的。
其实这道题就是伪造JWT来绕过,但是我下到的两个破解JWT加密的工具全都不能用,就没做出来。问了问其他大佬也是这样,以后慢慢搞吧。
其实正确的解法应该是:先抓包找到JWT,然后使用这个网站:https://jwt.io/来在线调试JWT,用解密工具解出加密第三段的秘钥,最后伪造成admin登录。
报菜名
这道题的原意应该是写Python爬虫来爬取页面上的数字信息,然后自动计算、自动提交
因为页面含有中文,会报编码错误,一直没找到好的解决方法,就没解出来。
赛后问了做出这道题的那个大佬才知道其实这道题有BUG,页面不会自动刷新,只有手动刷新才会更改页面上的数据,所以直接计算就可以。
先把网页上的数据保存到Word文档中,再去掉汉字和:,最后放到EXCEL里用sum函数计算总和,将计算的结果填入页面上的输入框,点击“提交”,就能得到flag。
blind_sqli
考察基于布尔的时间盲注
虽然看了hint知道是基于布尔的时间盲注,但因为SQL注入这里目前我只会用sqlmap,所以就没做出来。
后来看官方wp说可以用sqlmap做,但我用sqlmap却找不到注入点,求大佬指教。
misc
凉宫春日的消失
考察LSB隐写之查看图片低位数据
以前也做过这一类的图片隐写,但这次可能是因为从上午九点跟大佬们一起没吃午饭没睡午觉打到下午,脑子彻底糊了,就没做出来。
用stegsolve的Data Extract功能,分别查看R、B、G三个通道的最低位,可以发现flag的三个部分,拼起来就得到flag。
Crypto
^
似乎是考察异或运算的知识?
看到这个符号我就大概猜出来是异或了,但是我本来以为是以中间的异或运算符为界,两边互相异或,放出hint“异或一个字符”之后也不明白,最后看了官方wp发现是与0x7异或,这是为什么???求大佬解答。
其他的题目(其实就是web2和phar这两道题,一个是用var_dump()在本地查看变量值,这个知识点明白但是不知道怎么运用进去的;一个是phar反序列化,这个以前根本就没见过……)看了官方wp也没搞得很明白,以后慢慢学吧。