常见sql注入手法总结与技巧(一)
前言
SQL 是 Structured Query Language 的缩写,中文译为“结构化查询语言”。SQL 是一种计算机语言,用来存储、检索和修改关系型数据库中存储的数据。
sql注入是最为常见也是破坏力很大的漏洞,它是因为开发在开发时没有对用户的输入行为进行判断和过滤,使得用户输入了恶意语句后传给了后端数据库进行相应的动作(如增删改查甚至写后门)。
**根本产生原因:**后端服务器接收传来的参数未经过严格过滤判断而直接进入数据库查询
所以在学习SQL注入前需要了解SQL基础语法
SQL注入根源分析
如果后台sql语句为:
$sql="SELECT * FROM users WHERE id=' $id ' LIMIT 0,1";
如果我们传入id=1’ 那么如果后端没有经过过滤而是直接把我们传入的参数带进sql语句中,那么sql语句就会变成:
$sql="SELECT * FROM users WHERE id='1'' LIMIT 0,1";
我们传入的 ’ 就会一块带入和前面的单引号进行闭合,导致原来后面的单引号就多余,而sql语句引号是必须成对出现的就会报错什么都查不出来,但如果我们在1’后面加入恶意语句并且把后面的原来的语句进行注解,就会造成sql语句会执行我们传入的恶意语句,实现注入。
id = -1' union select database() #
$sql="SELECT * FROM users WHERE id='-1' union select database() #' LIMIT 0,1";
-1表示查询一个不存在的id,是为了不影响后面我们的注入语句
#,–+,-- 表示注释,把后面所有语句注释掉,这样就不会影响我们的注入语句
sql参数类型分类
SQL注入按照参数类型分类可分为两种:数字型和字符型
- 数字型:select * from table where id=2
- 字符型:select * from table where id=‘2’
区别在于数字型不需要单引号进行闭合,而字符型一般需要通过单引号闭合。
判断类型方法:
构造payload为:id=1 order by 9999 --+
如果正确返回页面,则为字符型;否则,为数字型
构造payload为:1 and 1=2
如果正确返回页面,则为字符型;否则,为数字型
常见sql注入手法
这里先给出常用的payload,后面会使用到
select database()