| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -24,7 +24,7 @@ https://github.com/cn-panda/JavaCodeAudit | |||
| 24 | 24 | ||
| 25 | 25 | 导入项目,可以得到以下目录: | |
| 26 | 26 | ||
| 27 | -  | ||
| 27 | +  | ||
| 28 | 28 | ||
| 29 | 29 | 项目是一个简单调用类方法去执行相关操作的实现。在 servlet 层接受到请求后,调用 rceTest中的CommandFound函数,该函数接受三个参数:command、method、str,command 为要执行的命令类,method 为要执行的方法,str 为要执行的内容。 | |
| 30 | 30 | ||
@@ -60,11 +60,11 @@ RCE 出现的场景比较多,如: | |||
| 60 | 60 | ||
| 61 | 61 | 拿上述项目举例,首先看看项目的具体实现: | |
| 62 | 62 | ||
| 63 | -  | ||
| 63 | +  | ||
| 64 | 64 | ||
| 65 | 65 | command 为请求的类,method 为请求类的方法,str 为请求类的参数,服务端接收这三个参数后执行 method 的具体方法,如上图所示,首先找到 `com.sec.pojo.Command`类,然后找到该类中的`AddCommand`方法,最后根据这个方法的需要,传入指定的参数`[add]`。 | |
| 66 | 66 | ||
| 67 | - <img src="/Users/panda/Library/Application Support/typora-user-images/image-20200612103803571.png" alt="image-20200612103803571" style="zoom:50%;" /> | ||
| 67 | +  | ||
| 68 | 68 | ||
| 69 | 69 | 项目的实现内容很简单,就是接收参数-->执行操作,下面我们来看这是怎么实现的。在`recTest.java`中,存在如下代码: | |
| 70 | 70 | ||
@@ -102,7 +102,7 @@ public void CommandFound(HttpServletRequest req, HttpServletResponse resp) throw | |||
| 102 | 102 | ||
| 103 | 103 | 有心的朋友可能发现了,上述代码中没有出现任何一个可执行函数(如exec()、system()等),但是却存在 RCE 漏洞。如下图所示: | |
| 104 | 104 | ||
| 105 | -  | ||
| 105 | +  | ||
| 106 | 106 | ||
| 107 | 107 | 可以发现,由于代码对于我们传入的类、传入类的方法、传入类的参数没有做任何限制,从而导致了 RCE 漏洞,这也是RCE 漏洞可能出现场景中的第二项。 | |
| 108 | 108 | ||
@@ -130,17 +130,11 @@ CVE 地址:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-1871 | |||
| 130 | 130 | ||
| 131 | 131 | 值得注意的是,在这个漏洞的CVE 介绍中提到:”仅当未正确配置Java安全管理器时,这才是漏洞。“但其实这个漏洞有两个不同的点,如下图,当我们在Metasploit中搜索 cve-2010-1871时: | |
| 132 | 132 | ||
| 133 | -  | ||
| 133 | +  | ||
| 134 | 134 | ||
| 135 | 135 | 存在两个exploit,首先看第一个`auxiliary/admin/http/jboss_seam_exec`的配置 | |
| 136 | 136 | ||
| 137 | -  | ||
| 138 | - | ||
| 139 | - 可以看到其实这个exploit 利用的点在`/seam-booking/home.seam` | ||
| 140 | - | ||
| 141 | - 而`exploit/multi/http/jboss_seam_upload_exec`的配置: | ||
| 142 | - | ||
| 143 | -  | ||
| 137 | +  | ||
| 144 | 138 | ||
| 145 | 139 | 这个 exploit 利用点在`/admin-console.login.seam`,当配置了java安全管理器后,该漏洞利用不成功。 | |
| 146 | 140 | ||
@@ -214,7 +208,7 @@ export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar | |||
| 214 | 208 | * 解压`JBoss-seam 2.2.0.CR1.zip` | |
| 215 | 209 | * 将解压后的文件放在jboss 目录下,如下图所示: | |
| 216 | 210 | ||
| 217 | -  | ||
| 211 | +  | ||
| 218 | 212 | ||
| 219 | 213 | * 进入`/jboss-seam`目录,编辑`build.properties`文件,在文件尾行加入以下代码: | |
| 220 | 214 | ||
@@ -225,25 +219,17 @@ jboss.home /home/panda/www/jboss | |||
| 225 | 219 | ||
| 226 | 220 | * 进入`jboss-seam/examples/booking`目录,然后执行安装命令:`ant deploy`,程序会自动安装,如下图所示: | |
| 227 | 221 | ||
| 228 | - <img src="/Users/panda/Library/Application Support/typora-user-images/image-20200629111620575.png" alt="image-20200629111620575" style="zoom:50%;" /> | ||
| 222 | +  | ||
| 229 | 223 | ||
| 230 | 224 | 安装完毕后在进入jboss 安装的根目录下的`bin`文件,执行`./run.sh`命令,如下图所示: | |
| 231 | 225 | ||
| 232 | -  | ||
| 226 | +  | ||
| 233 | 227 | ||
| 234 | 228 | 安装完毕后,在本机环境即可打开该站点,如下图所示: | |
| 235 | 229 | ||
| 236 | -  | ||
| 237 | - | ||
| 238 | -  | ||
| 239 | - | ||
| 240 | - ####3、案例漏洞分析 | ||
| 241 | - | ||
| 242 | - 本案例漏洞的原因是因为JBoss EL表达式解析的问题导致了表达式注入。漏洞文件为:`jboss-seam/examples/booking/exploded-archives/jboss-seam-booking.ear/jboss-seam.jar` | ||
| 243 | - | ||
| 244 | - 反编译后可以得到源码,目录如下: | ||
| 230 | +  | ||
| 245 | 231 | ||
| 246 | -  | ||
| 232 | +  | ||
| 247 | 233 | ||
| 248 | 234 | 在本目录下的/navigation/Pages.java 文件是漏洞的入口,关键代码如下: | |
| 249 | 235 | ||
@@ -326,7 +312,7 @@ private static boolean isOutcomeViewId(String outcome) { | |||
| 326 | 312 | ||
| 327 | 313 | 整个漏洞流程如下图所示: | |
| 328 | 314 | ||
| 329 | -  | ||
| 315 | +  | ||
| 330 | 316 | ||
| 331 | 317 | 漏洞的逻辑线上面介绍的比较清楚了,下面的关键是如何构建我们想要的 JBoss EL 表达式。JBoss EL 表达式是在 Java EL 表达式基础上的增强。比如说我们想进行参数绑定,那么可以: | |
| 332 | 318 | ||
@@ -399,7 +385,7 @@ expressions.getClass().forName('java.lang.Runtime').getDeclaredMethod('getRuntim | |||
| 399 | 385 | ||
| 400 | 386 | 执行效果如下: | |
| 401 | 387 | ||
| 402 | -  | ||
| 388 | +  | ||
| 403 | 389 | ||
| 404 | 390 | 网上也有其他形式的 payload,首先使用`getDeclaredMethods()`得到所有方法,然后采用数组的形式调用指定方法。 | |
| 405 | 391 | ||
@@ -409,7 +395,7 @@ expressions.getClass().forName('java.lang.Runtime').getDeclaredMethod('getRuntim | |||
| 409 | 395 | /seam-booking/home.seam?actionOutcome=/test.xhtml?xxx=%23{expressions.getClass().forName('java.lang.Runtime').getDeclaredMethods()[0]} | |
| 410 | 396 | ``` | |
| 411 | 397 | ||
| 412 | -  | ||
| 398 | +  | ||
| 413 | 399 | ||
| 414 | 400 | 返回的是: | |
| 415 | 401 | ||
@@ -434,7 +420,7 @@ untime').getDeclaredMethods()[6].invoke(null), 'gnome-calculator')} | |||
| 434 | 420 | ||
| 435 | 421 | 执行效果: | |
| 436 | 422 | ||
| 437 | -  | ||
| 423 | +  | ||
| 438 | 424 | ||
| 439 | 425 | ||
| 440 | 426 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments