今天来和大家讲渗透测试的要学习的第一个漏洞,也是一个比较常见,且容易发现的漏洞~~~
首先要和大家说一个基础的知识,对于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.注入方法
- union联合注入
union有一个十分严格的约束条件,因为是联合查询,必须保证左右两边查询结果字段数量必须相同
- 报错注入
页面会返回报错/错误信息,可以使用报错函数进行注入操作
- 布尔盲注
页面没有数据回显、也没有报错。只返回两种情况:**异常(True)/正常(false)**,通过返回页面结果判断去注入
- 时间盲注
不能根据页面返回内容判断任何信息,也无报错,但会显示时间的长短
- 宽字节注入
程序员为了防止SQL注入,对用户输入得特殊字符('")等进行处理,在特殊字符前加上斜杠('')进行转义
- 堆叠注入
使用(mysqli_multi_query)函数,同时执行多条SQL语句时的注入
- Cookie注入/XFF/HTTP头
GET 在url 传递参数、POST 在 POST 正文传递参数和值,COOKIE 在 cookie 头传值
(日常工作中报错和盲注偏多~~~)
5.注入流程
- 判断是否存在注入,注入是字符型还是数字型
- 猜解SQL查询语句中的字段数
- 确定显示的字段回显位置
- 获取当前数据库
- 获取数据库中的表
- 获取表中的字段名
- 查询到账户的数据
(如果很熟悉的话,后面可以省去一部分,当然也有对应的工具,不过,还是手挖更好点,因为在工作中很多其实都是用工具测不出来的~~~)
这里以联合注入为例
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
注入类型判断关键就在于闭合问题!!!!
好了,今天就说到这里,下次给大家分享具体每种注入方法的注入手段~~~~
基础的大家一定要学扎实,不然后面会没办法进行下去的,要划重点自己记忆,练习!!!
工具后面讲完了会给大家分享的!!
版权归原作者 0xError 所有, 如有侵权,请联系我们删除。