主要是學習尹毅大佬那本審計學習的書的筆記
首先安裝好CMS系統信息,如果需要該版本cms的,可以私信我。
Seay工具自動審計
選取一段可能存在漏洞的代碼,進入該文件目錄下,發現這段代碼
function oncitylist() {
$parentid = $this->fun->accept('parentid', 'R');
$parentid = empty($parentid) ? 1 : $parentid;
$verid = $this->fun->accept('verid', 'R');
$verid = empty($verid) ? 0 : $verid;
$db_table = db_prefix . 'city';
$sql = "select * from $db_table where parentid=$parentid";
$rs = $this->db->query($sql);
其中
$parentid = $this->fun->accept('parentid', 'R');
可以很清晰的看到變量傳遞的一個過程,定位一下accept函數
Public文件夾應該是公共函數,進去後可以看到
代碼如下
function accept($k, $var = 'R', $htmlcode = true, $rehtml = false) {
switch ($var) {
case 'G':
$var = &$_GET;
break;
case 'P':
$var = &$_POST;
break;
case 'C':
$var = &$_COOKIE;
break;
case 'R':
$var = &$_GET;
if (empty($var[$k])) {
$var = &$_POST;
}
break;
}
$putvalue = isset($var[$k]) ? $this->daddslashes($var[$k], 0) : NULL;
return $htmlcode ? ($rehtml ? $this->preg_htmldecode($putvalue) : $this->htmldecode($putvalue)) : $putvalue;
}
獲取GET、POST、COOKIE參數值後,會將k變量進行daddslashes函數過濾, daddslashes會把單引號(’)、雙引號(")、反斜線(\)與 NUL(NULL 字符)進行轉義。而在function oncitylist()中數據庫查詢的語句是這樣的,並沒有對$parentid進行引號閉合,所以可以構造數字型注入,payload不會被轉義
$sql = "select * from $db_table where parentid=$parentid";
那怎麼才能找到web頁面parentid接口處的url值呢,如下圖所示oncitylist函數在importan
類中,對該import類進行全局搜索
定位到important函數處
$archive = indexget('archive', 'R');
$archive = empty($archive) ? 'adminuser' : $archive;
$action = indexget('action', 'R');
$action = empty($action) ? 'login' : $action;
if (in_array($archive, array('acmessagemain', 'adminuser', 'advertmain', 'adverttypemain', 'albummain', 'article', 'bbsmain', 'bbstypemain', 'callmain',
'citylist', 'connected', 'createmain', 'createseomain', 'enquirymain', 'filemain', 'filemanage', 'formmain', 'formmessmain', 'language', 'languagepack',
'lib_menu', 'mailinvite', 'mailsendmain', 'mailtemplatemain', 'management', 'memattmanage', 'membermain', 'memclassmanage', 'modelmanage', 'ordermain',
'payplug', 'payreceipt', 'powergroup', 'printtemplatemain', 'recommanage', 'seomanage', 'shipplug', 'shipreceipt', 'sitemain', 'skinmain', 'sqlmanage', 'smstemplatemain',
'subjectmanage', 'templatemain', 'typemanage', 'mobliemain', 'smsmain'))) {
if (!file_exists(admin_ROOT . adminfile . "/control/$archive.php")) {
exit('Access error!');
}
include admin_ROOT . adminfile . "/control/$archive.php";
$control = new important();
$action = 'on' . $action;
if (method_exists($control, $action)) {
$control->$action();
} else {
exit('´íÎó£ºÏµÍ³·½·¨´íÎó£¡');
}
主要還是這兩句
$archive = indexget('archive', 'R');
$archive = empty($archive) ? 'adminuser' : $archive;
$action = indexget('action', 'R');
$action = empty($action) ? 'login' : $action;
archive 可控,調用citylist文件裏的citilist方法,citilist方法中調用parentid參數。所以構造的payload爲
http://127.0.0.1/espcms/adminsoft/index.php?archive=citylist&action=citylist&parentid=1
然後按照常規注入就行