学习笔记-SQL注入(数据库基础)
SQL语法基础
用于与关系型数据库交互的标准SQL命令有
CREATE(创建数据库),SELECT(查),INSERT(增),UPDATE(改),DELETE(删),DROP(删除表)
数据控制:Grant(给用户赋予某张表的权限)Revoke(收回赋予用户的特权)
注意:SQL命令对大小写不敏感;所有命令基本都以分号结束;
例如:
create table result (id int(10),name varchar(20),city varchar(20),score int(10) ; //表名:result,四个字段:id,name,city,score 并且指定了数据类型。
insert into result(id,name,city,score) values(1,'zhao','xian','99'); //注意:如果是字符串需要用单引号包裹起来
delete from result where id=1; //删除操作
update result set score=100 where id=1; //修改数据
SQL高级操作:排序,分组,限定条件
排序 order by
SELECT*FROM result ORDER BY score; //升序:默认由低到高排序;字符串由字母表来排序; SELECT*FROM result ORDER BY score desc; //降序 select*from result order by 1 //第一列排序(id) 注意:order by 当后面跟着的数字超出字段数时,就会报错。通过这个可以确定字段数!
分组 group by(group by 是先排序后分组;必须有sum(),count(),avg()配合使用)
select city,sum(score) from result group by city; //查询不同城市考试成绩之和
限定条数 limit
SELECT*FROM result limit 0,1; //从0行开始,顺序向下显示1行 SELECT*FROM result limit 2,2; //从2行开始,顺序向下显示2行 SELECT*FROM result limit 3; //返回前三行 //注意:id=1行为第0行
联合查询 union select(也可以结合exists()函数猜表名 and exists(select*...))
SELECT id,city from result UNION SELECT name,score from result; //假如已知字段名,不知字段值,可以将字段名放到已知可以显示字段值的字段名下,就可以将字段值打印出来 //id,city 为可以显示字段值的字段名;name,score为只知字段名不知字段值 注意:字段名数量一定要相等
结合其他函数
union select 结合系统函数暴露库信息(MySQL5.5以上版本自带information_schema数据库,里面保存着其他所有的数据库信息)
select schema_name from information_schema.schemata; //所有数据库的库名 select table_name from information_schema.tables where table_schema='student'; //student中的表名 select column_name from information_schema.columns where table_schema='student' and table_name='result'; //查询student数据库中result表内的字段名
结合load_file()读取服务器文件内容
注意:文件位置要在服务器上,必须为文件路径全名,MySQL配置文件中,secure_file_priv不能为NULL
文件必须可读,文件容量必须小于max_allowed_packet字节(服务器的默认max_allowed_packet值为1MB)
select id,name,city from result union select score,losd_file('...'),1 from result;