浅谈代码中的重定向

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新版的自动重载机制起作用..