SSRF学习

SSRF学习

SSRF的定义(维基)

服务器端请求伪造(Server-side Request Forgery,SSRF)是攻击者滥用服务器功能访问或操作自己无法被直接访问的信息的方式之一。服务器端请求伪造攻击将域中的不安全服务器作为代理使用,这与利用网页客户端的跨站请求伪造攻击类似(如处在域中的浏览器可作为攻击者的代理)。

这里的官方说辞不够通俗,举例说明:

作为一名普通的学生A,可以正常的访问学校的官网B,我们在查自己的成绩的时候需要登录教务网站C进行查询,但是寒假期间查询的时候发现教务网站C被禁止外网访问了,如需访问只得使用校园VPN进行内网访问;这里我们假指自己没有访问内网的权限,只有访问B网站的方式,而学校的所有网站都是建立在同一个(内网)网络体系中,如此我们可以通过校园B网来间接访问教务C网。(这种理解比较粗糙)

国内普遍的解释:是攻击者构造形成由服务器端发起请求的安全漏洞

SSRF的形成原因大多是由于服务端(某个网站)提供了从(内网中)其他服务器应用获取数据的功能;且没有对连接请求做任何的安全过滤和限制;导致攻击者恶意的从该网站访问其内网中的其他资源。

SSRF的产生

  • file_get_contents()

我们在实际开发中需要从用户指定的一个地址file_get_contents()获取一张图片,然后展示图片:
(这里只是举例图片,当然包括视频、网页等)

if (isset($_POST['url']))
{
	$content = file_get_contents($_POST['url']);
	echo $content;
}

这里的url所指向的图片是用户所无法直接获取的,但是可以通过同一个内网中的服务器进行获取。

  • fscokopen()

fscokopen()函数可以帮助我们打开一个网络连接或一个套接字连接;开发者在项目中使用函数可以和服务器建立TCP连接,传输数据;对于用户而言实现获取指定的数据(文件或HTML)

function GetFile($host, $port, $link){
	// 建立套接字 返回文件句柄
	$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
	if(!$fp){
		// 返回的错误信息
		echo "$errstr(error number $errno) \n";
	} else {
		// 设置HTTP报文头
		$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
		fwrite($fp, $out);
		$contents = "";
		while(!feof($fp)){
			// fgets访问fp并每次返回1024字节
			$contents .= fgets($fp, 1024);
		}
		// 关闭文件
		fclose($fp);
		return  $contents;
	}
}
  • curl_exec()

执行cURL会话;参数是curl_init()返回的cURL句柄。

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); // 关闭会话
	echo $result;
}

SSRF蜗居的地方

  • 社交分享功能

获取超链接的标题等内容进行显示

  • 转码服务

通过URL地址把原地址的网页内容调优使其适合手机浏览

  • 在线翻译
  • 图片加载/下载
  • 涉及第三方请求或者URL操作的功能都可能存在SSRF

https://xz.aliyun.com/t/2115

https://www.freebuf.com/column/157466.html

https://www.freebuf.com/articles/web/20407.html

寻找SSRF

  • F12查看源代码是否在本地进行请求

  • DNSlog工具进行测试,查看是否可以访问

  • 抓包分析发送的请求是不是有服务器发出的请求

利用SSRF

端口扫描

通常,只要用户输入的URL是有效的会正确执行并返回结果,若是无效的则会返回错误的信息;我们可以根据服务器SSRF伪造的请求去判断端口是否开放(在URL后加上端口号即可)但是也有应用不会判断端口号是否开放而是直接判断URL是否有效则决定访问;但是建立TCP连接的会在建立socket套接字连接的时候目标会发送Banner(类似端口的服务、版本、名称*等)信息并且能够作为原始的html数据显示;Banner信息目标服务器是可以隐藏的,但可以通过判断处理错误信息、响应时间、响应包大小等信息来综合判断端口的状态。

内网攻击

通常的内网安全保护是薄弱的也是规避安全风险的方式之一(我们学校教务网站漏洞多就永久的迁至内网了);通过SSRF攻击可以实现间接的对内网的访问,具有访问权限也就可以对内网的机器进行攻击。可以利用端口扫描的方式来探测服务,再利用Exp/Poc进行漏洞测试。

内网WEB指纹识别/访问

通过目录和一些特征文件来识别内网使用的框架、模块、CMS的类型

使用各种协议进行请求访问,比如:读取文件

采用ftp:// file://等协议

攻击内网应用程序(利用跨协议通信技术)

https://www.freebuf.com/articles/web/19622.html

绕过技巧

  • https://baidu.com https://baidu.com@baidu.com 这两个请求最终是一样的访问baidu.com

image-20200615200104064

多次尝试后发现,只会识别@符号之后的url

  • IP地址的进制转换

防御思路

  • 过滤返回信息

  • 统一错误信息

  • 限制请求端口(尤其是类似80\443\8080)

  • 黑名单策略

  • 限制请求协议(通过http/s协议即可)

posted @ 2020-08-10 01:59  Mirror王宇阳  阅读(62)  评论(0编辑  收藏