php寬位元組注入, 投稿 寬位元組注入詳解

2021-10-25 21:32:37 字數 3005 閱讀 1705

前言

在mysql中,用於轉義的函式有addslashes,mysql_real_escape_string,mysql_escape_string等,還有一種情況是magic_quote_gpc,不過高版本的php將去除這個特性。

首先,寬位元組注入與html頁面編碼是無關的,筆者曾經看到

default

就放棄了嘗試,這是乙個誤區,sql注入不是xss。雖然他們中編碼的成因相似,不過發生的地點不同。

很多網上的材料都說程式使用了寬位元組來處理程式,卻又不指出具體是指什麼程式。本文就介紹一下具體漏洞發生的原理與簡單的利用。在這裡我們限定使用的語言是php5.4,資料庫mysql5.6。

涉及到的一些概念

字元、字符集與字元序

字元(character)是組成字符集(character set)的基本單位。對字元賦予乙個數值(encoding)來確定這個字元在該字符集中的位置。

字元序(collation)指同一字符集內字元間的比較規則。

utf8

由於ascii表示的字元只有128個,因此網路世界的規範是使用unicode編碼,但是用ascii表示的字元使用unicode並不高效。因此出現了中間格式字符集,被稱為通用轉換格式,及utf(universal transformation format)。

寬位元組gb2312、gbk、gb18030、big5、shift_jis等這些都是常說的寬位元組,實際上只有兩位元組。寬位元組帶來的安全問題主要是吃ascii字元(一位元組)的現象。

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設定值進行了一次編碼。

php測試**:

default

<?php

error_reporting(0);

$conn = mysql_connect('127.0.0.1','root','');

mysql_select_db('mysql',$conn);

mysql_query("set names gbk"); //不安全的編碼設定方式

$res = mysql_query("show variables like 'character%';"); //顯示當前資料庫設定的各項字符集

同樣可以執行成功,編碼解析的過程依然如上。

總結一下漏洞成因:

**一1、使用了不安全的字符集設定函式與過濾函式。

2、漏洞發生在php請求mysql時使用character_set_client值進行一次轉碼。

**二1、使用了推薦的設定函式與過濾函式。

2、解析錯誤發生在iconv()函式轉碼時,gbk轉向utf8吃掉了「\」

3、php請求mysql時轉碼安全。

另外:當改變編碼方向時$user = iconv(『utf-8』, 『gbk』,$user);

這種情況下需要兩個引數來配合注入。

例如:default

總結:寬位元組注入跟html頁面編碼無關。

mysql編碼與過濾函式推薦使用mysql_real_escape_string(),mysql_set_charset()。

轉編碼函式同樣會引起寬位元組注入,即使使用了安全的設定函式。

參考文獻

mysql字符集的設定:

賞金發放情況:本文獲得賞金100rmb,已於4.3日發放到作者賬號。

徵稿啟事:91ri一直相信「你不與人分享,誰與你分享」,分享的確是件非常有意義的事情。為了讓優秀的同學有地方分享自己的獨到見解,也為了讓更多同學從分享中受益,同時我們也希望給那些願意分享的小夥伴們一點點心意作為感謝,所以我們隆重了推出「有獎徵文」活動!本次活動的詳情可以圍觀《徵稿啟事》

寬位元組注入

大家都知道 df 被php轉義 開啟gpc 用addslashes函式,或者icov等 單引號被加上反斜槓 變成了 df 其中 的十六進製制是 5c 那麼現在 df df 5c 27,如果程式的預設字符集是gbk等寬位元組字符集,則mysql用gbk的編碼時,會認為 df 5c 是乙個寬字元,也就是...

寬位元組注入

在使用php連線mysql的時候,當設定 set character set client gbk 時會導致乙個編碼轉換的問題,也就是我們熟悉的寬位元組注入,當存在寬位元組注入的時候,注入引數裡帶入 df 27,即可把 5c 吃掉,舉個例子。當提交 1 1 23 時,mysql的執行的sql語句為 ...

寬位元組注入

這個md的 是我之前做南郵的一道sql注入題目,我實在是調動目前所學的sql注入知識沒做出來,一直搞不懂將 轉義為 因此去網上看了一下wp,是考寬位元組注入,於是在網上找了教程學習一下,這個文章只是為了記錄一下自己的學習過程,不喜勿噴,有錯希望指正 寬位元組注入指的是mysql資料庫在使用寬位元組 ...