SQL注入攻击



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

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

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

 

0x01基于dvwa的代码审计

初学者接触到入门级别的代码审计的内容。

 

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级别.

 

 

posted @ 2018-05-20 22:27  曹贻森  阅读(402)  评论(0编辑  收藏  举报