渗透测试(第三章SQL注入基础)

前言:

今天给大家聊一聊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注入危害:

  1. 绕过登录验证:使用万能密码登录网站后台等。
  2. 获取敏感数据:获取网站管理员账号、密码等。
  3. 文件系统操作:列目录、读取、写入文件等。
  4. 注册表操作:读取、写入、删除注册表等。
  5. 执行系统命令:远程执行命令。

SQL注入原理:

  1. 客户端:参数值等数据被修改;
  2. 服务端:未经检查和过滤即将被修改的数据注入到SQL命令中,SQL命令功能被修改;
  3. 数据库引擎:执行被修改后的SQL命令;
  4. 服务端:将注入的结果返回给客户端;
  5. 客户端:根据上—次注入获取到的敏感信息构造注入语句进行进一步注入;

SQL注入分类:

  1. 根据参数分类:数值型注入、字符型注入;
    数值型注入:前端传入后端的参数是一个数值,比如id值。
    字符型注入:用户在前端输入的参数值传入到后端,后端的SQL查询语句将参数值用引号或者括号等特殊符号包裹了起来。

  2. 根据请求方式分类:GET注入、POST注入、Cookie注入、HTTP Header注入;

  3. 是否回显:显注、盲注;

SQL简单的检测:
利用单引号或者双引号或者 / 来检测是否存在注入,如果爆出SQL错误,或者出现不回显90%可能存在注入。因为如果报错,说明我们输入的内容没有被过滤,进入到了SQL语句中,并且被执行了,所以我们可以认为是存在SQL注入的。

可能存在的注入点:

  • 最普遍的注入漏洞是由于参数值过滤不严导致的。
  • 参数名、目录名、文件名等注入漏洞通常存在于有网站路由的程序中。
  • Cookie:Cookie注入漏洞普遍存在于ASP的程序中。

SQL注入通用流程:

  1. 判断是否存在SQL注入与SQL注入的类型判断方法:
    (1)、先看类型,第一种有报错注入的,用’先来判断,如果报错就说明有sql注入.
    (2)、遇到盲注需要用逻辑语句,and语句,例如 and 1=1 and 1=2, 320=6 AND 000909=000909 – ’ 等。
  2. 判断SQL注入是字符型还是数字型
    进行闭合
  3. 爆列数
    order by
' order by 3 --成功
' order by 4 --失败
--说明数据库有三列
  1. 然后数据库名
    利用database ()
  2. 爆表名
union select 1, group_concat(table_name), 3 from information_schema.tables where table_schema=database()
  1. 爆列
union select 1, group_concat (column_name), 3 from information_schema.columns where table_name='users'
--可以用十六进制就不需要加
  1. 爆值
union select 1, 2, group_concat (username, password) from users --

以上是SQL注入基础内容,后续会详细介绍SQL每一种类型。感谢大家,大家喜欢的点个关注!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我能突破限制.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值