CTF_EXP04:2017 赛客夏令营 Web-random
创建环境,启动靶机:
根据题目名称与页面提示,判断此题为随机验证下一个数字的值
看到题目链接:
http://xxx.ctfhub.com:10080/index.php?num=1
其通过GET
方式传递参数num
编写Python脚本:
import requests
import re
url = 'http://xxx/index.php?num=22'
while True:
try:
r = requests.get(url)
# 匹配平台flag格式
flag = re.search(r'ctfhub\{.+\}', r.text).group()
except AttributeError:
print('未获取到flag! 正在重试!')
else:
print(flag)
break
脚本解析:
无限循环提交请求,直到页面中存在以ctfhub{}
格式的flag跳出循环。
运行脚本得到flag:
也可手动刷新页面,直到出现flag。
EXP如下:
# -*- coding:utf-8 -*-
# name: Meng
# mail: 614886708@qq.com
# ctf_exp04:2017 赛客夏令营 Web-random
import requests
import re
class RandomNum:
def __init__(self, url_input):
self.data = {'num': '22'} # 设置随机传参值为22
self.status_code = 1 # 链接状态:0:无效,1:连通
self.url = url_input
self.flag = ''
def url_test(self):
# 可以重复输错10次链接
for i in range(9):
try:
# 对输入的url做补全
if self.url.endswith('index.php') or self.url.endswith('index.php/'):
pass
elif self.url.endswith('/'):
self.url += 'index.php'
else:
self.url += '/index.php'
# 尝试访问链接是否200
requests.get(self.url, params=self.data)
except requests.exceptions.MissingSchema:
print('无效链接!请重新输入!')
self.url = input('请输入题目链接:')
self.status_code = 0
else:
self.status_code = 1
break
if self.status_code == 0:
print('无效链接!退出程序!')
return
def num_test(self):
# 设置获取flag只能重复30次
for i in range(30):
try:
r = requests.get(self.url, params=self.data)
# 匹配平台flag格式
self.flag = re.search(r'ctfhub\{.+\}', r.text).group()
except:
print('第 ' + str(i+1) + ' 次未获取到flag! 正在重试!')
else:
break
def run(self):
self.url_test() # 连接测试
self.num_test() # flag获取
if self.flag == '':
print('已尝试30次!未获取到flag! 退出程序!')
return self.flag
if __name__ == '__main__':
print('ctf_exp04: 2017 赛客夏令营 Web-random')
url_input = input('请输入题目链接:')
print(RandomNum(url_input).run())
input() # 防止退出cmd
输入题目链接,得到flag: