前言:
今天给大家聊一聊SQL注入,SQL注入是我们学习渗透很重要的一个模块。这部分也不是很难,跟着文章学习很快就会掌握。
正文:
数据库(database): 是用来组织、存储和管理数据的仓库。
常见的数据库及分类:
数据库分为两种:关系型数据库和非关系型数据库。
- 关系型数据库包括:Oracle、MySQL、SQL Server、DB2、Microsoft Access;
- 非关系型数据库包括:Redis、MongoDB、Hbase;
SQL是一种基于ANSI标准的结构化查询语言,其英文全称是Structured Query Language,可用于存取数据,以及查询、更新和管理关系数据库系统。
SOL分为两个部分:数据操作语言(DML) 和数据定义语言(DDL)。
- 数据操作语言用于查询和更新数据;
- 数据定义语言用于创建、修改和删除数据库内的数据结构。
SOL语句及其说明如下表所示。
数据操作语言(DML):
指令 | 说明 |
---|---|
SELECT | 从数据库表中获取数据 |
UPDATE | 更新数据库表中的数据 |
DELETE | 从数据库表中删除数据 |
INSERT INTO | 向数据库表中插入数据 |
数据定义语言(DDL):
DDL指令 | 说明 |
---|---|
CREATE DATABASE | 创建新数据库 |
ALTER DATABASE | 修改数据库 |
CREATE TABLE | 创建新表 |
ALTER TABLE | 变更数据库表 |
DROP TABLE | 删除表 |
CREATE INDEX | 创建索引 |
DROP INDEX | 删除索引 |
SQL语法:
查询语句:
--表名:choices 课程编号:cid 课程名称:cname 学号:sid 分数:score
--1.全表查询
--例1:查询所有课程信息
SELECT *
FROM courses;
--2.筛选
--例2:查询java课程的课程编号
SELECT cid
FROM courses
WHERE cname='java';
--3.排序
--例3:查询选课信息,并按课程编号升序显示
SELECT *
FROM choices
ORDER BY cid;
--4.分组
--例4:查询学生学号及该生的平均成绩。
SELECT sid 学号,AVG(score) As 平均成绩
FROM choices
GROUP BY sid;
--5.选择分组
--例5:查询优秀生学号(每门课成绩均在85分以上)
SELECT sid 学号
FROM choices
GROUP BY sid
HAVING min(score)>=85;
--例6:查询需要补考的学生学号及补考门数。
SELECT sid, COUNT(*) 补考门数
FROM choices
WHERE score<60
GROUP BY sid
ORDER BY 补考门数 DESC
插入语句:
--插入数据 INSERT
--插入一条元组
--向student表中插入一个新学生元组(学号:201215126;姓名:小明;性别:男;所在系:IS;年龄:18)
INSERT INTO stc.dbo.student(sno,sname,ssex, sdept,sage)
VALUES (201215126,'小明','男';,'IS', 18)
--插入多条元组
--求每个系学生的平均年龄
CREATE TABLE dept_avg (sdept char(20), avg_age smallint)
INSERT INTO dept_avg
SELECT sdept, avg (sage)
FROM student
GROUP BY sdept
修改语句:
--修改数据 UPDATE
--修改某一条元组的值,陈东同学转学到了CS系
UPDATE student
SET sdept='cs'
WHERE sname = '陈东'
--修改多条元组的值
--带子查询的修改语句,cs系同学的成绩置零
UPDATE SC
SET grade=O
WHERE sno in(SELECT sno FROM student WHERE sdept='cs')
UPDATE SC
SET grade=l
WHERE 'cs'=(SELECT sdept FROM student WHERE sno=sc.sno)
删除语句:
--除数据 delete
--删除某一条元组的值,删除陈东同学的学生记录
DELETE FROM student
WHERE snane ='陈东'
--册除多条元组的值
--带子查询的除语句,删除CS系同学的选课记录
DELETE FROM SC
WHERE sno in (SELECT sno FROM student WHERE sdept='CS')
MySQL里面常用函数:
length()函数 #返回字符串长度
Substr(string string,num start,num length)函数 #截取字符串
- string:字符串
- start起始位置
- length长度
ASCII() #返回字符ASCII码
left(name,2) #函数返回name的左边第二个字符
right(name,2) #函数返回name的右边第二个字符
INFORMATION_SCHEMA数据库:
INFORMATION_SCHEMA数据库是MySQL自带的,MySQL 5.0以下没有这个数据库,它提供了访问数据库元数据的方式。
元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。
INFORMATION_SCHEMA中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有多个只读表。
--查询当前使用的数据库表名
select table_name from information_schema.tables where table_schema=database()
--查询指定表名下列名
select column_name from information_schema.columns where table_name='oc_user'
SQL注入:
用户通常不会与数据库直接进行交互,而是通过前端的Web应用进行“转述”。当用户点击链接时,客户端会发起HTTP GET请求,此时服务端(具体来说是其中的脚本引擎)会对该请求进行“转述”,将其翻译为SQL查询语句并发送给后端的数据库;数据库负责查询相关结果,并返回给脚本引擎,最终展示给用户。SOL注入就是由于在用户查询请求的过程中,脚本引擎没有对输入进行有效的验证与过滤,从而导致将存在恶意指令的数据“转述”给数据库而产生的。
SQL注入漏洞的定义:SQL注入是指Web应用程序对用入数据的合法性没有进行检查和验证,或者过滤不严,攻击者可以在Web应用程序中事先定义好查询语句的结尾或“拼接”额外的SOL语句,在管理员不知情的情况下实现非法操作,达到欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息的目的。
SQL注入危害:
- 绕过登录验证:使用万能密码登录网站后台等。
- 获取敏感数据:获取网站管理员账号、密码等。
- 文件系统操作:列目录、读取、写入文件等。
- 注册表操作:读取、写入、删除注册表等。
- 执行系统命令:远程执行命令。
SQL注入原理:
- 客户端:参数值等数据被修改;
- 服务端:未经检查和过滤即将被修改的数据注入到SQL命令中,SQL命令功能被修改;
- 数据库引擎:执行被修改后的SQL命令;
- 服务端:将注入的结果返回给客户端;
- 客户端:根据上—次注入获取到的敏感信息构造注入语句进行进一步注入;
SQL注入分类:
-
根据参数分类:数值型注入、字符型注入;
数值型注入:前端传入后端的参数是一个数值,比如id值。
字符型注入:用户在前端输入的参数值传入到后端,后端的SQL查询语句将参数值用引号或者括号等特殊符号包裹了起来。 -
根据请求方式分类:GET注入、POST注入、Cookie注入、HTTP Header注入;
-
是否回显:显注、盲注;
SQL简单的检测:
利用单引号或者双引号或者 / 来检测是否存在注入,如果爆出SQL错误,或者出现不回显90%可能存在注入。因为如果报错,说明我们输入的内容没有被过滤,进入到了SQL语句中,并且被执行了,所以我们可以认为是存在SQL注入的。
可能存在的注入点:
- 最普遍的注入漏洞是由于参数值过滤不严导致的。
- 参数名、目录名、文件名等注入漏洞通常存在于有网站路由的程序中。
- Cookie:Cookie注入漏洞普遍存在于ASP的程序中。
SQL注入通用流程:
- 判断是否存在SQL注入与SQL注入的类型判断方法:
(1)、先看类型,第一种有报错注入的,用’先来判断,如果报错就说明有sql注入.
(2)、遇到盲注需要用逻辑语句,and语句,例如 and 1=1 and 1=2, 320=6 AND 000909=000909 – ’ 等。 - 判断SQL注入是字符型还是数字型
进行闭合 - 爆列数
order by
' order by 3 --成功
' order by 4 --失败
--说明数据库有三列
- 然后数据库名
利用database () - 爆表名
union select 1, group_concat(table_name), 3 from information_schema.tables where table_schema=database()
- 爆列
union select 1, group_concat (column_name), 3 from information_schema.columns where table_name='users'
--可以用十六进制就不需要加
- 爆值
union select 1, 2, group_concat (username, password) from users --
以上是SQL注入基础内容,后续会详细介绍SQL每一种类型。感谢大家,大家喜欢的点个关注!!!