基于HPP参数污染的Web服务器指纹识别技术
0x00 关于本文
关于web服务器指纹识别的技术,已经有十万甚至九万个文章描述,十万甚至九万个工具实现。但目前来看,本文或许是首先提出基于HPP参数污染技术来识别web服务器指纹的。
通过HPP参数污染技术来探测服务器的指纹可以有非常高的准确率,此方法通过不依赖可以随意删除的特征关键字(比如服务器返回头),不会被啊D那样能够把IIS伪装成Apache2这样的伎俩欺骗。但是缺点是只能够识别Web服务器中间件类型,无法识别CMS,并且自动化有一定困难(为自己的懒惰找借口)
0x01 HPP是什么以及为什么HPP可以用来识别Web服务器指纹
HPP全称HTTP Parameter pollution,就是HTTP参数污染。简单来说就是提供多个同名的参数给服务器,比如说一般提交的是?id=1你提交一个?id=1&id=2。由于HTTP标准并没有写明该怎么办,各个不同的服务器/中间件会有不同的处理方式,而通过观察他们的处理方式的差异即可判断服务器类型
比如对于网站http://example.com/?color=red&color=blue,不同的服务器认为自己收到的参数如下
Web Application Server Backend | Parsing Result | Example |
ASP.NET / IIS | All occurrences concatenated with a comma | color=red,blue |
ASP / IIS | All occurrences concatenated with a comma | color=red,blue |
PHP / Apache | Last occurrence only | color=blue |
PHP / Zeus | Last occurrence only | color=blue |
JSP, Servlet / Apache Tomcat | First occurrence only | color=red |
JSP, Servlet / Oracle Application Server 10g | First occurrence only | color=red |
JSP, Servlet / Jetty | First occurrence only | color=red |
IBM Lotus Domino | Last occurrence only | color=blue |
IBM HTTP Server | First occurrence only | color=red |
mod_perl, libapreq2 / Apache | First occurrence only | color=red |
Perl CGI / Apache | First occurrence only | color=red |
mod_wsgi (Python) / Apache | First occurrence only | color=red |
Python / Zope | All occurrences in List data type | color=['red','blue'] |
0x02对于常见情形的的识别
上表的类型太全面了,我们一般只需要覆盖几个常用的就可以了,因此整理出如下粗略的判断方式
不过这个判断较为粗糙,而且还有种种因素造成的误差导致想要实现一个完美的判断工具的工作量远大于手动判断,在实际操作的时候建议手动判断
0x03手动判断
手动判断则更为灵活,现拿██带学的██研究院官网开刀
发现存在搜索功能,从搜索功能处下手,因为服务器一般会打出搜索字符串,如下图我搜索了nmsl发现结果被打出来了
接着再参数污染一个1234
发现都被服务器接收了,类似于iis的情形,但是按理来说用来分割的逗号没有了(经过测试可知逗号被过滤了)
接着进行最后一项测试,在keyword参数前面加一个&符号
0x04工具实现
本人实现了一个很粗糙的工具,代码过于丑陋不予开源,看个图吧
结果返回正常,排除ASP,识别结果ASP.NET
大哥码漏了
回复删除