星球问答:一次jsp上传绕过的思考
目录
1 背景
前几天有个小伙伴做项目的时候遇到一个问题来问我,大概情况如下:
- jsp的站,可以任意文件上传
- 上传jsp会把<%中的<给转义掉
- 上传jspx会把jsp:scriptlet到</jsp:scriptlet>中的内容替换为空
问有什么突破办法?
当时研究了一下后jsp和jspx各给了一个解决方案,后来发到星球里后@hosch3n师傅又提出了一种新的方案,tql
2 解决方案
其实问题等价于:
- jsp不使用<% %>标签如何执行命令
- jspx不使用jsp:scriptlet </jsp:scriptlet>如何执行命令
2.1 jsp利用EL表达式绕过
jsp是默认解析el表达式的,并且在没有jsp标签的情况下也可以直接执行,这样就可以绕过jsp的限制。
星球里面@Gh0stFx也提到了这一点
2.2 jspx利用命名空间绕过
因为jspx实际上是jsp的xml写法,所以继承了xml的所有特性,例如cdata跟html实体编码等,同样也继承了命名空间的特性。
https://www.runoob.com/xml/xml-namespaces.html
在jsp:scriptlet这个标签中,jsp就是默认的命名空间,但是实际上可以随意替换成其他名字
这样就绕过了对jsp:scriptlet的过滤
2.3 jspx利用jsp:expression绕过
在jsp中可以利用表达式绕过,那么jspx中同样也可以,以下是jsp跟jspx语法的对照:
JSP语法 | JSP document语法 | |
---|---|---|
Page Directive | <%@ page %> | <jsp:directive.page /> |
Include Directive | <%@ include %> | <jsp:directive.include /> |
Tag Library Directive | <%@ taglib %> | xmlns:prefix=”Library URI” |
Declartion | <%! … %> | jsp:declaration … </jsp:declaration> |
Scriplet | <% … %> | jsp:scriptlet … </jsp:scriptlet> |
Expression | <%= … %> | jsp:expression … </jsp:expression> |
Comment | <%– … –%> |
这个方法是@hosch3n师傅提出来的,把表达式写到jspx中,同样可以达到执行命令的目的