代码审计之WevServer笔记[ING]

Published: 2022年07月09日

In Vuln.

慢慢记,现在是草稿状态,不要看!!!!

对比分析

解析漏洞

IIS

  1. 6.0不解析;后面的,如 .php;.jpg会按php解析,另外有双文件上传,00截断,xx.asp文件夹下都是asp。
  2. iis7.0/7.5 evil.jpg/evil.php

apache

从右到左开始解析文件名,直到找到能解析的后缀。它使用handler标记请求处理程序,可使用AddHandlerSetHandler指定扩展对应的handler,前者只要文件名中包含就会匹配(不是结尾才匹配),由于历史原因也可以尝试使用AddType替换AddHandler,可能效果一样。

nginx

php配置了cgi.fix_pathinfo会使当前路径不存在则向上查找,可使用evil.jpg/.php访问evil.jpg并执行。

注:PHP在5.3.9之后引入security.limit_extensions选项,使FastCGI默认只执行.php后缀的文件

容器

相关的容器很多,一般挖掘应用时常见的有tomcat/jboss/resin/jetty,这里只介绍Tomcat。

web.xml里将web-app的版本号换成3.0以上时可支持注解方式,于是注册Servlet和Filter就有三种方式:配置文件/addServlet与addFilter代码/注解,实际上为防止遗漏,查看实际存在的Servlet和Filter可使用如下方式:

应用 Servlet Filter
Jetty org/eclipse/jetty/servlet/ServletHandler:doScope下断后,通过打印this._servletMappings可获取 同样的地方下断后,打印this._filterPathMappings
Tomcat org/apache/tomcat/util/http/mapper/Mapper.class:internalMapWrapper下断后看contextVersionwrappers,也可以往上看有哪些context(不同版本可能路径不同)
Resin

在startup.sh 里,修改如下:

# 添加
export JPDA_SUSPEND='n'
export JPDA_ADDRESS=5005
# 修改
exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"

或者在catalina.sh里,插入如下指令:

Java_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"

Servlet和Filter使用的匹配模式都是一样的,但是前者按照语法优先级(精确>路径>扩展>缺省[2])匹配一个即停止,而后者按照Filter添加顺序优先级依次处理,这里特别注意匹配并不是通配,没有*就是精确匹配,有一个/*在末尾才是路径匹配!这在过滤器中尤为关键,如不确定请手动尝试每条路有防止漏掉。

参考:

[0] Some notes about Resin web application server -- Manh Phan (2019)

[1] tomcat 核心架构解析 -- heibaiying (2020)

[2] web.xml文件中servlet的url-pattern匹配规则 -- 码——皇 (2019)

其他

  1. 小众服务器优先研究它的目录遍历(IOT等设备)
  2. 在存在PHP-FPM时,可考虑通过它进行RCE (条件苛刻,需有socket型的SSRF)