本文作者:Ph0rse
这段时间一直在忙活 CTF 相关的东西,从参赛者到出题人,刷过一些题,也初步了解了出题人的逻辑;这篇文章就简单地讲一下 CTF 如何入门以及如何深入的学习、利用 CTF 这个训练、学习平台。
文章里会涉及的一些资源:http://pan.baidu.com/s/1jIDpV8q
CTF 认知
CTF 可以理解成一种锻炼和学习信息安全技术的训练场,具体的解释在百度以及这篇安全维基~上都有,就不再赘述了。而 CTF 对信安人员的意义,在我看来,是扩宽我们的安全知识面,以及实战式应用我们学到的安全知识。随着 《网络安全法》 的公布,以及企业安全意识的增长,信安领域刚入门的小白越来越难找到真实、合法的环境来训练自己的技能。而 CTF 的出现,弥补了这个空白。
如何入门 CTF
CTF 分为 Web、Reverse、Pwn、Crypto、Mobile、Misc 六大类,我是走 web 方向的,偶尔也做一下 misc 。在这篇文章里,就以 web 为切入点,讲解一下如何开始,以及 ctf 学习带给我 web 技术那些启示与收获。
没有接触过 ctf 的小伙伴可以先看看这个
里面对 ctf 的介绍。
要开始 ctf 生涯,刷题是第一步,在这里贴一下精灵大大的 ctf 训练场集合:
总结得非常全,对于 web 方向,重点强调一下 bugku 这个平台,真的很不错,题目很经典,只有两三个脑洞比较大,体验不是很好。想要学知识的可以先把 bugku 刷上一遍。
当然,刷题也有刷题的方法,那就是必须要搞清楚题目背后的知识点点原理。不然即使你似懂非懂地拿到了 flag ,对于个人的成长也是无济于事。一道题扣一天,搞懂了原理不是浪费时间;照着 write up 刷了一遍,背后原理啥都不懂才是真的浪费时间。
在这段事件的学习之中有几个知识点,让我受益颇多,贴出来给大家分享一下。会尽量找一些可以复原环境的题目,供大家测试。
PS:由于我在写文章的时候 bugku 平台正在维护,所以可能题目链接之后会换,如果链接失效的话,大家可以去搜一下 bugku 的入口,题目名称是对应的。
1、Bugku——计算题( http://120.24.86.145:8002/yanzhengma/ )
这道题很简单,在 HTML 里限制了输入数字的长度,所以通过快捷键 F12,Element 处修改长度限制,然后输入 90,getflag 就行~
之所以把这么简单的题目贴出来,是想要强调一下,浏览器的调试功能,就像这道题里的可以修改 HTML 代码一样,JavaScript 代码以及 CSS 代码都是可控的。在实战过程中程序员将过滤函数或者重要数据写到了 HTML 或者 JavaScript 里面,我们就可以轻松获取。控制台也可以执行我们的 JavaScript 代码,实现一些 mazing 的功能。比如在真实场景就遇到一个,某刷题网站(高中题),是通过 js 发送成绩数据输入进数据库的。这么一来完全可以拦截下请求,修改数据,分分钟一百分。
浏览器的调试功能很强大,Chrome 的自带 F12 就基本够用,火狐的 Firebug 插件也很牛。如果想进一步学习可以看下面的两个连接:
无论是对 CTF 还是实战都非常有用,再次强调,打 CTF 是为了获取知识。
2、Bugku——SQL 注入 1( http://103.238.227.13:10087/ )
过滤了几乎所有的关键字,尝试绕过无果之后发现,下面有个 xss 过滤代码。经搜索得该函数会去掉所有的 html 标签,所以向注入关键字中插入<> ,就可以不被检测到,并成功注入;
Demo
http://103.238.227.13:10087/?id=1%20uni%3Chtml%3Eon%20sel%3Chtml%3Eect%20%201,hash%20fr%3C%3Eom%20sql3.key%20w%3C%3Ehere%20id=1--+
Get flag!
这道题并不难,但想要强调的是这种白盒审计的思路。有幸认识一个审计超神的大佬,听他讲审计的时候,就经常见到类似这种情况,本来两个过滤都很严实,但放到一起时,就可以用前一个过滤函数去绕过后一个过滤。这是程序员在写程序时常犯的毛病,指的 Mark 一下。
3、Bugku——Flag 在 index 里(http://120.24.86.145:8005/post/)
进入题目发现有一个 file 参数,查看源码,发现该参数可以包含 php 文件,并且题目提示,flag 在 index.php 里,所以想到可以用 php 协议来获取 index.php 的源码。
构造 payload:
http://120.24.86.145:8005/post/index.php?file=php://filter/convert.base64-encode/resource=index.php
获得经过 base64 编码后的源码,放到 hackbar 里解码一下得:
Getflag~
这道题需要注意两点,第一就是 php 协议,在这个文件包含的点使用 php 协议就可以读取任何文件源码,类似地还有 data 协议,file 协议。web 协议的种类多,利用方法也多,可谓是实战中的一大利器。在 CTF 线上赛中也经常用到,比如上次 CUIT 校赛以及西安的那个 XCTF 比赛中就用到了 phar://
协议。
想要仔细了解的伙伴可看一下:
4、Bugku——前女友( http://47.93.190.246:49162/ )
点开源码发现一个 txt 文件
访问得到部分源码:
总共考察两个 php 弱类型的知识点:
第一个是 md5 双等号相等: md5('240610708') == md5('QNKCDZO')
第二个是数组和字符串进行 strcmp 返回 0
所以 payload:
http://47.93.190.246:49162/?v1=240610708&v2=QNKCDZO&v3[]=123
分类情况,以及少数的几个知识点~审计相关,以及 join ,就 BUG 库的提醒进行介绍。 Php 弱类型算是 PHP 语言的一大特色了,在 CTF 中经常遇到,实际的白盒审计中也很常见。 详细可参见:
5、 Bugku——login1
SQL 约束性攻击,在检测用户是否已存在的问题上把控不严。介绍文章:
注册的时候多留几个空格就可以更改 admin 的密码了~
具体原理已经在上面的链接中介绍得很清楚了,就不再赘述了。
CUIT实验班考核——SQL2
源码在压缩包里,可自行搭环境测试,过滤了逗号和空格。以下是我写的 writeup :
拿到题后发现:
发现提示里说,女神喜欢饼干( COOKIE )所以猜测为 COOKIE 注入。这时就需要工具了,最方便的是用 BurpSuite 抓包送到 Repeater ,然后在原有 Cookie 后面加上分号
拿到题后,先测闭合情况,找一下原语句是用什么闭合的,单引号?双引号?括号?最常见的就是单引号。
测试的方法就是挨个用 (1 -1 1’ -1’ 1# -1# 1’# -1’#) 来测。本题是用 ’ 闭合的。
然后开始测试段数,使用 order by 无回显后,可以用
-1’ union select 1,2,3……n
来测,测到回显位显示出我们的数字即可。但这道题在尝试的时候会报 “what are you doing” ,应该是某个关键词被过滤掉了。所以在源语句的基础上依次删掉某个词,每次只删一个,如果都不行,就一次删两个。最后测出来是空格和逗号被过滤了~
空格很好绕过,可以用 // 来绕,检测是否绕过成功可以用 and//1=1#
和 and/**/1=0#
来测。逗号在尝试编码绕过无果之后,去网上找到了:
这篇文章,根据文章的内容再去查一下 join 的语法,再按照 SQL 注入的常规流程(不清楚的话建议刷一遍 sqli )就可以构造出 payload 。
Payload 截图如下:
爆库名:
爆表名:
爆列名:
爆 FLAG~
小密圈—— Mysql 字符集问题
这个点非常棒,P师傅(这个博客必须收藏啊~有没有)已经讲的很清楚了:
https://www.leavesongs.com/PENETRATION/mysql-charset-trick.html
8、php4fun—— 全部
Php4fun 原来是一个练习代码审计的一套小程序,但后面下线了,需要自己搭环境。本来想把几个知识点在这里阐述一下,但发现已经有很详细的writeup 了,再写就是浪费时间。所以我把 wp 和源码都放到了压缩包里,可以自己搭环境玩一玩儿。
小总结
这段时间还做了,“网络安全实验室”,“XSS Challenges”,和 WeChall 里的一些题,但因为我做得很零碎,并且现在还没有写 writeup ,所以相关知识点就不列在这里了。确实感觉从 CTF 中学到了很多很多~有个想法:在博客上连载各大训练平台的 Writeup ,算是为大家服务,如果开始做了的话,会在下一篇 CTF 文章中,贴出链接的,敬请期待。
在压缩包里还有一个 p 师傅的 PPT ,关于 CTF 技巧的,安利一波~
因为我只是一只 web 狗,所以其它题型也讲不出什么好东西来~在这里贴一个之前出现过的链接
真的是个好东西。
充分利用上面的一些资源,入门绝对不是问题啦~
哦,对了,做笔记是个很好的习惯,我用印象笔记,听说国内的为知笔记也不错~
如何进阶 CTF
讲完了入门的问题,再讲讲进阶,可能讲得不好毕竟我是菜鸟
刷完一套 bugku 就可以尝试着打打线上赛了
每年都会有各种各样的比赛,而且感觉会越来越多~
可以在这里找到最近的一些比赛,取得名次还有有奖励岂不爽滋滋
如果因为时间安排,以及其它不可抗因素错过了某些比赛,可以看官方的 writeup 来弥补一下。看到精彩处可以尝试联系出题人,要一下题目的源码出题人虽然经常被追杀,但人还是很好的除了一些敏感的东西,一般都会给你~
CUIT校赛经验
下面就我 CUIT 的校赛,简单说一下正规线上赛的难度系数与形式。
这场比赛,有两个大三的学长带,打起来虽不能说轻松,但也算是有惊无险~
我做了杂项和 web,杂项在这里就不说了。感觉考的是加解密的知识储备以及运气,对了,还遇到了个离散数学的题,妈妈诶,大一的萌新瑟瑟发抖~
Web 部分我感觉题出的非常棒,官方的 Writeup 很详细(萌新我还有地方没搞懂啊)在这里只是简单介绍下题目的难度系数
比如,第一题“山水集团”,是一道 SQL 的题,一上来进行简单的黑盒测试,然后想办法绕过过滤,最后的解决为盲注写脚本。爆出账号密码后,又有一个 Mysql 字符编码的绕过(就是上面说的那一点),进后台之后是无回显命令执行。
这道题是 300 分,比赛的时候没做出来,看 wp 的时候就感觉师傅们真厉害其它的题目的难度在这道题的上下浮动,具体的可以看一下压缩包里的官方 wp,( PS:“短域名“里的那个 dict 协议真是厉害)
因为是在自己的学校办的,并且队伍里有两个大三的学长带,所以有幸通过了线上选拔,参加了线下赛。
线下赛的比赛规则大概是,每个队伍分一台服务器(给你 SSH 的密码)。服务器上的配置都一样,每支队伍都需要审计自己服务器上的代码,找出漏洞,去打其它的队伍。从早上 9 点到下午 5 点,共 8 个小时,中午管盒饭和饮料。每隔 10 分钟会在服务器的固定位置,刷新 flag 文件,拿到 flag 提交,就可以给自己的队伍加分,被打的队伍减分。
感觉线下赛主要打以下几点:
1、快速白盒审计,发现并补上自己的洞
2、自动化攻击,利用发现的洞攻击其它队伍的洞,用 Python 实现半自动化。
3、种不死马,因为没有提权,所以只能上马来收割 flag ,一般的马很容易被删,所以可以根据下面的代码,来编写一个自己的不死马,其实就是无限循环生成,并且密码加密的一个马,但这种马只要重启一下服务就可以杀掉。还有一个更厉害的姿势,目前还没有杀掉的方法,等省赛过后再和大家分享吧~
4、审查日志,可以在服务器上放个记录访问日志的脚本,然后根据其它队伍打你的 payload 找到漏洞的位置,还可以拿这个 payload 去打其它队伍。( PS:比赛的时候发现了其它队伍的上传到我们服务器上的马,然后我们就很无耻地爆破出了密码,只有三位数。然后借刀杀人,拿到了 7/8 台服务器,刷了一下午哈)
关于线下赛,这里有两个链接讲得还不错,可以学习一波不死马可以把两个文章的代码结合起来,自己写一个
防范思维 CTF 化
无疑,打 CTF 是有助于我们技术的提升的,对于学生而言,一个重量级 CTF 奖状也将是你入职的敲门砖。
但打比赛与技术水平的高低倒还真没有必然的联系,想要打比赛需要长时间的投入,需要了解出题人的套路,认识很多不喜欢打比赛但很厉害的大佬。而比赛毕竟只是比赛,不是 100% 的真实环境,多多少少有些出入之处。
所以不要只满足于拿 flag 的快感,把从比赛获得的知识应用到实战上,拿个站、写个外挂、审审代码什么的。学,然后用,我认为这才是 CTF 的正确打开姿势。
出题人的一点想法
出题人真的挺难做的,既要想办法把题目出得有内涵,又要考虑预期之外的解法,还要防“搅屎”(在此为南邮以及 bugku 里被搅屎挂掉的几道 getshell 题目默哀 3 分钟)。
当然,就像 p 师傅说的,能成功地搅屎,也是一种能力体现。而能防止别人搅屎,是出题人能力的体现。
在这里贴上一篇“搅屎”教程,和 p 师傅的 Freebuf 上的搅屎攻略:
以及 P 师傅防搅屎攻略:
希望大家能够从中学到些东西(反正我学到了~嘻嘻)
楼主残忍的关闭了评论