前言
某天在互联网平台上看待DWR路由的文章,然后去搜索了一下相关的信息,发现该DWR路由技术挺久远的,因此就简单的学习了一下该路由,然后发现该DWR路由也可能存在漏洞点,因此找了某站进行测试看看是否有无啥收获,结果不负众望,还是有那么一点收获。真就那么一点[哭]。话不多说,进入正题吧。
DWR介绍
首先讲解渗透之前先说一下什么是DWR路由吧,该怎么进行利用,或者说我们执行的数据格式有无区别啥的,那么我既然说了这事儿,那肯定是该路由区别于其它路由或者说和其它的请求方式不一样,因此我们先说一下DWR路由。
DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。
主要具体实现就是要使用dwr需要进行简单的配置,主要是web.xml和dwr.xml这两个配置文件。首先是web.xml,最简单的只需要配置dwr对应的servlet映射即可:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
其中dwr存在debug属性,当设置为true时可以启用debug模式,可访问dwr的测试页面:
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
当我们添加上述配置项访问/dwr/index.html
路径则可能会导致类测试地址泄漏的问题
接口地址的获取可能会暴露用户的敏感信息,还可导致文件上传,SQL注入.....
那么我们主要还是看如下数据包,请求路径为dwrtest.findByUserId.dwr,其实该路径可任意填写,主要还是c0-scriptName
和c0-methodName
以及c0-param0
字段,分别对应脚本名和方法名以及方法中对应的参数值及参数类型是否为number或者string,后面讲解案例大家应该能更深一步理解
POST /DwrProject/dwr/call/plaincall/dwrtest.findByUserId.dwr HTTP/1.1
Host: ip:port
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:62.0) Gecko/20100101 Firefox/62.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: text/plain
Content-Length: 227
Cookie: JSESSIONID=F0DE72C197AFEF273E84AC3686F4F8C7; DWRSESSIONID=7viforTWTj$BVBJSxv99$V*hVgn
Connection: close
callCount=1
windowName=
c0-scriptName=dwrtest
c0-methodName=findByUserId
c0-id=0
c0-param0=number:1
batchId=1
instanceId=0
page=%2FDwrProject%2Fdwr%2Ftest%2Fdwrtest
scriptSessionId=7viforTWTj$BVBJSxv99$V*hVgn/*YsBVgn-XOm0BUHfr
测试流程
首先我们需要查找关于使用DWR路由的网站,那么我们这里可以使用资产测绘平台来批量搜索,或者找一些比较老的网站快捷键F12查看前端源代码是否存在以dwr结尾的路由文件,如果有,那么这就是了,如下图所示:
当我们找到这种网站的时候我们根据上述DWR路由介绍所说的可以发现个别路由存在参数的,因此这就是我们的首要目标,当然也不是说其它的路由无参数量就没有其它用处了,据互联网上某大佬的文章可以发现访问无参数路由直接泄露敏感信息,发现smtp配置信息
我们发现那么多的接口其实这里并没有啥技巧,就是一个一个进行访问。根据前端泄露的路径一共存在如下几个,且内容都不一样
但是通过上述访问会发现路由无回显或者直接报错提示,这种情况推测可能有两种情况,一种是路由授权禁止访间,一种是参数不正确,或者参数值类型不正确,本人更倾向于第二种情况,但是奈何本人实力有限,根本无法爆出参数类型,其实根据路由所示也可发现许多接口参数值太多,fuzz其实挺难搞得。
到这里其实基本宣布告别逻辑漏洞,比如用户密码修改,用户密码重置,用户凭证获取啥的。。但是功夫不负有心人啊,根据路由命名格式推测接口漏洞产生的概率大小,发现有多个路由接口泄露数据库表列信息以及数据库语句信息
这里需要注意请求路径为任意即可,这里没有限制你的请求路径是否为指定名称
POST /dwr/xxx/dwrtest.findByUserId.dwr HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:62.0) Gecko/20100101 Firefox/62.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: text/plain
Content-Length: 352
Cookie: JSESSIONID=F0DE72C197AFEF273E84AC3686F4F8C7; DWRSESSIONID=7viforTWTj$BVBJSxv99$V*hVgn
Connection: close
callCount=1
windowName=
c0-scriptName=GlobalController
c0-methodName=getUnApprovedUnitItemResourceListById
c0-param0=string:88888
c0-param1=string:77777
c0-param2=string:666666
c0-param3=string:1999999
c0-id=0
batchId=1
instanceId=0
page=%2FDwrProject%2Fdwr%2Ftest%2Fdwrtest
scriptSessionId=7viforTWTj$BVBJSxv99$V*hVgn/*YsBVgn-XOm0BUHfr
POST /dwr/xxx/dwrtest.findByUserId.dwr HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:62.0) Gecko/20100101 Firefox/62.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: text/plain
Content-Length: 290
Cookie: JSESSIONID=F0DE72C197AFEF273E84AC3686F4F8C7; DWRSESSIONID=7viforTWTj$BVBJSxv99$V*hVgn
Connection: close
callCount=1
windowName=
c0-scriptName=GlobalController
c0-methodName=getApprovedUnitItemResourceCountById
c0-param0=resource_module_id:1122222
c0-id=0
batchId=1
instanceId=0
page=%2FDwrProject%2Fdwr%2Ftest%2Fdwrtest
scriptSessionId=7viforTWTj$BVBJSxv99$V*hVgn/*YsBVgn-XOm0BUHfr
总结
最后也是到这里就差不多结束了,因为该网站属于咱们国内知名企业且存在SRC平台,其实参数注入的时候发现我们输入的参数其实被代到了数据库中进行查询,只是查询错误回显整个SQL语句,我猜测是可以进行构造SQL语句从而进行SQL注入的但是存在WAF,所以只要有敏感参数就拦截了,最后也是当个信息泄露交了给了20元子,只有安慰自己还有点收获