分享一些关于SQL Injection的基础知识,如有错误,欢迎大家指出。注入技术是一种非常常见的web入侵技术,这里仅说明注入的理论基础。
何谓注入点?注入点是指一个web页面有提交数据查询的接口,并且该用户接口没有经过严格的非法字符过滤,黑客就可以通过构造精心语句提交,达到查询服务器数据库的目的。
如何注入?以java搭建的图书馆网站为例(非ajax数据提交方式),用户索引一本书,输入isbn号之类的东东,后台程序,无论是jsp还是servlet,都会有类似的代码:
String key = request.getParameters("xxx");
String sql = “select * from books where isbn like '"+key+"'";
resultSet = statement.executeQuery(sql);
key是用户输入的字符串用于查询,当用户输入的就是一个isbn号的话,那么服务器就会检索数据库并返回结果,但如果服务器未对输入框做非法字符过滤,那么用户就可以输入一串精心构造的字符用于查询他想知道的服务器敏感信息。
比如用户输入isbn-900232‘ union select usr, pwd from admin where usr='root
因为key两边都有一个单引号,我们输入的就是key的值,当我们输入上面类似的语句时,整个sql的值就会变成
select * from books where isbn like 'isbn-900232' union select usr,pwd from admin where usr='root'
这样无论前台显示与否,后台实际上都已经执行了这句sql语句。数据库的表名可能并不是admin,列名也可能并不是usr,pwd,这些都需要自己来分析猜测,但如果没有字符过滤,服务器就很危险了,极有可能暴露管理员登陆密码之类的信息。如果只是想单纯的破坏,那么还有可能直接构造删除表的语句。
刚才说到前台可能不会显示查询结果的问题,这是因为后台会根据resultSet查询到数据的列数来构造前台显示的列表宽度,如果union查询两次查询返回的数据项不是一样的多,那么程序就会报异常,不会显示数据,所以还需要动脑筋,构造的union从句查询的数据和主句查询的项一样多。比如主句是select *,正常情况返回有书名,作者,isbn号,地点,是否借出一共5项,那么构造的union从句查询也需要5项,而不仅仅是usr和pwd这两项。
好啦,以上就是一些关于SQL Injection的基础知识,在实践中应用还需要更多的知识和技巧,希望本文起到一个抛砖引玉的作用,大家多多讨论,共同进步,让社区更加活跃。