SSRF漏洞
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
可能出现SSRF的函数有:file_get_contents()
、curl()
、fsocksopen()
、fopen()
等
php黑魔法:当输入的协议是php所没有的,它会当成目录去解析。
php伪协议小收集
1 | //参考网站:https://segmentfault.com/a/1190000018991087 |
不存在协议头绕过
当PHP的 file_get_contents()
在遇到不认识的伪协议头时候会将伪协议头当做文件夹,造成目录穿越漏洞,这时候只需不断往上跳转目录即可读到根目录的文件。
这里是要匹配到http,然后在http后面加上abc等(不满足http协议就可以),这样的话这个httpabc协议php就识别不了,会当做一个目录
./ 当前目录 ../ 父级目录 / 根目录
由于我们不知道需要跳转多少次的目录才可以读取文件,所以尽量输入足够多的跳转目录。
1 | http://39.107.126.173:28763/?a=httpabc://../../../../../../../../flag |
ip限制绕过
回环地址绕过
如果IP被限制,拒绝某个IP进行访问,并且只有这个ip访问才能得到flag,这种情况可以使用方法进行绕过。
localhost
localhost是给回路网络接口的一个标准主机名,本地地址就是127.0.0.1(因为localhot是不经网卡传输,所以它不受网络防火墙和网卡相关的的限制。这点和直接输入127.0.0.1有所区别)
虽然这里禁止了127.0.0.1访问,但是localhost代替127.0.0.1绕过
1 | //上面是正常用IP地址访问,下面是用localhost代替绕过 |
特殊IP绕过IP限制
用其他进制表示127.0.0.1。比如八进制,127.0.0.1的八进制表示为017700000001。
1 | http://39.107.126.173:28674/?a=http://017700000001/flag.php |
get_headers 绕过
因为get_headers存在00截断漏洞因此可以使用00截断导致get_headers成功。
原理:0X00和%00是同一个原理,就是用了十六进制表示方法,同时也是ascii码为0的字符。系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。那么就可以利用这个提前截断限制进行绕过。
1 |
|
exp
1 | http://39.107.126.173:28663/?url=http://127.0.0.1%00www.google.com |
双url绕过
1 |
|
这里可以知道,flag字符串中的a直接被用strpos函数识别,阻止操作flag。这里就可以用到双URL绕过。由于一次GET传输会先进行URL解码,而SSRF同样支持url解码,因此这里我们可以使用双url编码。将flag中的a进行双url编码%25%36%31即可绕过。