0x01 漏洞描述
当应用程序将用户输入的内容,拼接到SQL语句中,一起提交给数据库执行时,就会产生SQL注入威胁。攻击者通过控制部分SQL语句,可以查询数据库中任何需要的数据,利用数据库的一些特性,甚至可以直接获取数据库服务器的系统权限。
简单来说就是用户输入的内容拼接到SQL语句中,当前数据库权限为低权限时可以进行查数据,为高权限时可以根据数据库特点写文件、执行命令获取数据库服务器权限等。
0x02 审计要点
当判断代码中是否存在SQL注入漏洞时,可从以下4点进行判断:
1、参数是否用户可控?如参数的来源是来自于用户输入的http请求,某功能点为检索功能,检索的关键字需要用户自行输入等。
2、是否使用了预编译?预编译是指在将数据传入SQL语句前明确指定传输数据的类型,以执行必要的转换。
在Java中预编译的调用方式为prepareStatement。
3、是否存在SQL语句拼接?尤其注意某些特殊的查询难免用到SQL语句拼接,遇到这种情况,就需要检查拼接是否有可能导致注入。
4、是否存在全局参数过滤器?检查过滤器的配置,是否所有的SQL查询请求都经过过滤器处理,过滤器的过滤规则是否符合安全要求。
0x03 典型漏洞代码
SQL语句直接进行动态拼接
1)设置好驱动器启动,加载数据库驱动
2)进行数据库连接
3)通过request.getParameter("id")获取传入的id值
4)通过"SELECT * FROM "IWEBSEC"."user" WHERE "id"="+id进行SQL语句拼接并执行
在上述步骤中和代码中可以发现传入id的参数值是可控的存在SQL注入攻击的风险。
0x04 SQL注入攻击防御
prepareStatement为SQL预编译方法,会预处理SQL语句,SQL语句可具有一个或者多个IN参数。IN参数的值在SQL语句预编译时没有被指定,而是为每个IN参数保留了一个?作为占位符。每个?的值必须在该语句执行之前通过适当的方法来提供。
具体步骤:
1、注册驱动
2、获取链接
3、实例化prepareStatement对象
4、设置占位符为id变量
5、执行
代码样例:
原文始发于微信公众号(反入侵实验室):0基础入门代码审计-3 sql注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论