本文使用的数据库为hijack89
该数据库中存在名为user
的表
表中存在id
、username
、password
三个列
具体数据内容如下:
注意:该数据表第一条数据项为id为2,username为user02,password为pass02的数据项
select是基本的查询语句,用于从数据库中查找匹配条件的数据项;
常用语法如下:
select [列名称] from [表名称] (where 条件句)
select * from [表名称] (where 条件句)
select原理:
分析器先找到关键字SELECT,然后跳到FROM关键字将所查的表导入内存,并通过指针p1找到表中第一条数据项,接着找到WHERE关键字,根据当前数据项计算它的条件表达式,如果为真那么执行select语句,并把执行结果插入到新建的虚表中,p1再指向下一条记录;如果为假那么p1直接指向下一条数据项,而不进行其它操作。一直检索完整个表,并把虚表返回给用户。
即:select语句是根据条件对比数据表中的每一条数据项,每当遇到一个条件为真时的数据项,就执行一次select后面紧跟的语句。
为什么条件为真时说是执行select语句,而不是将该条数据项插入到虚表中?
因为select
后面不仅可以跟列名称
或者通配符*
,还可以跟函数
。
concat()
是连接字符的函数,0x21、0x3a
分别是!、:
的16进制表示
思考,为什么该语句返回结果会有10条?
order by
语句用于根据指定的列对结果集进行排序。默认按照升序对记录进行排序。
常用语法如下:
order by [列名称]
order by [第几列]
常见作用:
该语句在SQL注入中常用于测试当前数据表的列数。当数据表只存在3列时,order by 1/2/3
将正常返回结果,但当order by 4
时将报错,因为数据表中没有第4列,即可得知该表存在3列。
limit
是用于限定返回结果的数量
常用语法如下:
limit [偏移量],[数量]
偏移量也是从0开始(和c语言数组是一个道理),数量是选取多少个数据项。
常见作用:
当某些页面只能回显特定个数的数据时,可以用limit进行限制。
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
常用语法如下:
select id from user where id=1 union select username from user where id=3
请注意,列也必须拥有相似(兼容的)的数据类型。UNION 内部的 SELECT 语句必须拥有相同数量的列,否则会报错。
常见作用:
union不仅可以用来联合查询数据,还可以用来确定数据表列数。
此处注意与order by
有什么不同。
and
和 or
可在 WHERE 子语句中把两个或多个条件结合起来,且前者优先级高于后者优先级。
常见语法:
where [条件1] and [条件2] 条件1和条件2都为真时,该条件才为真
where [条件1] or [条件2] 条件1和条件2有一个为真时,该条件为真
常见作用:
可以利用and
和or
进行是否存在注入点的判断,还可以构造万能密码(永真条件),文章《浅析SQL注入(一)》中有提到。
insert into 语句用于插入指定数据项
常见语法:
INSERT INTO 表名称 VALUES (值1, 值2,....)
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
update 语句用于修改表中的数据。
常见语法:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 旧值
DELETE 语句用于删除表中的行。
常见语法:
DELETE FROM 表名称 WHERE 列名称 = 某值
SQL语法是进行SQL注入攻击的基础,还需平时的学习和积累。