PHPMyAdmin 4.8.0 – 4.8.1远程执行代码

  • A+
所属分类:网络安全文章
阿里


推广者专属福利,新客户无门槛领取总价值高达2775元代金券,每种代金券限量500张,先到先得。

PHPMyAdmin 4.8.0 - 4.8.1远程执行代码

我在index.phpPMA 4.8.0~4.8.1中发现了一个文件包含漏洞,它被分配了CVE-2018-12613。它是由脆弱路径检查功能中的验证旁路导致的Core::checkPageValidity。此漏洞使经过身份验证的远程攻击者能够在服务器上执行任意PHP代码。

有一个文件包含在index.php:

  1. if(!emptyempty($ _ REQUEST ['target'])
  2.     && is_string($ _ REQUEST ['target'])
  3.     &&!preg_match('/ ^ index /',$ _REQUEST ['target'])
  4.     &&!in_array($ _ REQUEST [ 'target'],$ target_blacklist)
  5.     && Core :: checkPageValidity($ _ REQUEST ['target'])
  6. ){
  7.     include $ _REQUEST ['target'];
  8.     出口;
  9. }
  10. // ...

这个include 过去常常被if声明中的条件所保护,但在4.8.0版本中,最后一个检查被改为重用现有的函数,Core::checkPageValidity我认为这个函数是用来检查URL路径的。因此,我们可以利用URL功能来达到任意文件包含。功能如下:

  1. public static function checkPageValidity(&page,array $ whitelist = [])
  2. {
  3.     // ... 
  4.     $ _page = mb_substr(
  5.         $ page,
  6.         0,
  7.         mb_strpos($ page。'?','?')
  8.     );
  9.     // $ whitelist == array('db_datadict.php','sql.php',...)
  10.     if(in_array($ _ page,$ whitelist)){
  11.         return true;
  12.     }
  13.     // ... 
  14.     返回false;
  15. }

该函数?从$page后面的所有内容(后面的 所有内容 ?都是查询字符串,它不是URL 路径的一部分)中检查它是否在白名单中。白名单是一个列表:'db_datadict.php', 'sql.php', ...。

Payload
现在我们可以完全控制$page,直接来自$_REQUEST['target'],我们可以将其设置为:

部分内容被隐藏
需登陆后可查看

该功能然后执行其检查:
剥去一切后 ?,分配'sql.php'给$_page
检查$_page,即'sql.php',在白名单中?是
通过支票后,回到index.php:

  1. 包括$ _REQUEST ['target'];

所以漏洞执行代码是这样的:

部分内容被隐藏
需登陆后可查看

%3f 将被解码并成为 ?
Core::checkPageValidity剥离所有内容 ?并sql.php在白名单内找到:检查被绕过!
index.php运行include 'sql.php?/../../etc/passwd',PHP有这个魔术来转换路径 ../etc/passwd,而不检查目录是否sql.php?存在。最后,它包括 ../etc/passwd成功。

CE安全网

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: