渗透测试SQL注入漏洞原理与验证(2)——SQL注入漏洞利用

2024-09-27 19:22:16 浏览数 (2)

SQL注入概述

什么是SQL注入漏洞

攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵。

SQL注入漏洞原理

服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全。

需要具备两个条件:

  • 用户能够控制输入
  • 原本程序要执行的SQL语句,拼接了用户输入的恶意数据

SQL注入过程

SQL注入带来的危害

  • 绕过登录验证 :使用万能密码登录网站后台等。
  • 获取敏感数据 :获取网站管理员帐号、密码等。
  • 文件系统操作 :列目录,读取、写入文件等。
  • 注册表操作 :读取、写入、删除注册表等。
  • 执行系统命令 :远程执行命令。

SQL注入示例

通过在用户名处传入参数 ' or 1 = 1 -- 进行万能密码登录

代码语言:sql复制
SELECT username, password FROM users WHERE username='输入值' or 1=1-- ' AND password='输入值2'


(注意:  --  后面有一个空格)

此时,输入字符为:

  • formusr = ' or 1=1 --
  • formpwd = anything

实际查询代码为:

代码语言:sql复制
SELECT  *  FROM users WHERE username= ' ' or 1=1 -- AND password = 'anything'

判断一个HTTP请求是否存在SQL注入的方式

  • 经典判断方式
代码语言:sql复制
and1=1   ;    and 2>1  ;   or 1=1 ;  or 1<1
  • 数据库函数
代码语言:sql复制
sleep(4)=1   ;length(user())>3
  • 特殊符号
代码语言:txt复制
单引号(  '  )    ;   双引号(  "  )

SQL注入分类

按照注入点类型分类

  • 数字型(整型)注入
  • 字符型注入
  • 搜索型注入

数字型(整型)注入

输入的参数为整数,如ID、年龄、页码等,如果存在注入型漏洞,则为数字型(整型)注入。

代码语言:txt复制
http://www.testweb.com/user.php?id=8

实际查询代码原型诸如:

代码语言:txt复制
select ... from ... where id=$id ..

注入测试方法:

字符型注入

一般输入的参数为字符串类型,与数字型注入的区别在于,字符型注入一般要使用单引号来闭合。

代码语言:txt复制
http://www.testweb.com/test.php?user=admin

实际查询代码原型诸如:

代码语言:sql复制
select ... from ... where id='$id'  ...

字符型注入测试方法:

搜索型注入

这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 " keyword=关键字 " ,有的不显示链接地址,而是直接通过搜索框表单提交。

此类注入点提交的 SQL 语句,其原型大致为:

代码语言:sql复制
select * from 表名 where 字段 like   '%关键字%'

当我们提交注入参数为 keyword= ' and查询条件 and '%'=' ,故向数据库提交的SQL语句为:

代码语言:sql复制
select * from 表名 where 字段 like '%' and [査询条件] and '%'='%'

按照注入技术(执行效果)分类

  • 基于布尔的盲注 : 可以根据返回页面判断条件真假的注入。
  • 基于时间的盲注 :不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
  • 基于报错的注入:即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
  • 联合查询注入:可以使用union的情况下的注入。
  • 堆查询注入:同时执行多条语句的注入。

SQL注入漏洞形成的原因

动态字符串构建引起

  • 不正确的处理转义字符(宽字节注入)
  • 不正确的处理错误(报错泄露信息)
  • 不正确的处理联合查询
  • 不正确的处理多次提交(二次注入)

后台存在的问题

  • 后台无过滤或者编码用户数据
  • 数据库可以拼接用户传递的恶意代码

错误处理不当

  • 详细的内部错误消息显示给用户或攻击者
  • 错误信息可以直接给攻击者提供下一步攻击帮助

不安全的数据库配置

  • 默认账户:

SOL Server使用 "sa" 作为数据库系统管理员账户 ;

MySQL使用 "root" 和 "anonymous" 用户账户;

Oracle则在创建数据库时通常默认会创建SYS、SYSTEMS DBSNMP和OUTLN账户。

  • 默认权限:

系统和数据库管理员在安装数据库服务器时允许以roots SYSTEM 或 Administrator 特权系统用户账户身份执行操作,应该始终以普通用户身份运行服务器上的服务,降低用户权限,将用户权限只限于本服务。

寻找SQL注入点

GET方法

  • 一种请求服务器的HTTP方法,使用该方法时,信息包含在URL中
  • 点击一个链接时,一般会使用该方法

GET请求方法的格式

代码语言:txt复制
?text=value1&cat=value2&num=value3....

修改方法

  • 浏览器的导航栏中直接修改即可操纵这些参数
  • HackBar插件

POST方法

POST是一种用于向Web服务器发送信息的HTTP方法数据信息无法在URL中看到可以发送字节大的数据。

修改方法

  • 浏览器修改扩展(Hackbar)
  • 代理服务器(Burpsuite)

其它注入点数据

  • Cookie
  • Host
  • User-Agent

关于注入点的总结

只要后台接收前端输入的数据,并且未对数据进行过滤处理,最后直接进入到数据库中,从而都能构成威胁。

SQL注入的过程

手工注入过程

手工注入实例

基于联合查询(unionselect)的注入方法。

判断注入点

判断字段长度

判断回显位置

判断数据库信息

查找数据库名

查找数据库表

查找数据库表中所有字段

查找数据库表中所有字段的值

猜解账号密码

登录数据库后台

自动化注入工具

(1) SQL注入工具: Sqlmap 、Havij 、Sqlid

(2) ASPJSP注入工具:NBSI 、 明小子注入软件、 阿D注入软件

(3) PHP注入工具 : 穿山甲注入软件 、 海阳顶端注入软件

本文部分图片摘自深信服安全服务认证工程师课程课件中,为方便个人学习使用,勿作商用!!!!文字内容为自己手打,并非直接搬运!如有侵权,请联系删除!!!

本文档所提供的信息仅用于教育目的及在获得明确授权的情况下进行渗透测试。任何未经授权使用本文档中技术信息的行为都是严格禁止的,并可能违反《中华人民共和国网络安全法》及相关法律法规。使用者应当合法合规地运用所学知识,不得用于非法入侵、破坏信息系统等恶意活动。我们强烈建议所有读者遵守当地法律与道德规范,在合法范围内探索信息技术。

我正在参与2024腾讯21天技术创作挑战赛|年中回顾特别季,年中技术沉淀,拯救你的flag,快来和我瓜分大奖!

0 人点赞