我有一种情况,我想在URI(%2F)中编码斜杠,但我.htaccess发出请求时会忽略我的规则,而是发送给404页面.我很快找到了AllowEncodedSlashes我打算开启的Apache指令,但我仍然不明白为什么它首先是安全风险.如果他们试图邪恶的话,难道没有人能手动将编码的斜杠转换为真正的斜杠吗?(虽然我看不出他们能做什么伤害......)
我正在测试的应用程序是用PHP编写的,与它接口的mod_rewrite规则如下所示:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^test/(.*)$ /test.php?_escaped_fragment_=$1 [NE,QSA,L]
Run Code Online (Sandbox Code Playgroud)
我只想确保在继续之前了解风险.
澄清一下:Apache不允许在路径中使用编码斜杠,但在查询字符串中允许使用它们.查询字符串与下面的Christian列出的漏洞一样容易受到攻击("远程代码执行,本地文件访问和目录遍历").
那么ASF为什么要创建一个特殊的指令只是为了允许这种行为呢?我不是很难,我真的不明白.我认为不用说任何用户输入(包括URI)都需要在任何数据库或文件系统功能中使用之前进行验证.
我有这个REST资源:
@GET
@Path("{business},{year},{sample}")
@Produces(MediaType.APPLICATION_JSON)
public Response getSample(
@PathParam("business") String business,
@PathParam("year") String year,
@PathParam("sample") String sampleId {
Sample sample = dao.findSample(business, year, sampleId);
return Response.ok(sample).build();
}
Run Code Online (Sandbox Code Playgroud)
sample例如,param可以包含斜杠字符:6576/M982。
很http://ip:port/samples/2000,2006,6576/M982明显,我正在用它来调用它,但是不起作用。
我也尝试过使用http://ip:port/samples/2000,2006,6576%2FM982,将斜杠编码为%2F,但也不起作用,也无法到达端点。
编辑
我正在使用Retrofit来调用端点,并且这样做:
@GET("/samples/{business},{year},{sampleId}")
Observable<Sample> getSampleById(
@Path("business") String business,
@Path("year") String year,
@Path(value = "sampleId", encoded = true) String sampleId);
Run Code Online (Sandbox Code Playgroud)
使用encoded = true,但仍然无法正常工作。