CTFHUB-WEB刷题
Web前置技能
HTTP协议
请求方式
题目页面要求是以 CTFHUB方式访问页面,在burpsuite里把GET方式换成CTFHUB即可得FLAG。
302跳转
打开页面提示没有FLAG:
点击下面的超链接后用burpsuite开启截断,发现FLAG:
Cookie
打开网页得到提示,应该是改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:
因为是源码,所以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 |
|
写好后上传即可绕过:
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 |
|
有了文件头就好办了,直接把改后缀的马放到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的数字),t即为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 |
|
file://
这种URL Schema可以尝试从文件系统中获取文件:
1 |
|
如果该服务器阻止对外部站点发送HTTP请求,或启用了白名单防护机制,只需使用如下所示的URL Schema就可以绕过这些限制:
dict://
这种URL Scheme能够引用允许通过DICT协议使用的定义或单词列表:
1 |
|
sftp://
在这里,Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作。
1 |
|
ldap://或ldaps:// 或ldapi://
LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。
1 |
|
tftp://
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机。
1 |
|
gopher://
Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。
1 |
|
端口扫描
来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,
把环境url放入intruder里,url参数后接127.0.0.1:8000
,只对端口号进行爆破。
POST跳转
这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年
故技重施,先读一下flag.php文件,结果还真有,读下代码。
1 |
|
首先判断来源地址是否是本地地址,如果不是本地地址,则返回信息后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 |
|
最后flag_str的值为011000110111010001100110011010000111010101100010011110110011000000110100011001010110011001100101011001000011000101100101001100000011010101111101
,通过二进制转ascii码可得到最后的flag:ctfhub{04efed1e05}
这里本地调试的过程中遇到了TShark not found. Try adding its location to the configuration file.
这个错误。可以在pyshark本地库的配置文件config.ini
找到tshark_path
参数,将参数值更改为正确的路径。