DESCRIBE注入点研究

栏目: 数据库 · 发布时间: 5年前

内容简介:最近审计一套代码,发现一处比较特殊的注入点,注入点位于describe后面,研究了好久不得其法,网上找了一下大牛的文章,这里转载过来学习一下。原作者:雨了个雨's blog原标题:当表名可控的注入遇到了Describe时的几种情况

最近审计一套代码,发现一处比较特殊的注入点,注入点位于describe后面,研究了好久不得其法,网上找了一下大牛的文章,这里转载过来学习一下。

原作者:雨了个雨's blog

原标题:当表名可控的注入遇到了Describe时的几种情况

SHOW COLUMNS

之前小嘎嘎遇到了个注入是表前缀不可控,表名可控的注入,但是在表名进入的select语句执行之前, 执行了一次SHOW COLUMNS FROM $TABLE。如果SHOW COLUMNS语句执行出错了的话,就不会再执行后面的SELECT语句。

大概代码如:

mysql_connect("localhost","root","xiaoyu");
mysql_query("use b2cshop");
$table = $_GET['table'];
mysql_query("show columns from `shop_{$table}`") or die("show coulumns 出错:".mysql_error());
$sql = "select * from `shop_{$table}` where 1=1";
echo $sql;
echo "<br><br><br><br><br><br><br>";
var_dump(mysql_fetch_array(mysql_query("$sql")));
echo mysql_error();

要解这个, 首先来看一下 SHOW COLUMNS Syntax

SHOW [FULL] COLUMNS {FROM | IN} tbl_name [{FROM | IN} db_name]
    [LIKE 'pattern' | WHERE expr]

看到where 后面可以跟expr, 就很简单了。

DESCRIBE注入点研究

解决了这个, 让我想起了我好多年前遇到的另外一种, 他不是用的show columns 而是用的describe, 当年的我没解决掉, 所以又再去看了一眼,试试能不能解决掉。 DESC这种分为几种情况。

DESCRIBE

 DESCRIBE is a shortcut for SHOW COLUMNS. These statements also display information for views. The description for SHOW COLUMNS provides more information about the output columns. 

虽然说的是 DESCRIBE 是 SHOW COLUMNS 的shortcut,但是其实两个语法完全不同。。

{EXPLAIN | DESCRIBE | DESC}
    tbl_name [col_name | wild]
{EXPLAIN | DESCRIBE | DESC}
    [explain_type]
    {explainable_stmt | FOR CONNECTION connection_id}
explain_type: {
    EXTENDED
  | PARTITIONS
  | FORMAT = format_name
}
format_name: {
    TRADITIONAL
  | JSON
}
explainable_stmt: {
    SELECT statement
  | DELETE statement
  | INSERT statement
  | REPLACE statement
  | UPDATE statement
}

分几种情况来讨论。

0x01 表名完全可控且无identifier quote。

mysql_connect("localhost","root","xiaoyu");
mysql_query("use b2cshop");
$table = $_GET['table'];
mysql_query("desc $table") or die("DESC 出错:".mysql_error());
$sql = "select * from {$table} where 1=1";
echo $sql;
echo "<br><br><br><br><br><br><br>";
var_dump(mysql_fetch_array(mysql_query("$sql")));
echo mysql_error();

这种的,应该实例特别少。利用比较简单, 根据文档写的构造一下, 直接利用desc 来注入。

DESCRIBE注入点研究

0x02 表名不完全可控且DESC和SELECT的表名都含有identifier quote

一般都是遇到的这种注入,会有表前缀是不可控的。

mysql_connect("localhost","root","xiaoyu");
mysql_query("use b2cshop");
$table = $_GET['table'];
mysql_query("desc `shop_{$table}`") or die("DESC 出错:".mysql_error());
$sql = "select * from `shop_{$table}` where 1=1";
echo $sql;
echo "<br><br><br><br><br><br><br>";
var_dump(mysql_fetch_array(mysql_query("$sql")));
echo mysql_error();

这种想了很久, 我感觉是无解, 如果有大佬能搞定的话, 求学习。

0x03 表名不完全可控且DESC和SELECT的表名都不含有identifier quote

mysql_connect("localhost","root","xiaoyu");
mysql_query("use b2cshop");
$table = $_GET['table'];
mysql_query("desc shop_{$table}") or die("DESC 出错:".mysql_error());
$sql = "select * from shop_{$table} where 1=1";
echo $sql;
echo "<br><br><br><br><br><br><br>";
var_dump(mysql_fetch_array(mysql_query("$sql")));
echo mysql_error();

自我感觉,依旧无解。

0x04 表名不完全可控且DESC的表名含有identifier quote,SELECT的表名不含identifier quote

mysql_connect("localhost","root","xiaoyu");
mysql_query("use b2cshop");
$table = $_GET['table'];
mysql_query("desc `shop_{$table}`") or die("DESC 出错:".mysql_error());
$sql = "select * from shop_{$table} where 1=1";
echo $sql;
echo "<br><br><br><br><br><br><br>";
var_dump(mysql_fetch_array(mysql_query("$sql")));
echo mysql_error();

可解:

DESCRIBE注入点研究

shop_users 后面的两个``,做了shop_users 表的别名,所以无影响。

这时候desc的语句为,

desc `shop_users` `where updatexml(1,concat(0x5e24,(select user()),0x5e24),1)#`

看一下DESC的Syntax

DESC tbl_name [col_name | wild]

可以看到表名后面可以接col_name 或者 wild

为什么表名后面接了where updatexml(1,concat(0x5e24,(select user()),0x5e24),1)# 却没有报unknown column,感觉是因为这个应该是按照wild来执行的,

 wild, if given, is a pattern string. It can contain the SQL % and _ wildcard characters. 

所以不会报unknown column。

0x05 表名不完全可控且DESC的表名不含identifier quote,SELECT的表名含有identifier quote

跟上面一个利用差不多,稍微改一下。

mysql_connect("localhost","root","xiaoyu");
mysql_query("use b2cshop");
$table = $_GET['table'];
mysql_query("desc shop_{$table}") or die("DESC 出错:".mysql_error());
$sql = "select * from `shop_{$table}` where 1=1";
echo $sql;
echo "<br><br><br><br><br><br><br>";
var_dump(mysql_fetch_array(mysql_query("$sql")));
echo mysql_error();

DESCRIBE注入点研究

参考文章:

http://www.yulegeyu.com/2017/04/16/%E5%BD%93%E8%A1%A8%E5%90%8D%E5%8F%AF%E6%8E%A7%E7%9A%84%E6%B3%A8%E5%85%A5%E9%81%87%E5%88%B0%E4%BA%86Describe%E6%97%B6%E7%9A%84%E5%87%A0%E7%A7%8D%E6%83%85%E5%86%B5%E3%80%82/

https://www.jianshu.com/p/fcc9deeddceb

http://www.venenof.com/index.php/archives/380/


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

产品经理必懂的技术那点事儿

产品经理必懂的技术那点事儿

唐韧 / 电子工业出版社 / 2017-1 / 59

《产品经理必懂的技术那点事儿》以非技术背景产品经理了解技术为主题,将技术知识以简单并且易于理解的方式讲述出来,帮助非技术背景产品经理了解技术、学习技术,旨在帮助产品经理高效地与技术人员进行沟通与合作。 《产品经理必懂的技术那点事儿》的主要内容围绕产品经理需要了解的互联网基础技术知识展开,涉及客户端、服务器端、数据库及一些数据处理知识。同时,还就产品经理需具备的一些软实力,例如沟通能力和解决问......一起来看看 《产品经理必懂的技术那点事儿》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试