易思ESPCMS(2014)敏感函數回溯參數的審計學習

主要是學習尹毅大佬那本審計學習的書的筆記

首先安裝好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

然後按照常規注入就行
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章