白帽子挖洞—SQL注入篇

SQL语句
437
0
0
2022-05-19
标签   SQL注入
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。初学者可以通过比较四种级别的代码,接触到入门级别的代码审计的内容。

白帽子挖洞—SQL注入篇

DVWA使用界面

白帽子挖洞—SQL注入篇

SQL注入(SQL Injection)

白帽子挖洞—SQL注入篇

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

白帽子挖洞—SQL注入篇

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

代码:

白帽子挖洞—SQL注入篇

低级(low)

分析:

关键语句:

$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

可以看到:

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

白帽子挖洞—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进行转义,在一定程度上控制了用户的输入

白帽子挖洞—SQL注入篇

高级(high)

分析:

关键语句:

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

可以看到:

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

白帽子挖洞—SQL注入篇

不可能(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页面的漏洞:

白帽子挖洞—SQL注入篇

存在漏洞的页面

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

白帽子挖洞—SQL注入篇

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

白帽子挖洞—SQL注入篇

通过sqlmap神器成功挖到漏洞

白帽子挖洞—SQL注入篇

拿到的数据库

白帽子挖洞—SQL注入篇

Sqlmap测试时截图

白帽子挖洞—SQL注入篇

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

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

第二枚漏洞:

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

白帽子挖洞—SQL注入篇

存在漏洞的站点

Sqlmap扫一发

白帽子挖洞—SQL注入篇

加个—tables继续

白帽子挖洞—SQL注入篇

就拿上张图的mallbuilder来开刀吧

白帽子挖洞—SQL注入篇

继续—current-db

白帽子挖洞—SQL注入篇

白帽子挖洞—SQL注入篇

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

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

白帽子挖洞—SQL注入篇

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

白帽子挖洞—SQL注入篇

红色打码部分为手机号

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

总结:通过简单的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总结

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

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