百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

白帽子挖洞—SQL注入篇

toyiye 2024-06-21 12:34 12 浏览 0 评论

0×00介绍

QL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

对于初学者而言,找漏洞最好是基于白盒审计进行,所谓白盒审计可以简单地理解为就是看着代码找漏洞,当然了,在web方面的代码审计可没想象的那么轻松,不会像C语言中很经典的溢出,先定义一个buffer,然后用一个gets()函数直接获取内容,这么简单的溢出,泥萌也太小瞧程序媛/猿了。在web方面的代码审计,感谢伟大的社会主义社会,我国大部分的网站都是php建的(画外音:php是世界是最好的语言,哈哈),所以大多数情况下我们都是审计php代码,php函数又那么多,相互之间互相调用,使得代码审计不容易,当然了,也不难,只要掌握了技巧,结合经验,就能找出漏洞所在。在0x04部分小表弟会给出一些自己的经验。

在正式挖洞前,我们先看看DVWA给出的四种级别的SQL注入的源代码。

0x01基于dvwa的代码审计

DVWA 的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到入门级别的代码审计的内容。

DVWA使用界面

SQL注入(SQL Injection)

在左下角的DVWA Security可以调节难度系数,即low,medium,high,impossible选中后点击submit提交即可。

点击左下角view source可以看到源代码,方便进行代码审计,我们可以看到四种级别的代码分别如下所示:

代码:

低级(low)

分析:

关键语句:

$id = $_REQUEST[ 'id' ];

// Check database

$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

可以看到:

Low级别的代码对来自客户端的参数id没有进行任何的检查与过滤,存在明显的SQL注入。

中级(medium)

分析:

关键代码:

$id = mysql_real_escape_string( $id );

// Check database

$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";

可以看到:

Medium级别的代码利用mysql_real_escape_string函数对特殊符号\x00,\n,\r,\,’,”,\x1a进行转义,在一定程度上控制了用户的输入

高级(high)

分析:

关键语句:

$query = "SELECT first_name, last_name FROM users WHERE user_id = $id LIMIT 1

可以看到:

代码希望通过LIMIT 1来控制使得只输出一个查询结果

不可能(Impossible)

分析:

关键代码:

$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );

$data->bindParam( ':id', $id, PDO::PARAM_INT );

可以看到:

代码中限制返回的查询结果数量为一时,才会输出,防止了大量数据的泄露,同时采用了PDO技术,隔离了代码与数据,使得用户输入的数据不再被当作代码执行,采用这种方案,杜绝了SQL注入漏洞的发生

0x02挖掘漏洞

注:

1. 接下来的过程中会大量用到sqlmap,部分站点的漏洞将直接以sqlmap的形式给出。所以建议小伙伴先去熟悉下sqlmap。

2. 以下提交的漏洞均已被厂家修复,小伙伴们就不要想搞事情了

3.本文展现的漏洞在测试前已获授权,请小伙伴们勿非法测试

先来枚有web页面的漏洞:

存在漏洞的页面

扫目录时发现该url下存在某事件型漏洞

采用某位大神的中转脚本:

通过sqlmap神器成功挖到漏洞

拿到的数据库

Sqlmap测试时截图

总结:第一枚漏洞主要是采用某事件型漏洞结合sqlmap挖到的,难度相当于DVWA中的Medium级别

什么?没有数据看着不过瘾?你这是要搞事情啊大兄弟!好吧,再来一枚数据量大的

第二枚漏洞:

测试时没有截web的图,只有sqlmap,将就着看吧,看看

存在漏洞的站点

Sqlmap扫一发

加个—tables继续

就拿上张图的mallbuilder来开刀吧

继续—current-db

红色打码的部分是手机号或真实姓名或邮箱号,过于敏感就打码了,可以看到图中下面password就是密码编码加密后的字符串

拿到用户名和密码后我们可以登陆后台

红色打码部分为收货人姓名及手机号,有一条还包括收货地址

红色打码部分为手机号

可以看到后台所有的功能我们都是可以使用的,就不继续了

总结:通过简单的sqlmap命令指定特定的表、数据库来“脱裤”,拿到后台登陆帐号密码,进而进行进一步的操作。此站点的代码强度相当于DVWA中的Medium级别。

0x03资源推荐

代码审计方面可以使用法师尹毅(Seay)的源代码审计系统

DVWA方面的实际操作可以登陆合天网安实验室进行练习,连接如下:

http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182015061009315500001

SQL注入时的神器SQLMAP在合天网安实验室也有相应的课程,连接如下:

http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182015011916013600001

抓包改包看参数的神器burpsuite在合天网安实验也有相应课程,连接如下:

http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182014112610353900001

0x04经验心得

SQL注入漏洞挖掘的总体的思路:

1. SQL注入漏洞的判断,即寻找注入点

2. 判断后台数据库类型

3. 确定XP_CMDSHELL可执行情况;若当前连接数据的帐号具有SA权限(这是SQL系统中的最高权限),且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过几种方法完全控制,也就完成了整个注入过程。

否则继续:

1. 发现WEB虚拟目录

2. 上传ASP木马;

3. 得到管理员权限

了解了思路,在实际挖洞的过程中,常常会碰到需要绕过的情形,针对这种情况,表弟给大家提供了常用的绕过方法

一、引号绕过

会使用到引号的地方是在于最后的where子句中。如下面的一条sql语句,这条语句就是一个简单的用来查选得到users表中所有字段的一条语句。

select column_name from information_schema.tables where table_name="users"

这个时候如果引号被过滤了,那么上面的where子句就无法使用了。那么遇到这样的问题就要使用十六进制来处理这个问题了。

users的十六进制的字符串是7573657273。那么最后的sql语句就变为了:

select column_name from information_schema.tables where table_name=0x757365727

二、逗号绕过

在使用盲注的时候,需要使用到substr() ,mid() ,limit。这些子句方法都需要使用到逗号。对于substr()和mid()这两个方法可以使用from to的方式来解决。

select substr(database(0 from 1 for 1);

select mid(database(0 from 1 for 1);

对于limit可以使用offset来绕过

select * from news limit 0,1

# 等价于下面这条SQL语句

select * from news limit 1 offset 0

三、比较符(<,>)绕过

同样是在使用盲注的时候,在使用二分查找的时候需要使用到比较操作符来进行查找。如果无法使用比较操作符,那么就需要使用到greatest来进行绕过了。

最常见的一个盲注的sql语句。

select * from users where id=1 and ascii(substr(database(),0,1))>64

此时如果比较操作符被过滤,上面的盲注语句则无法使用,那么就可以使用greatest来代替比较操作符了。greatest(n1,n2,n3,等)函数返回输入参数(n1,n2,n3,等)的最大值

那么上面的这条sql语句可以使用greatest变为如下的子句:

select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64

0x05防护措施

1、解决SQL注入漏洞的关键是对所有来自用户输入的数据进行严格检查、对数据库配置使用最小权限原则所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。

2、对进入数据库的特殊字符('"\<>&*;等)进行转义处理,或编码转换。严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。

3、数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过

以上仅为个人观点,欢迎小伙伴们提出意见讨论

0x06总结

本系列文章旨在普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征、挖掘技巧等。若读者因此做出危害网络安全的行为后果自负,与合天智汇及本人无关,特此声明。

注:本文属合天原创奖励文章,未经允许,禁止转载!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码