2017-09-06 17:45:41 +08:00
|
|
|
|
# Trident(三叉戟)
|
2017-09-05 17:11:03 +08:00
|
|
|
|
|
2017-09-05 17:18:14 +08:00
|
|
|
|
> Java Code Security Component (JAVA代码安全组件)
|
2017-09-05 18:16:08 +08:00
|
|
|
|
|
2017-09-06 11:44:17 +08:00
|
|
|
|
目前支持的功能如下:
|
|
|
|
|
|
|
|
|
|
|
|
1. URL白名单验证
|
|
|
|
|
|
2. checkSSRF
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-09-05 18:16:08 +08:00
|
|
|
|
## URL白名单验证
|
|
|
|
|
|
|
2017-09-05 21:12:38 +08:00
|
|
|
|
### 验证逻辑
|
|
|
|
|
|
|
|
|
|
|
|
1. 取URL一级域名
|
|
|
|
|
|
2. 判断是否在域名白名单列表内
|
|
|
|
|
|
|
|
|
|
|
|
### 验证代码
|
|
|
|
|
|
|
2017-09-05 21:16:05 +08:00
|
|
|
|
合法URL返回true,非法URL返回false。
|
2017-09-05 18:16:08 +08:00
|
|
|
|
|
|
|
|
|
|
```java
|
2017-09-06 18:55:39 +08:00
|
|
|
|
security urlCheck = new security();
|
2017-09-05 18:17:43 +08:00
|
|
|
|
String[] urlWList = {"joychou.com", "joychou.me"};
|
2017-09-06 18:55:39 +08:00
|
|
|
|
Boolean ret = urlCheck.checkUrlWlist("http://test.joychou.me", urlWList);
|
2017-09-05 21:12:38 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2017-09-05 22:37:05 +08:00
|
|
|
|
## checkSSRF
|
2017-09-05 21:12:38 +08:00
|
|
|
|
|
2017-09-05 21:16:05 +08:00
|
|
|
|
|
2017-09-05 21:12:38 +08:00
|
|
|
|
### 验证逻辑
|
|
|
|
|
|
|
2017-09-05 21:25:12 +08:00
|
|
|
|
1. 取URL的Host
|
|
|
|
|
|
2. 取Host的IP
|
2017-09-05 22:33:00 +08:00
|
|
|
|
3. 判断是否是内网IP,是内网IP直接return,不再往下执行
|
2017-09-05 21:12:38 +08:00
|
|
|
|
4. 请求URL
|
2017-09-05 22:33:00 +08:00
|
|
|
|
5. 如果有跳转,取出跳转URL,执行第1步
|
2017-09-05 21:12:38 +08:00
|
|
|
|
|
|
|
|
|
|
### 验证代码
|
|
|
|
|
|
|
2017-09-05 21:18:00 +08:00
|
|
|
|
如果是内网IP,返回false,表示checkSSRF不通过,否则返回true,即合法返回true。
|
2017-09-05 21:12:38 +08:00
|
|
|
|
URL只支持HTTP协议。
|
|
|
|
|
|
|
|
|
|
|
|
```java
|
2017-09-06 18:55:39 +08:00
|
|
|
|
security urlCheck = new security();
|
2017-09-06 17:45:41 +08:00
|
|
|
|
String url = "http://dns_rebind.joychou.me";
|
2017-09-06 18:55:39 +08:00
|
|
|
|
ret = urlCheck.checkSSRF(url);
|
2017-09-06 17:45:41 +08:00
|
|
|
|
if (ret){
|
2017-09-06 17:46:46 +08:00
|
|
|
|
// curl url
|
2017-09-06 17:45:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
System.out.println("Bad boy. The url is illegal");
|
|
|
|
|
|
}
|
2017-09-05 21:12:38 +08:00
|
|
|
|
```
|
2017-09-06 17:45:41 +08:00
|
|
|
|
|
|
|
|
|
|
### 绕过姿势
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
以上代码在设置TTL为0的情况,可以用以下方法绕过 :
|
|
|
|
|
|
|
2017-09-11 11:47:05 +08:00
|
|
|
|
1. DNS Rebind
|
2017-09-06 17:45:41 +08:00
|
|
|
|
2. 域名解析2个A记录地址(分别为外网和内网)
|
|
|
|
|
|
|
|
|
|
|
|
也就是说,只要Java不设置TTL为0,该代码逻辑上不存在被绕过风险。
|