南京邮电大学的CTF平台除了几个综合题外相对基础,适合我这种菜鸡拿来练习hahaha(手动狗头)

目录:


1.md5 collision

Alt text

首先查看源码,要求get传参a经过MD5加密后与QNKZDZO经过md5后的值相同,且a不等于QNKZDZO

此处利用到了php的弱类型,QNKZDZO经过MD5后是0e…..,0乘以多少还是0,因此只需再找一个经过md5后格式为0e….的字符串即可 Alt text Alt text 得到flag


2.签到题2

Alt text 打开页面提示输入口令zhimakaimen,但在输入时发现输到e时就不能输入了,存在长度限制 Alt text 于是抓包修改参数,得到flag Alt text


3.层层递进

Alt text 首先打开看到是一个网站的界面,先查看源代码 Alt text 发现下方有一个SO.html,打开后又看到下方一个S0.html,这里就考验眼力了 Alt text Alt text Alt text Alt text 以此点开这几个链接,flag在404.html里jquery的代码中间 Alt text


4.AAencode

Alt text 题目提示是aaencode Alt text 打开看到有点不对,alt更改一下编码为unicode Alt text 看到一堆颜文字,到网上找aaencode的解密 Alt text 得到flag


5.单身二十年

Alt text 打开看到一个超链接,链接到search_key.php Alt text 但打开发现是另一个界面,那么肯定是跳转了 Alt text 抓包得到flag Alt text


6.phpdecode

Alt text Alt text Alt text 网上说这种加密把源码的eval改为echo即可得到密文


7.文件包含

Alt text 点开超链接,发现url中有file参数 Alt text 尝试看能不能直接读到,失败 Alt text 使用php伪协议 php://filter/convert.base64-encode/resouce=index.php 读到index.php经base64加密后的代码 Alt text 找到flag Alt text


8.单身一百年也没用

Alt text Alt text 这次是302重定向,flag在index.php的hex中


9.cookie

Alt text 题目提示是cookie Alt text 将cookie改为Login:1,得到flag Alt text


10.MYSQL

Alt text 首先题目提示robots.txt Alt text 访问后得到一段代码,该代码再传入的id参数转化为整形(int),若与1024相等则出现flag(且id不能输入1024) Alt text 既然它会转化为整形,那就输入带小数的,如1024.1,得到flag Alt text


11.GBK injection

Alt text 题目已经提示是宽字节注入了 Alt text 因此在引号前添加%df即可使引号逃逸出来 Alt text 接下来就是平常的注入,最后得到flag Alt text


12./x00

此题有两种方法,源码要求参数nctf必须为数字,还必须包含#biubiubiu才能得到flag Alt text 首先考虑%00截断,注意此时%00后面跟的井号也得经过url编码才行(%23) Alt text 其次考虑php弱类型,strpos函数针对字符串对象,因此我们传入一个数组即可绕过对比 Alt text


13.bypass again

Alt text 此题依旧考察php弱类型,传入参数a != b且md5(a) == md5(b),因此还是使用md5后为0e….的字符串,得到flag Alt text


14.变量覆盖

Alt text extract() 函数从数组中将变量导入到当前的符号表。

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。

该函数返回成功导入到符号表中的变量数目。 Alt text 因此post传入的变量将被赋值,传入相等值的pass和thepassword_123即可 Alt text


15.伪装者

Alt text 这个题要求必须是本地登录才行,那就伪造X-Forwarded-For为127.0.0.1即可


16.上传绕过

Alt text 这个题检验的是basename的值,要求是php才行 Alt text 所以在upload处截断,即使上传jpg文件也可以


得到flag

17.SQL注入1

Alt text Alt text Alt text Alt text 这个查看源码后发现就是最简单的万能密码登录,用户名要以admin登录

admin ‘) or 1=1 #

密码随便填,登录成功


18.pass check

Alt text Alt text 这题依旧考察弱类型,用strcmp比较两参数的值是否相等

直接传入一个数组,绕过比较得到flag


19.起名字真难

Alt text 看源码要求输入与54975581388相等,但每一位不能与它相等 Alt text 因此考虑编码绕过,采取16进制,因为限制每位必须大于等于0小于等于9 Alt text 得到flag


20.密码重置

Alt text Alt text 要求修改admin的密码,但此处用户名是ctfuser且不能修改 Alt text 于是直接post传参过去,注意url的用户名也要改为admin的base64编码 Alt text Alt text 得到flag


21.sql injection

这个题的方法十分巧妙,首先对源码分析一下 Alt text stripslashes是去除addslashes函数添加的反斜杠

htmlentities($str, ENT_QUOTES)是将引号编码

因此我们无法直接用单引号闭合了

但是观察sql语句,我们可以在username中添加一个\,这就使得第二个单引号失效,那么第一个单引号就和后面的第三个单引号形成闭合,此时password输入or 1=1 #(%23),登录成功 Alt text


22.综合题

Alt text 打开后发现这是jother编码 Alt text 复制到chrome的控制台中解码,得到一个php文件名 Alt text 访问该php文件,发现什么都没有,但说tip在脑袋里,联想到head,查看http头 Alt text 发现tip是history of bash,那么联想到linux下的终端日志文件.bash_history Alt text 访问.bash_history,发现读取过一个flagbak.zip Alt text 访问下载下来,得到flag Alt text


23.SQL注入2

Alt text Alt text 这题分析源码后发现,只要你输入的密码与sql返回的密码的md5相等即可 Alt text Alt text 那么直接输入密码为1,sql语句为

‘union select md5(1) #

成功拿到flag Alt text 可以看到sql语句是可以返回用户输入的,即使数据不在数据库中


24.密码重置2

Alt text 首先右键查看源码,得到管理员的邮箱 Alt text 随便输入一个token来登录,发现控制登录的是submit.php Alt text 根据题目提示,访问并拿到vim的备份文件submit.php.swp Alt text 打开看到部分源码,要求token长度为10且token为0 Alt text 那么输入token为0000000000 Alt text 得到flag


25.file_get_contents

Alt text 查看源码,file_get_contents() 函数把整个文件读入一个字符串中,要求读入file参数的内容为meizijiu Alt text 此处利用php://input,它读取的是原始post的值 Alt text 因此在url中使用php://input,并post一个meizijiu,得到flag


26.变量覆盖

Alt text 这里考察的是可变变量,只是逻辑上有点绕,并不难

首先将$_GET数组的键值对分别作为$key和$value,$$key的意思就是将$key的值再作为变量名,然后把$value赋值给这个变量 因此要让$name == “meizijiu233”

只需get传入name=meizijiu233

得到flag Alt text


27.综合题2

首先打开看到一个留言板网站,在最下方有个cms说明 Alt text 点开后发现是一个about.php,此处存在文件包含漏洞 Alt text 大概浏览下文件,用python把主要的几个文件抓下来

	import requests
	import html
		
	s = ['say','config','passencode','index','so','antiinject','antixss','about']

	for i in s:
		url = "http://cms.nuptzj.cn/about.php?file={}.php".format(i)
		r = requests.get(url)
		r.encoding = 'utf-8'
		txt = html.unescape(r.text)
		addr = "/home/wrl/桌面/script/{}.php".format(i)
		with open(addr, "ab+") as f:
			f.write(txt.encode('utf-8'))
			f.flush()

其中比较重要的有以下几个

antiinjection.php Alt text so.php Alt text 这里的soid存在注入 about.php Alt text 这里的loginxlcteam是后台地址 passencode.php Alt text 这是数据库admin的加密方式,使用的是ascii *** 从antiinjection.php可以看出过滤了很多sql关键字符,但这个方法可以用双写来绕过,如ununionion、selselectect

前面已经给出了admin表的结构

最终爆出的用户名和密码:

admin

1020117099010701140117011001160117

即102 117 99 107 114 117 110 116 117,ascii解码为fuckruntu Alt text Alt text 登录进后台,提示有一个小马 Alt text 在about.php那里读取一下,这是乌云上ph讲过的回调后门

array_walk() 函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。 Alt text 最终传参为

www=preg_replace&wtf=print_r(scandir(‘.’)) Alt text 得到flag


对最后回调后门的理解 Alt text 首先看array_walk函数的用法,在最后这个回调后门中,最后这个数组应该是这样

$arr = array(‘print_r(scandir(‘.’))’ => ‘ .* e’,)

然后此时的array_walk函数为

array_walk($arr, preg_replace, ‘’) Alt text 于是preg_replace就变成

preg_replace(‘|.*|e’, ‘print_r(scandir(‘.’))’, ‘’) Alt text 所以最终的php代码应该为

	<?php
	print_r(scandir('.'));
	?>