来自:一言
var xhr = new XMLHttpRequest(); xhr.open('get', 'https://v1.hitokoto.cn/'); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { var data = JSON.parse(xhr.responseText); var hitokoto = document.getElementById('hitokoto'); hitokoto.innerText = data.hitokoto; } } xhr.send();
CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式,2013年全球举办了超过五十场国际性CTF赛事。而DEFCON作为CTF赛制的发源地,DEFCON CTF也成为了目前全球最高技术水平和影响力的CTF竞赛,类似于CTF赛场中的“世界杯” 。
目前网上提供了很多CTF靶场给大家训练,最近在玩一个CG-CTF的靶场,所以写个帖子记录一次,持续更新。
CG-CTF网址:https://cgctf.nuptsast.com/challenges#Web
下图是线下CTF比赛照片~当然我是不配的[aru_15]。
1.打开题目,看到以下提示。
2.打开题目地址,可看到以下提示。
3.下意识查看一下源码,发现flag。
ps:签到题肯定是最简单的,要跟着思路走就可以了,一般题目里都会有提示的~
1.这关叫md5碰撞,打开题目可看到php源码,如下
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "nctf{*****************}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
ps:因为我基本也不会php,但是还是可以看懂一点。以下是个人理解,如有错误希望指出[aru_14]
2.源码的意思是:md51是将QNKCDZO进行MD5加密,a是从前端获取一个get请求发送过来的值,md52是将a进行md5加密,如果接受到前端传来的a值,就进行判断。a不能是QNKCDZO并且md51和MD52的值需要相同才可以获取flag,但是我们看php源码中,md51和md52中间是"=="而不是"===",这样就表示两个值不需要完全相等[aru_3](ps:有兴趣的可以百度一下php的等于)
解题开始:QNKCDZO的md5值是:0e830400451993494058024219903391 (md5值是唯一的)
由于php使用==
比较数字和字符串时,将字符串转换成数字后与数字进行比较,然后根据php字符串转换成数字的规则,可以知道只要是以0e开头的md5值,本题源码里都会默认是正确[aru_38],通过百度可以获取到md5以0e开头的字符:s878926199a
s214587387a
3.所以,通过get发送以上字符,可获取flag
1.打开题目域名,可以看到以下信息
2.输入口令:zhimakaimen 后依然没变化,然后右键查看源码,发现以下东西。。([aru_15]这思路太骚了,所以我一直都知道打ctf比赛的都是大佬)
解释一下:通过查看源码可以发现前端文本框限制最大输入的10个字符,但是口令是:zhimakaimen(11个字符!!!),所以我们需要利用burp绕过前端字符限制,才可以获取flag
3.利用burp绕过前端限制成功获取flag
1.打开题目地址,发现一张图片,如下图
2.发现一个动态表情包,再根据题目提示可以轻易的知道flag就藏在这个表情包中,所以把表情包保存下来,用文本打开查看,可获取flag
1.打开题目地址可以看到以下信息
2.根据题目的意思(层层递进),应该是不断的跳转获取新的信息啥的~~[aru_15],所以先查看源码,可以发现一个入口
SO.html
再点进去,又发现一个S0.html
又发现一个页面[aru_38]。404.html
最后这个404页面就包含了我们需要的flag,把注释里的flag提取出来就成功获取flag了!!![aru_78]
1.AAencode(颜文字加密)
ps:这关的编码有问题,应该用unicode编码打开。保存文件,修改编码后。打开后如下
2.将转化后的字符粘贴在浏览器的F12控制台中回车,即可获得Flag!![aru_62]
1.emmm,题目名称是单身二十年?[aru_7],提示如下图
2.打开页面发现是这样
点击后是这样的。
emmm,看来是我的手速不够![aru_60],那就只有用技术来弥补了,拿出我的大刀[aru_84],不不不,是burp才对。
3.在跳转处利用burp进行抓包拦截
成功获取flag,原来是一个跳转,话说真的有人可以通过手速获取吗?[aru_125]
1.打开题目,可以看到以下源码。一个加密的shell,flag应该在加密的字符里。
<?php
function CLsI($ZzvSWE) {
$ZzvSWE = gzinflate(base64_decode($ZzvSWE));
for ($i = 0; $i < strlen($ZzvSWE); $i++) {
$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);
}
return $ZzvSWE;
}
eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));
?>
2.将以上源码作为php文件打开,发现eval函数报错。
3.那我们换个思路,加密代码是包含在源码里的,CLsI应该是解密,那我们把源码里的eval换成echo,是不是就可以直接看到解密后的内容了?[aru_27]
如图:成功获取flag~[aru_14]
ctf真的很有趣,里面的思路脑洞让我学习到了很多,这次就先更新到这里,下次有空再继续学习,加油奥力给~[aru_13]