前言
这个章节主要是在讲日常我们在进行一个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多秒。
// 原始的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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!