文章目录
SSRF
- SSRF,Server-Side Request Forgery,服务端请求伪造,是一种
由攻击者构造形成由服务器端发起请求的一个漏洞。一般情况下,
SSRF攻击的目标是从外网无法访问的内部系统。 - 漏洞形成的原因大多是因为服务端提供了从其他服务器应用获取
数据的功能且没有对目标地址作过滤和限制。.
目的
- 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息
- 攻击运行在内网或本地的应用程序(比如溢出)
- 对内网WEB应用进行指纹识别,通过访问默认文件实现
- 攻击内外网的web应用,主要是使用GET参数就可以实现的攻击(比如Struts2,sqli等)
- 利用file协议读取本地文件等
何处可能存在SSRF漏洞
- 能够对外发起网络请求的地方,就可能存在SSRF漏洞
- 从远程服务器请求资源(Upload from URL,Import & Export RSS Feed)
- 数据库内置功能(Oracle、 MongoDB、MSSQL、 Postgres、 CouchDB)
- Webmail收取其他邮箱邮件(POP3、 IMAP、SMTP)
- 文件处理、编码处理、属性信息处理(ffmpeg、 ImageMagic、 DOCX、 PDF、 XML)
后端代码详解
file_get_contents()
拿到POST到URL的参数以后输出给用户
< ?php
if (isset($_ POST['ur1'])) {
$content = file_ get_ contents($_ POST['ur1']);
echo $content;
}
?>
假如:
`url=http://ww.google.com/images/brandingoooglelog./2xgooglelog. color_ 272x92dp.png
它就会拿到这个url访问图片并返回到用户
`
fsockopen()
效果与上面那个异曲同工
< ?php
if(isset($_ POST[ host'])){
$host = $_ POST[ 'host' ];
$port = $_ POST[' port ' ];
$link = $_ POST[ 'link'];
GetFile($host, $port, $link);
}
function GetFile( shost, $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);
echo $contents;
}
?>
host=内网地址&port=端口&link=/phpMyAdmin/等等都可以构造
curl_exec()
<?php
if (isset($_ POST['cur1'])) {
$link = $_ POST[' curl'];
$curlobj = curl_ init();
cur1_ setopt($curlobj, CURLOPT POST, 0);
cu1_ setopt ($curlobj,CURLOPT URL , $1ink);
curl_ setopt ($curlobj, CURLOPT_ RETURNTRANSFER, 1);
$result =curl_ exec( $cur1obj);
curl_ close($curlobj);
echo $result;
?>
如何食用
协议利用
- Dict协议: dict://url/helo:dict
- Gopher协议: gopher://url:80/gopher
- File协议: file:///你要得到东西的绝对路径
绕过姿势
- 更改IP地址写法
比如:192.168.0.1可以写为
●8进制格式: 0300. 0250.0.1
●16进制格式: 0xCO. 0xA8.0.1
●10进制整数格式: 3232235521
●16进制整数格式: 0xC0A80001
●还有一种特殊的省略模式,例如10.0.0.1这个IP可以写成10.1
2.利用URL解析问题在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。例如:
-
利用URL解析问题http://www.baidu.com@192. 168.0.1/与http://192.168.0.1请求的都是192.168.0.1的内容
-
可以指向任意ip的域名xip.io: http://127 .0.0.1.xip.io/==>http://127.0.0.1/
-
短地址http://dwz.cn/11SMa==>ttp://127.0.0.1
-
利用句号。: 127。0。0。1==>127.0.0.1
-
利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿