遇到过三次 一次是更改accept,获取到tomcat的绝对路径,结合其他漏洞获取到shell。
一次是更改accept,越权获取到管理员的MD5加密,最后接管超管权限。
一次是更改accept,结合参数获取到key。
这里以越权的案例介绍,其他的两个没保存图
原始请求包:将Accept改为 Accept: application/json, text/javascript, /; q=0.01
成功获取到当前用户的password以及sql接口
构造参数id=1后成功获取到管理员权限以及管理员md5密码,md5解密后成功接管管理员权限
核心还是根据Accept进行不同响应导致的
RESTful API情况下,直接写在controller中 后端请求根据请求头中Accept 字段判断进行生成不同格式的响应数据。
@RestController
public class MyController { @GetMapping(value = "/data", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<MyData> getJsonData() {
// 生成 JSON 格式的响应数据
MyData data = new MyData();
// 设置数据...
return ResponseEntity.ok(data);
}
@GetMapping(value = "/data", produces = MediaType.TEXT_HTML_VALUE)
public ResponseEntity<String> getHtmlData() {
// 生成 HTML 格式的响应数据
String html = "<h1>Hello, World!</h1>";
return ResponseEntity.ok(html);
}
}
filter进行设置编码
public class MyFilter implements Filter { @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String acceptHeader = httpRequest.getHeader("Accept");
if (acceptHeader != null && acceptHeader.contains("text/html")) {
httpResponse.setHeader("Accept", "text/plain");
}
chain.doFilter(request, response);
}
}
controller进行判断情况
@Controller
public class MyController { @GetMapping(value = "/data")
public String getData(HttpServletRequest request) {
String acceptHeader = request.getHeader("Accept");
if (acceptHeader != null && acceptHeader.contains("application/json")) {
// 返回 JSON 格式的视图
return "jsonView";
} else {
// 返回 HTML 格式的视图
return "htmlView";
}
}
}
除了accept以外是否还有其他的header头也会导致不一样呢,比如cdn模式下的Accept-Language会不会也有产生不一样的效果呢?
绕waf时的Accept-Encoding会不会也产生奇效呢?
User-Agent遇到403时,会不会也碰撞出不一样的火花。
这些就留给大家自己去探究了
基于开发的角度去探究漏洞,或许思路会更巧更妙
如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款