渗透测试学习篇(SQL注入漏洞)

今天来和大家讲渗透测试的要学习的第一个漏洞,也是一个比较常见,且容易发现的漏洞~~~

首先要和大家说一个基础的知识,对于MySQL来说>=5.0 版 本有一个内置库information_schema (这个库会重要,是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息~~~)

我们都知道,在很多数据库里面的名称中会存在“.”这个符号,这里代表下一级的意思(经常使用)!!!!

接下来就开始讲正式的内容了~~~

一、基础知识

1.常见的函数

sleep() :延时执行、输出结果

length() :返回字段结果长度

count() :聚合函数、返回查询对象的总数

concat() : 拼接字符串,将一个或多个字符串拼接为一个字符串

group_concat() :使用分割符将一个或多个字符串连接成一个字符串,是concat()的特殊形式,第一个参数是其它参数的分隔符,分隔符的位置在连接的两个字符串之间,分隔符可以是一个字符串,也可以是其它参数

substr() :此函数用来截取字符串得一部分

mid() :此函数用来截取字符串得一部分

ascii() / ord() 将某个字符串转化为ascii值

hex() 使用hex对数据进行十六进制编码

if(A,B,C) 条件判断:A为条件、如果条件成立执行B,不成立执行C

limit :限制查询数量

这是一些基础的函数,后面我会在讲到每种类型的sql注入的时候讲他对应的函数的~~~

2.读取函数

在sql注入的时候我们通常会使用读取函数去读取数据库的内容,或者写入一句话木马之类的

但是这个是有一个重要的前提的

前提:

  • 必须对目录有写的权限,这样才能写入成功
  • 必须知道网站得绝对路径
  • 在 数 据 库 配 置 文 件 ( my.ini ) 中 , 配 置 项 必 须 = 空     secure_file_priv=''

(这是必要的前提~~~)

二、简介

1.SQL注入介绍

SQL注入是指Web应用程序对用户输入数据合法性进行判断、处理,前端传入的参数是攻击者可控的,并且参数可以被带入到数据库中执行

2.危害

SQL注入是一种高危的漏洞,危害很大,在工作中,可以尽量去挖这个漏洞,因为一般能挖到的,基本就能拿到权限~~~

  • 获取webshell:当我们知道绝对路径且权限为root的时候,可以写入一句话木马
  • 读取敏感文件
  • 尝试发现一些数据库的敏感信息,等等

(要记住,SQL注入产生一切的条件都是用户对参数是可控的,前端传入的参数可以被传入后端数据库执行!!!)

(平时可以自己收集一些万能密码,做密码爆破的时候可以用,配合SQL注入)

3.类型

(这里我们只对常见的分法进行整理~~~)

按注入点

数字型、字符型、搜索型

  • 数字型

带入到数据库中时,变量的数据类型,决定他是那种注入类型

判断是否存在注入

?id=1 and 1=1 #True页面正常

?id=1 and 1=2 #False页面异常

判断字段数量

?id=1 order by 3 #页面正常

?id=1 order by 4 #页面异常

通过Union联合注入判断回显位置

PS:union联合查询,使用--+号

回显位置: 也就是SQL语句在被数据库引擎执行后的结果返回的位置

PS:如果MySQL版本大于5.0的话,存在内置表可以通过内置Information_schema表查询

可以通过limit函数偏移遍历获取所有表名

可以通过group_concat()函数拼接显示所有表名

  • 字符型

SQL原始语句 select usernmae,password from uname where id ='1 and 1=1';

闭合后得语句

select username,password from uname where id ='1' and 1=1 #' 页面正常

select username,password from uname where id ='1' and 1=2 #' 页面异常

PS:后面注入语句与数字型注入相同,只不过闭合有区别

  • 搜索行

SQL语句:select * from uname where username like '%$a%' ;

闭合语句

select username,password from uname where username like '%a%' and 1=1 #'

?id=a%' and 1=1 #

?id=a%' and 1=2 #(也是闭合的问题)

4.注入方法

1. union联合注入

union有一个十分严格的约束条件,因为是联合查询,必须保证左右两边查询结果字段数量必须相同

2. 报错注入

页面会返回报错/错误信息,可以使用报错函数进行注入操作

3. 布尔盲注

页面没有数据回显、也没有报错。只返回两种情况:异常(True)/正常(false),通过返回页面结果判断去注入

4. 时间盲注

不能根据页面返回内容判断任何信息,也无报错,但会显示时间的长短

5. 宽字节注入

程序员为了防止SQL注入,对用户输入得特殊字符(\'")等进行处理,在特殊字符前加上斜杠('\')进行转义

6. 堆叠注入

使用(mysqli_multi_query)函数,同时执行多条SQL语句时的注入

7. Cookie注入/XFF/HTTP头

GET 在url 传递参数、POST 在 POST 正文传递参数和值,COOKIE 在 cookie 头传值

(日常工作中报错和盲注偏多~~~)

5.注入流程

  • 1. 判断是否存在注入,注入是字符型还是数字型
  • 2. 猜解SQL查询语句中的字段数
  • 3. 确定显示的字段回显位置
  • 4. 获取当前数据库
  • 5. 获取数据库中的表
  • 6. 获取表中的字段名
  • 7. 查询到账户的数据

(如果很熟悉的话,后面可以省去一部分,当然也有对应的工具,不过,还是手挖更好点,因为在工作中很多其实都是用工具测不出来的~~~)

这里以联合注入为例

1. 判断是否存在注入

?id=1 and 1=1 --+ True页面正常

?id=1 and 1=2 --+ Flase页面异常

2. 判断字段数

?id=1 order by 4 --+ 页面正常

?id=1 order by 5 --+ 页面异常

(那么就是4位)

3. 判断回显位置

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

4. 查询数据库名

?id=1 select 1,2,3,database() --+(在加粗的地方进行查询)

5. 查询数据表

如果MySQL版本大于5.0的话,存在内置表可以通过内置Information_schema表查询

?id=1 union select 1,table_name,from information_schema.tables where table_schema = database() --+

6. 查询字段名称

?id=1 union select 1,cloumn_name,from information_schema.columns where table_name = 'web' --+

7. 查询字段值

select 1,username,password, from web

注入类型判断关键就在于闭合问题!!!!

好了,今天就说到这里,下次给大家分享具体每种注入方法的注入手段~~~~

基础的大家一定要学扎实,不然后面会没办法进行下去的,要划重点自己记忆,练习!!!

工具后面讲完了会给大家分享的!!

  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值