精华内容
下载资源
问答
  • 宽字节

    2017-03-04 19:01:20
    例子: wchar_t *chinese_str = L"韦gif"; unsigned int *p = (wchar_t *)chinese_str; int i; printf("Uniocde: \n");... printf("韦gif :共 %d 个宽字节wchar_t\n",wcslen(chinese_str)); for (i = 0; i

    转载请注明出处:http://blog.csdn.net/qq_26093511/article/category/6752927


    例子:
     wchar_t *chinese_str = L"韦gif";
      unsigned int *p = (wchar_t *)chinese_str;
      int i;


      printf("Uniocde: \n");
      printf("韦gif :共 %d 个宽字节wchar_t\n",wcslen(chinese_str));
      for (i = 0; i < wcslen(chinese_str); i++)
      {
      printf("0x%x ", p[i]);
      }
      printf("\n");


    输出:
    Uniocde: 
    韦gif:共 4 个宽字节wchar_t
    0x97e6 0x67 0x69 0x66 


    由上面测试代码可知,wchar_t是一个可以表示字符集中的任意一个字符的足够宽的变量类型,即一个宽字符可以表示一个中文,也可以表示一个英文。
    chinese_str[0] 是“韦”,
    chinese_str[1] 是“g”,
    chinese_str[2] 是“i”,
    chinese_str[3] 是“f”。
    具体使用可参考:
    http://blog.csdn.net/qq_26093511/article/details/59126467

    http://blog.csdn.net/qq_26093511/article/details/60332795



    下面的测试代码可以区分宽字符Unicode与GBK的中英文区别
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <wchar.h>
    void main()
    {


     wchar_t *chinese_str = L"韦gif";
     unsigned int *p = (wchar_t *)chinese_str;
     int i;


     printf("Uniocde: \n");
     printf("韦gif :共 %d 个宽字节wchar_t\n",wcslen(chinese_str));
     for (i = 0; i < wcslen(chinese_str); i++)
     {
      printf("0x%04x ", p[i]);
     }
     printf("\n");
     
     
     
     unsigned char *chinese_utf_8 = "韦gif";
     unsigned char *p2 = chinese_utf_8;


     printf("GBK: \n");
     printf("韦gif :共 %d 个字节\n",strlen(chinese_utf_8));
     for (i = 0; i < strlen(chinese_utf_8); i++)
     {
      printf("0x%x ", p2[i]);
     }
     printf("\n");
    }


    注意:在linux下,创建的文本代码,默认是UTF-8格式的!本文的代码是在linux下创建。


    下面是编译及运行结果:
    gcc -o test test.c -finput-charset=UTF-8 -fexec-charset=GBK


     ./test 
    Uniocde: 
    Τgif :�� 4 �����ֽ�wchar_t
    0x97e6 0x0067 0x0069 0x0066 
    GBK: 
    Τgif :�� 5 �����ֽ�
    0xce 0xa4 0x67 0x69 0x66 


    由运行代码知,GBK是两个字节来表示一个汉字,一个字节来表示英文。
    而宽字符则是 两个字节来表示任意一个字符!

    我们可以使用宽字节来描述中英文,这样的话就省去了判断中英字符的操作。


    若有描述错误,请指出,谢谢!

    
    
    
    
    
    
    
    
    
    
    
    
    展开全文
  • 宽字节注入原理:宽字节(两字节)带来的安全问题主要是吃ASCII字符(一字节)的现象,使用一些特殊字符来”吃掉“经过转义符 “ \ ” 。在重新详细了解宽字节注入之前,我认为宽字节注入只是出现在网站使用GBK编码的...

    宽字节注入

    原理:宽字节(两字节)带来的安全问题主要是吃ASCII字符(一字节)的现象,使用一些特殊字符来”吃掉“经过转义符 “ \ ” 。

    在重新详细了解宽字节注入之前,我认为宽字节注入只是出现在网站使用GBK编码的时代,现在已经很少出现了,但是实际上宽字节不只是出现在GBK编码中。

    在PHP中,通过iconv()进行编码转换时,也可能出现宽字节注入。

    还有一个误区:

    这里的编码问题不是出现在HTML页面编码,而是与数据库的编码形式有关,一般我们在建立一个数据库的时候会让我们选择数据库的编码形式,所以有时候网站虽然是UTF-8写的,但是如果数据库是GBK的形式,也会出现宽字节,现实这样建站的奇葩应该很少叭。。。

    宽字节编码有哪些:

    GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节

    MySQL中用于转义的函数有:

    addslashes、mysql_real_escape_string、mysql_escape_string以及后面在高版本被去除的magic_quote_gpc

    绕过思路:

    因为宽字节注入主要是吃掉 \ ,所以一般时候加一个 %df 这种就可以吃掉,其实加三个%df也可以吃掉,只要是奇数个%df即可。

    防御方法:

    1.设置character_set_client=binary,将数据以二进制形式传递

    2.矫正人们对于mysql_real_escape_string的误解,单独调用set names gbk和mysql_real_escape_string是无法避免宽字符注入问题的。还得调用mysql_set_charset来设置一下字符集。

    3.谨慎使用iconv来转换字符串编码,很容易出现问题。只要我们把前端html/js/css所有编码设置成gbk,mysql/php编码设置成gbk,就不会出现乱码问题。不用画蛇添足地去调用iconv转换编码,造成不必要的麻烦。

    参考连接:

    1

    2

    展开全文
  • 宽字节转多字节 WideCharToMultiByte string W2AString(const wchar_t * str) { string re=""; int num = WideCharToMultiByte( CP_ACP, // 转换的格式 0, // 默认转换方式 ...

    宽字节转多字节

    WideCharToMultiByte

    string W2AString(const wchar_t * str)
    { 
    
        string re="";
        int num = WideCharToMultiByte(
            CP_ACP,     //    转换的格式
            0,             //    默认转换方式
            str,        //    输入字节
            -1,         //    字符串大小
            0,             //    输出地址
            0,            //    输出空间大小
            0,            //    失败默认替换
            false );
    
        if (num<=0) return re;
        char *data = new char[num+1];  // +1,保留\0
        data[0]=0;
        num = WideCharToMultiByte(
            CP_ACP,     //    转换的格式
            0,             //    默认转换方式
            str,        //    输入字节
            -1,         //    字符串大小
            data,     //    输出地址
            num            //    输出空间大小
            0,            //    失败默认替换
            false);
    
        if (num>0)
        re = data;
        delete data;
        return re;
    }

    多字节转宽字节

    MultiByteToWideChar
    char *str = " 多字节转宽字节";

    wstring A2WString(char* str)
    {
        CString re;
        int num = MultiByteToWideChar(
            CP_ACP, 	//	转换的格式
            0, 			//	默认转换方式
            str,		//	输入字节
            -1, 		//	字符串大小
            0, 			//	输出地址
            0			//	输出空间大小
            );
    
        wstring re = L"";
    	if (num<=0) 
    		return re;
        //	申请空间
        wchar_t *outStr = new wchar_t[num+1];//+1 保留\0
    
        num = MultiByteToWideChar(
            CP_ACP, 	//	转换的格式
            0, 			//	默认转换方式
            str,		//	输入字节
            -1, 		//	字符串大小
            outStr, 			//	输出地址
            num			//	输出空间大小
            );
    
     	if (num>0)
    		re = outStr;
    	delete outStr;
    	return re;
    }

     

    展开全文
  • 宽字节注入其实在SQL注入是一个比较常见的注入,但是有时候很长时间没有遇到宽字节注入,突然出现了一个宽字节注入,就是返回去翻资料,还不如自己写篇文章记录一下。宽字节的注入,sqlmap也是无法识别出来的。需要...

    宽字节注入其实在SQL注入是一个比较常见的注入,但是有时候很长时间没有遇到宽字节注入,突然出现了一个宽字节注入,就是返回去翻资料,还不如自己写篇文章记录一下。宽字节的注入,sqlmap也是无法识别出来的。

    需要说明的是,本文的资料主要是来自于P神的浅析白盒审计中的字符编码及SQL注入,只是对其中内容稍有修改。

    简介

    在将sql宽字节注入之前,需要对字符编码有所了解,常见的gbk、utf-8、unicode编码,但这不是本文的重点,如果想详细了解字符编码的知识,可以参考文章,这篇文章应该说明得很清楚。

    本质上sql的宽字节注入就是使用mysql进行SQL查询时,用错了gbk和utf-8的编码而导致出现的问题。通常来说,一个GBK编码的汉字占用2个字节,一个utf8的汉字占用3个字节。这样也可以换个说法,当使用GBK编码时,是将2个字节解释为一个汉字,当使用的是utf8的编码时,是将3个字节解释为一个汉字。

    以上这就是宽字节注入的背景知识了。

    实例代码1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24<?php

    //连接数据库部分,注意使用了gbk编码

    $conn = mysql_connect('localhost', 'root', 'root') or die('bad!');

    mysql_query("SET NAMES 'gbk'");

    mysql_select_db('test', $conn) OR emMsg("连接数据库失败,未找到您填写的数据库");

    //执行sql语句

    $id = isset($_GET['id']) ? addslashes($_GET['id']) : 1;

    $sql = "SELECT * FROM news WHERE tid='{$id}'";

    $result = mysql_query($sql, $conn) or die(mysql_error());

    ?>

    新闻

    $row = mysql_fetch_array($result, MYSQL_ASSOC);

    echo "

    {$row['title']}

    {$row['content']}

    \n";

    mysql_free_result($result);

    ?>

    SQL 语句是 SELECT * FROM news WHERE tid='{$id}',就是根据文章的 id 把文章从

    news 表中取出来。其中{$id},表示会解析$id的内容,同时还在外外面加上'',因为这是一个字符串的查询。

    在查询之前存在addslashes()函数,此函数主要使用对单引号(’)、双引号(”)、反斜线(\)与 NUL(NULL 字符)进行转义,这样用户输入的单引号就无用了。如下所示:

    be6dd1b675b96f2eade0ff9f3cf3e234.png

    可以看出,在加了'之后,对最后的结果没有影响。

    为什么会这样呢?在两种情况下的,SQL注入语句分别为:

    1

    2SELECT * FROM news WHERE tid='1'

    SELECT * FROM news WHERE tid='1\''

    通过转义符\将'进行转义,所以对结果没有影响。

    逃逸addslashes

    那么怎么逃过 addslashes 的限制?众所周知 addslashes 函数产生的效果就是,让’变成’\’,

    让引号变得不再是“单引号”,只是一撇而已。一般绕过方式就是,想办法处理\’前面的\:

    想办法给\前面再加一个’\’(或单数个即可),变成\\' ,这样\被转义了,'逃出了限制

    想办法把\弄没有。

    而宽字节注入的方式就是消除掉\。上面的代码中使用的是GBK编码,意味着是将2个字节看成一个汉字。如果我们传入的id为%df',结果为:

    890cc64951c897140e83ac1bd1afe155.png

    分析出现这个错误的原因。

    输入了%df'会被addslashes转义为%df\'。\的hex编码为5c,最后就会变为%df%5c'。因为gbk编码认为2个字节是一个汉字,所以%df%5c就被解释为運,'就逃逸出来了。最后SQL语句就变为:

    1SELECT * FROM news WHERE tid='運''

    这样就会报错了,这就是一个简单的SQL注入的原理。

    需要说明的是,本文是从P神的文章那里大量复制过来的,仅仅是为了记录和学习。如果相对宽字节注入更深层次的了解,可以去看P神的原文浅析白盒审计中的字符编码及SQL注入。

    注入拿数据

    在消灭了\之后,就可以通过进行SQL注入拿到数据了。

    以上面的代码为例来进行说明,最终的payload为

    1-1%df' union select 1,2,flag from flag%23

    这样最终执行的SQL注入语句为:

    1SELECT * FROM news WHERE id='-1運' union select 1,2,flag from flag#'

    但是出现了如下的问题:

    9b94cdf45687fbc8965af9c9b23240cb.png

    这样应该是编码的问题,将flag使用hex编码一下。

    最终使用-1%df' union select 1,2,hex(flag) from flag%23

    参考

    展开全文
  • 在一个CTF练习的网站,看到了一个宽字节注入的题目,我是一个web萌新,没什么经验,一开始也没有想到是宽字节,还是一位朋友给我提到的,让我猛然大悟,咳咳。。。做一些总结。练习题目网站地址:...
  • 宽字节转单字节 :size_twcstombs(char*mbstr,constwchar_t*wcstr,size_tcount);单字节转宽字节 :size_tmbstowcs(wchar_t*wcstr,constchar*mbstr,size_tcount);上面这两个是标准C++的,下面两个好像是微软的函数。...
  • 所有英文默认占一个字节,汉字占两个字节常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等等0x1 宽字节注入原理程序员为了防止sql注入,对用户输入中的单引号(’)进行处理,在单引号前加上斜杠(\)进行转义,...
  • 宽字节介绍原理即绕过演示 自己对宽字节的认识和理解,如果有错误望指出,共同学习。 宽字节的介绍 GBK 是占两个字节(也就是名叫宽字节,只要字节大于1的都是) ASCII 占一个字节 PHP中编码为GBK ,函数执行添加的...
  • 宽字节:一般是固定使用2个字节表示一个字符,utf-16(一般就是指unicode)。单字节编码:一个字节就表示一个字符,比如典型的ASCII码中的所有字符都是单字节编码的。1、MultiByteToWideChar 多字节转宽字节2、W...
  • 简介宽字节跨站漏洞多发生在GB系统编码。 对于GBK编码,字符是由两个字节构成,在%df遇到%5c时,由于%df的ascii大于128,所以会自动拼接%5c,吃掉反斜线。而%27 %20小于ascii(128)的字符就会保留。通常都会用反斜线...
  • About SQL Injection宽字节注入0x01 前言对于SQL注入,我估计搞安全的都玩的滚瓜烂熟了,搞站什么的都是分分钟来的,但是之前做了一道宽字节注入的题目,又打开了我一扇通往新世界的大门(PS:早都碰到过,只不过一直...
  • vs2005宽字节转多字节 const int bufSize = 512; TCHAR buffer2[bufSize]; //GetWindowText(buffer2, bufSize); GetWindowText(buffer2, bufSize); //std::string str2; //str2 = _bstr_t(buffer2)....
  • 宽字节sql

    2020-04-26 17:30:01
    什么是宽字节 1)GB2312 , GBK ,GB18030等都是常说的宽字节,实际为两字节(所有英文占一个字节,中文占两个字节) 宽字节如何产生的 如何验证是否存在 如何避免宽字节注入 1)用utf-8,避免宽字节注入 2)mysql...
  • 宽字节注入

    2020-05-31 19:49:54
    1.宽字节 GB2312,GBK,GB18030,BIG5,Shift JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。 GBK是一种多字符的编码,通常来说,一个gbk编码汉字,占用两个...
  • 所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII...(1)使用MultiByteToWideChar实现短字节转宽字节;具体使用方法如下:(头文件是#include)  char *data = "中国";  DWORD len = MultiByteToWideChar(CP_A
  • 在mysql中,用于转义的函数有addslashes,mysql_real_escape_...首先,宽字节注入与HTML页面编码是无关的,笔者曾经看到<meta charset=utf8>就放弃了尝试,这是一个误区,SQL注入不是XSS。虽然他们中编码的成...
  • 多字节与宽字节

    2017-08-03 14:50:46
    宽字节一般是固定使用2个字节表示一个字符,utf-16(一般就是指unicode)。//将多字节char*转化为宽字节wchar_t* wchar_t* AnsiToUnicode( const char* szStr ) { //计算需要多少个宽字节才能表示对应的多字节字符串
  • 最近在C++编程中经常遇到需要多字节字符与宽字节字符相互转换的问题,一直自己贴那几句代码。觉得麻烦,于是就自己写了一个类来封装wchar_t与char类型间的转换,其他的,诸如:CString\ LPWSTR\TCHAR CHAR\LPSTR之间...
  • 简介宽字节注入是相对于单字节注入而言的。单字节注入就是大家平时的直接在带有参数ID的URL后面 追回SQL语句进行注入。比如:http://www.hackest.cn/article.php?id=1and 1=1/*...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,096
精华内容 1,638
关键字:

宽字节