接口设计动态sql的一些思考

2024-02-06 23:42:47 浏览数 (1)

前言

这个章节主要是在讲日常我们在进行一个SQL拼写的时候,需要注意的一些点有可能导致一个SQL注入。尤其是一些对表格进行排序的一些动态操作。因为之前没有想到一些好的方式,所以就进行了一个SQL属性传参数的编写。可以做到动态SQL对接口参数很友好,但是对安全性不友好。

发现问题

拿一段之前的排序的代码,但我之前发现老感觉哪里有问题,那么就以这段代码为依据,进行注入测试,

代码语言:javascript复制
if (StringUtils.isNotEmpty(order) && StringUtils.isNotEmpty(sort)) {
    sql.append(" ORDER BY ").append(order).append(" ").append(sort);
} else {
    sql.append(" ORDER BYid ");
}

SQL

这是一种非常常见的对结果进行一个排序的SQL。我们运用一个注入进行一个自查询的操作。这个时候从某种程度上已经已经体现了注入的逻辑。

对参数进行传参create_time; SELECT pg_sleep(15),拼接后的SQL如下所示,从结果来看,某种程度上来说,已经代表注入成功了。因为从执行逻辑日志来看执行了10多秒。

代码语言:javascript复制
// 原始的sql
SELECT * FROM table  ORDER BY ?

//注入后的sql
SELECT * FROM table  ORDER BY create_time;  SELECT pg_sleep(15)

猜想

在这里我猜想的是,如果我注入的时候,我拼接了一段Delete的语句,那是不是基本上可以完成达到或注入的一个目的?

delete from test_task

代码

虽然从代码层面上来说,它会提示异常报错。是他真真正正执行了15秒。对数据库而言还是非常危险的,相当于我把一些可配置的SQL暴露出来了。

查询传回多个 ResultSet

代码语言:javascript复制
2024-02-06 15:43:19.030 []  INFO ${sys:PID} --- [           main] c.t.o.p.c.DAO                            : Exception: Sql error:

org.postgresql.util.PSQLException: 查询传回多个 ResultSet。
	at org.postgresql.jdbc.PgStatement.getSingleResultSet(PgStatement.java:255) ~[postgresql-42.3.6.jar:42.3.6]
	at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:123) ~[postgresql-42.3.6.jar:42.3.6]
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-4.0.3.jar:?]

从代码的日志上面来看。确实执行了有十多秒。注入已经算是实现了。

再次测试

后面我又发现了一个排序的SQL。但是这个SQL只针对了属性名做了一个注入。虽然说这次注入不是很成功,因为我本身也不是,做攻击的老手,所以抛出这个问题,希望哪位大佬看到了可以解释一下如何去注入。

代码语言:javascript复制
select * from test_task order by  ?  desc

进行注入

这是一段我进行一个注入的片段。看过网上的一些介绍有一些人做了一些子查询,然后再进行一个临时表的一个封装。可以进行一个union但这还需要前面部分SQL的支持,所以今天只是简单举一个这个方向的例子吧。

id desc union select * from test_task where id=-1 order by id

一开始我打算去用多表关联的方式。然后再用union统一结果集这样的话,查到的结果的话,我始终是一个结果集。因为如果分号分隔的方式,它还是会返回多个结果集。执行产生了一个异常达不到我要的效果,再者的话就是这个后缀DES它影响了我后续的一个注入,所以这是一个麻烦的问题。

总结

这种写法如果对传入的SQL进行严格的限制。还是可以起到一定的规避作用,因为本身如果对属性进行一个排序的话,对正序倒序的属性进行一个写死操作。注入也是比较难的,你不能说他全部错误,但是站在我的角度,我还是认为他比较怪怪的,我不太喜欢,因为会导致SQL异常,错误全到DB了。

最后

点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞