SQL查询由一条或多条SQL语句构成,这些语句是数据库服务器能够有效执行的指令。操作数据库或执行SQL注入时最长碰到的SQL语句是SELECT,INSERT,UPDATE,CRATE,UNION SELECT和DELETE. 1.SELECT语句
SQL命令以分号“;”结束执行,不区分大小写
。
SELECT * FROM tblUsers; 返回tbusers表中的所有数据。星号(*)是个通配符,它指示数据库服务器返回所有数据。
SELECT username FROM tblUsers; 返回tbusers表中所有行为username的列:
SELECT * FROM tblUsers WHERE username = 'admin' AND password = 'letmein'; 返回所有username列的值为admin且password列的值为letmein的行。
SELECT * INTO hackerTable FROM tblUsers; 复制tblusers的所有数据到hackerTable上
2.UNION运算符 可以使用UNION运算符来合并两条或多条SELECT语句的结果集。参与UNION运算的所有SELECT语句必须返回相同的列数,并且对应列的数据类型必须相互兼容。
查询分别来自tblUsers表和tblAdmins表的username列和password列合并到一起:
SELECT username,password FROM tblUsers UNION SELECT username,password FROM tblAdmins;
UNION SELECT 会自动比较每条SELECT返回的值并只返回不重复的值。全部返回:
SELECT username,password FROM tblUsers UNION ALL SELECT username,password FROM tblAdmins;
3.INSERT语句
INSERT INTO tblUsers VALUES(1,'Jhon Smith',3); 向tblUsers表中插入数据(1,’John Smith‘,3)
INSERT INTO tblUsers(id,username,password) VALUES(1,'Jhon Smith',3); 定向列插入数据。有效防止数值插入错误列中。
4.UPDATE语句
UPDATE用于修改数据库表中已经存在的数据。
update shoppinglist3 set wupin=0 where goods=2; 修改shoppinglist3表中goods列值是2的wupin列值为0.
注:UPDATE语句都应包含一个WHERE子句,应指出应该更新哪些行。如果省略了WHERE子句,那么所有行都会受到影响。
5.DELETE语句
DELETE语句用于从表中删除行。
DELETE shoppinglist3 WHERE goods = 2; 删除shopping list3表中goods为2的行。
注:DELETE语句后都应包含WHERE子句,应指出删除哪些行。如果省略where语句,那么所有行都会被删除。
Tips:
危险的SQL注入
检测SQL注入漏洞最常见的一种方法是插入条件子句并观察应用行为中的差异。
SELECT story FROM news WHERE id=19
SELECT story FROM news WHERE id=19 OR 1=1
SELECT story FROM news WHERE id=19 OR 1=2
经过修改的第二条查询返回数据库中所有的story列,因为1始终等于1.
从攻击的角度来看,易受攻击的应用会针对修改后的查询做出不同的响应,这表明存在SQL注入漏洞。
6.DROP语句 DROP语句用于删除数据库对象,比如表、视图、索引。
DROP TABLE shoppinglist2; 删除shoppinglist2表
7.CREATE TABLE语句
CREATE TABLE shoppinglist(item int,name varchar(100)); 创建一个shoppinglist表,包含(item,name)两个列。
CREATE TABLE shoppinglist2 as SELECT * FROM orders; 创建一个表由orders表填充
8.ALTER TABLE语句 ALTER TABLE语句用于添加、删除、修改现有表格中的列。
alter table shoppinglist2 add tips varchar(100); 向shoppinglist2表添加tips列
alter table shoppinglist2 drop column tips; 删除shoppinglist2表中tips列
alter table shoppinglist2 alter column cost varchar(50); 修改cost列数据类型(未实现,不清楚原因?)
9.GROUP BY语句
SELECT CUSTOMER,SUM(COST) FROM ORDERS WHERE CUSTOMER='A' GROUP BY CUSTOMER; 对customer A的所有消费求和。
10.ORDER BY 子句 ORDER BY 子句用于对SELECT 语句的查询结果按特定列进行排序,它接受一个列名或数字做强制参数。添加ASC或DESC关键字将结果分别按升序或降序排列。
SELECT product FROM shoppinglist2 ORDER BY ASC;对product列进行升序排列
11.限制结果集 执行SQL注入攻击时,通常需要限制注入查询(例如,通过错误信息提取数据)返回的行数。 各数据库平台略有不同,以MySQL为例。
SELECT * FROM shoppinglist LIMIT 1,1;选择第一行
SELECT * FROM shoppinglist LIMIT 5,1;选择第五行