浅谈代码中的重定向
he1renyagao (github.com/NaihTool) | 2015-06-21 16:40
今天,回顾下以前挖洞的思路,看到SSRF 这个问题,突然觉得利用302跳转来绕过这个点有点想法,于是自己测试了下。
常见获取URL页面的内容的部分代码
PHP
1、file_get_contents
2、fopen
3、fsockopen
JAVA
1、
URL console = new URL(url);
HttpURLConnection conn = (HttpURLConnection) console.openConnection();
经过测试PHP中 file_get_contents、fopen 和 Java 中URL console = new URL(url); 类似请求,对30x 重定向默认是包含的,即如果使用这三个方法(暂且测试三个成功)请求一个URL地址,而数据包返回的格式是30x 跳转的话,程序会自动根据Location去重新请求一次,就是说“整个过程就是一次请求” 。
个人搜索了下关于这个SSRF 的修复的建议,如果代码中使用了这几个方法,而没有限制请求接受重定向的话。通过判断URL 的地址的字符串类型,解析地址等之类的修复是不成功的,例如(http://dwz.cn/yes )。因为这个重定向问题始终可以利用。解决方式是通过设置禁止重定向或者使用其他方法获取URL的内容。做了下测试,似乎利用socket的方式的话,是不会去重新去请求重定向的内容的。
后续..
代码中请求重定向的内容次数是有限制的。在20次后的时候就报错了, 具体如:
http://www.baidu.com (访问http://www.baidu.com 会302到https://www.baidu.com)
1、http://dwz.cn/yes
2、http://dwz.cn/2f1lF
3、http://dwz.cn/2f1lH
4、http://dwz.cn/2f1lK
5、http://dwz.cn/2oy82
6、http://dwz.cn/3bHXv
7、http://dwz.cn/5gH2o
8、http://dwz.cn/5gH2u
9、http://dwz.cn/5gH2A
10、http://dwz.cn/5gH2J
11、http://dwz.cn/bDsuM
12、http://dwz.cn/bDsuU
13、http://dwz.cn/bDsv5
14、http://dwz.cn/bDswu
15、http://dwz.cn/bDswF
16、http://dwz.cn/bDswO
17、http://dwz.cn/bDswW
18、http://dwz.cn/bDsx6
19、http://dwz.cn/RWmi4 可以
20、http://dwz.cn/RWnGX 不可以
所以默认接受重定向的次数是20次。 因此以后测试SSRF 的时候,如果对方站点接受302 重定向页面请求的话,且http://dwz.cn/RWmi4 (第二十)请求时正常,http://dwz.cn/RWnGX (第二十一)请求不正常,是不是就基本可以判断这个站点存在SSRF了。(可以当作测试方法之一)
各种吐槽:
1#
BadCat (悲剧的我什么都不会......) | 2015-06-21 17:29
马来西亚这里上不到 dwz.cn
2#
ca1n (ლ(╹◡╹ლ )) | 2015-06-21 20:46
这个思路有点赞, 试了下我这
1.
chrome下21个重定向最终还是会到百度, 只是第二十一个之前会有个大概0.5s的无法加载页面,然后跳到百度, 二十之前的直接跳到百度
2.
ff下21个重定向无差别跳百度
3#
he1renyagao (github.com/NaihTool) | 2015-06-21 21:13
@ca1n @BadCat 首先上面的url 只是我用短地址生成,一层一层叠加的。 所有的地址都指向http://www.baidu.com 比如第二十个 http://dwz.cn/RWnGX 做了20个302 重定向到http://www.baidu.com
4#
CplusHua | 2015-06-21 22:12
@ca1n 你哪个是chrome新版的自动重载机制起作用..