安云网 - AnYun.ORG | 专注于网络信息收集、网络数据分享、网络安全研究、网络各种猎奇八卦。
当前位置: 安云网 > 技术关注 > WEB安全 > php上传绕过及缺陷经验解说

php上传绕过及缺陷经验解说

时间:2015-05-11来源:WOOYUN 作者:_Evil点击:
1) GIF89A伪造文件头上传. 缺陷:文件只验证上传Type是否为 image/gif 等这样的类型, GIF89A 是用 CA32m 等这些 反汇编16进制 工作在文件头获取的! 例子:[link href= WooYun: anwsion最新版本任意上传漏洞(通杀所有。。。) ]_Evil[/link] 2)SQL查询绕过

1) GIF89A伪造文件头上传. 缺陷:文件只验证上传Type是否为image/gif等这样的类型,GIF89A是用CA32m  //安云网咨询系统

等这些反汇编16进制工作在文件头获取的! 

//安云网咨询系统


例子:[link href="WooYun: anwsion最新版本任意上传漏洞(通杀所有。。。)"]_Evil[/link] 

//copyright AnYun.ORG



2)SQL查询绕过(鸡助) 
如: $token = explode(".",$upload_filename); 

//copyright AnYun.ORG


....................................... 
$extension = $tokens[count($tokens)-1]; //获取最后一个后缀 
.............................. 
$result = forum_exec_query("SELECT * From $extensions_table WHERE extension = '$extension' AND file_type = 'Image'",$link); 
........................................................................................


需要GPC=off Apache解释漏洞  //安云网,anyun.org

我们上传文件:shell.xsser.php.' or 'a'='a //内容来自AnYun.ORG

闭合:.........extension = ' ' or 'a'='a' AND file_type = 'image'....... //安云网咨询系统

空 or 'a'='a' 就是进行了或运算: 错误 or 对 =对 这样就能使sql查询成功了! 而且Apache解释漏洞能获取Webshell
//安云网,anyun.org


3)strrpos()函数造成的漏洞 
//ANYUN.ORG
先介绍下strrpos()这函数: 


定义和用法  //内容来自AnYun.ORG

strrpos() 函数查找字符串在另一个字符串中最后一次出现的位置。 

如果成功,则返回位置,否则返回 false。 
语法 

strrpos(string,find,start) 

参数   描述 
string   必需。规定被搜索的字符串。 
find   必需。规定要查找的字符。 
start   可选。规定开始搜索的位置。

//安云网,anyun.org
看漏洞形成代码: 

.........  //安云网咨询系统
$upfiletype="gif|jpg"; 
............ 
$size=$_FILES['userfile']['size']; 
$strFileName=$_FILES['userfile']['name']; 
$arrName = explode(".",$strFilename); 
$intName = sizeof($arrName); 
$extName = strtolower($arrName[$intName-1]); //作用取得上传文件的后缀名. 

if (false !== strrpos($upfiletype,$extName)){} //问题出在这里. 

else{ 
echo "不允许上传".$extName."类型的文件"; 
exit;  //本文来自安云网

.......................................................

程序限制后缀为jpg何gif是吧,但是strrpos函数只读取一个字符串的,如: 
//copyright AnYun.ORG


jpg中有p字符,那么php也有p字符. 囧ORZ。。。。 就成功不返回false了。。。  //内容来自AnYun.ORG

<?php 

if (flase !== strrpos('jpg','php')){ 
echo "ture";  //内容来自AnYun.ORG
}else{ 
echo "ORZ"; 

?>


ture.jpg 

//安云网,anyun.org



4) move_uploaded_file()+rename()函数与某些逻辑缺陷 
//内容来自安云网
百度搜索下:ImgUpload V2.01汉化版里面的upload.php(文章字数关系不贴了.)  //内容来自AnYun.ORG

switch($_FILES[$whichfile]['error']这 
//内容来自安云网

是你上传文件的大小,小型一点的木马可以绕过. 

$split_ext = explode(',', $globalvars->settings['allowed_ext']);  //安云网咨询系统
    $split_img = explode('.', $_FILES[$whichfile]['name']);
//这个为我们上传的文件如xsser.php explode分割后 

$split_img[0]是xsser $split_img[1]是php  //安云网咨询系统

$globalvars->settings['allowed_ext']的值为 jpg:allow,jpeg:allow,png:allow,bmp:allow,gif:allow  //安云网咨询系统

$split_values = explode(':', $split_ext[$i]);//把上面那些数值:分割出来 成了 jpg allow jpeg allow 这样的类型.  //本文来自安云网


假如我们上传xsser.jpg 被分割成$split_img[0]是xsser,而$split_img[1]是jpg,那么$split_values[0]是jpg,$split_values[1]是allow 
//内容来自安云网


后面有if判断他们的关系. 

然后move_uploaded_file函数把我们的xsser.jpg移动到$user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name']这个目录里. 

//本文来自安云网



这个目录是我们的用户名注册产生的,如用户是xsser 那么目录就是xsser了。 
//copyright AnYun.ORG


if(move_uploaded_file ($_FILES[$whichfile]['tmp_name'], $user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name']))

//内容来自安云网


如果函数成功移动xsser.jpg到了xsser目录if语句就Ture
//安云网,anyun.org
随后rename函数将xsser.jpg进行改名字: 
rename($user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name'], $user_dat['usrdir'] . "/" . $split_img[0] . "." . strtolower 

//本文来自安云网



($split_img[1])); 

strtolower函数将文件后缀转换为小写.  //本文来自安云网

看着是没问题的,其实问题出在rename问题上: 
WINDOWS系统下,要想文件改名字失败,需要两种情况: 
//内容来自AnYun.ORG

1.已经有了这个用户名,文件名字不能重复。 
2.文件名字有特殊字符。


我们来看看这个判断:  //内容来自AnYun.ORG
if($split_values[0] == strtolower($split_img[1]) && $split_values[1] == "allow")

我们上传xsser.jpg.php  //安云网咨询系统
$split_img[1]是jpg $split_img[0]是xsser 我们的$split_img[2]是php 这个if没有判断$split_img[2],可以成功绕过

//本文来自安云网



到了下面的rename会改名为xsser.jpg 
//内容来自AnYun.ORG

rename($user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name'], $user_dat['usrdir'] . "/" . $split_img[0](xsser) . "." . 

strtolower($split_img[1])(jpg));
//上面的括号是我的注释

//内容来自安云网



如果我们上传两处的话呢? 

第一次上传xsser.jpg.php ->改名为xsser.jpg 

//copyright AnYun.ORG


第二次上传xsser.jpg.php ->尝试改名为xsser.jpg->但是文件存在不能改名->xsser.jpg.php出现了!!! 
//安云网,anyun.org


5)程序员对empty的错误认识 
//ANYUN.ORG


[link href="WooYun: 用友ICC网站客服系统远程代码执行漏洞"]only_guest[/link] 
//安云网咨询系统



$nameExt = strtolower($COMMON->getFileExtName($_FILES['Filedata']['name'])); $allowedType = array('jpg', 'gif', 'bmp', 'png', 
//安云网咨询系统


'jpeg'); if(!in_array($nameExt, $allowedType)){ $msg = 0; } if(empty($msg)){$filename = getmicrotime().'.'.$nameExt; 
    $file_url = urlencode($CONFIG->baseUrl.'data/files/'.$date."/".$filename); 
     
    $filename = $dest.$filename; 
............................................................


$msg = 0 然后if(empty($msg) 程序员对empty错误认识了,认为empty和0->flase 1->ture. empty函数只是判断参数是否为空,$msg=0了显然不为空了。。。 伤不起囧。。。。 

//安云网,anyun.org



6)程序缺陷一: 
//本文来自安云网

[link href="WooYun: 再暴用友ICC网站客服系统任意文件上传漏洞"]Jannock[/link] 

//内容来自AnYun.ORG



代码中: 
$filename = paramsFmt(urldecode($_GET["filename"])); //filename我们完全可以控制! 
//copyright AnYun.ORG

............................. 
然后: 
$nameExt = strtolower($COMMON->getFileExtName($_FILES['file']['name'])); 

$unallowedType = array('php', 'jsp', 'asp', 'sh', 'pl', 'js', 'jar', 'jad', 'class', 'java'); 
if(in_array($nameExt, $unallowedType)){ 
  if($ft == '1'){ 
    echo 'pe'; 
  }else if($ft == '2'){ 
    echo 'fe'; 
  }   
  exit;  //copyright AnYun.ORG
}

恩 对我们上传的程序进行了判断呢. 
...................................  //ANYUN.ORG
$filenameNew = $dest.$filename; //完全完全可以控制 

if(empty($_FILES["file"]['error'])){ 
  move_uploaded_file($_FILES["file"]["tmp_name"],$filenameNew); //上传了。 
....................................................................


伤不起啊$_GET["filename"]我们能直接赋值,果断能覆盖绕过啊~~~~~  //安云网,anyun.org

7)缺陷一归: 
[link href="WooYun: 再再暴用友ICC网站客服系统任意文件上传漏洞"]鬼哥用友软件再再暴用[/link] 

//安云网咨询系统



xxx.php. 这样一样可以解析为 php 的 绕过了expload分割数组验证,而且xx.php.某些系统能解释php. 
//ANYUN.ORG

修复判断:判断最后一个字符是否为. //内容来自AnYun.ORG

对于WINDOWS某些系统可以用xx.php (前面是空格)->WINDOWS系统可以忽略后面的空格变成xx.php,我们也可能绕过他们的某些防御!  //内容来自安云网

php截断上传 
xxx.php(NULL字节).jpg ice.php%00.gif (%00为php截断字符需要GPC为off,也需要php版本支持 //安云网,anyun.org
大家如果问如果gpc开启或者php版本高怎么办? 参考 HEX 20改00  //安云网咨询系统

[link href="WooYun: MyBlog存在任意文件上传漏洞"]某些java程序[/link] 方法用上面的php一样,不过java中的null就没限制了呵呵. 

//内容来自安云网



某些上传漏洞: 
php3 php4 php5 php7 

//内容来自安云网


PHP 
PHP3 
phtml

pHp->大小写 
pphphp->(经过过滤)->php 
//ANYUN.ORG

还有一些奇葩的格式听说可以:x."php"  x.'php
//内容来自安云网
.htaccess文件很牛逼哦 配合CGI程序: 
<FilesMatch "_php.gif">  //ANYUN.ORG
SetHandler application/x-httpd-php 
</FilesMatch>


文件改后缀shell.php.gif能解释php
//copyright AnYun.ORG


//内容来自安云网


//copyright AnYun.ORG

--经典回复

//安云网,anyun.org

//安云网,anyun.org

1#_Evil | 2012-12-11 18:40

//本文来自安云网

@xsser 雄起! //内容来自安云网

  //内容来自安云网

2#y35u | 2012-12-11 19:23 //安云网,anyun.org

还少几种 //copyright AnYun.ORG

 

//内容来自安云网

3#yy520 | 2012-12-11 19:42

//ANYUN.ORG

flase !== strrpos('jpg','php')

//内容来自安云网

  这个我真的就不想吐槽了.... //安云网咨询系统

 

//安云网,anyun.org

4#风萧萧 | 2012-12-11 21:55 //安云网咨询系统

娃子不错

//安云网,anyun.org

 

//本文来自安云网

5#_Evil | 2012-12-11 22:52 //本文来自安云网

@yy520 哥哥原谅我。 - - 我sb了 //安云网咨询系统

 

//ANYUN.ORG

6#_Evil | 2012-12-11 22:53

//本文来自安云网

@y35u 你来续写来感谢wb 哈哈 //ANYUN.ORG

  //copyright AnYun.ORG

7#蟋蟀哥哥 | 2012-12-12 00:00

//ANYUN.ORG

不错。建议继续连载再给出大纲 //内容来自安云网

 

//内容来自AnYun.ORG

8#感谢(1)hacx | 2012-12-12 10:06

//安云网咨询系统

@_Evil 打错了flase.jpg //安云网咨询系统

<?php  //安云网咨询系统

if (FALSE  !== strrpos('jpg','php')){  //本文来自安云网

echo "ture";  //copyright AnYun.ORG

}else{ 

//安云网,anyun.org

echo "ORZ";  //内容来自安云网

//内容来自AnYun.ORG

?> //copyright AnYun.ORG

2.jpg //ANYUN.ORG

http://php.net/manual/zh/function.strrpos.php //安云网,anyun.org

(PHP 4, PHP 5) //安云网咨询系统


//内容来自安云网

strrpos — 计算指定字符串在目标字符串中最后一次出现的位置 //内容来自AnYun.ORG


//copyright AnYun.ORG

int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )

//安云网,anyun.org

返回字符串 haystack 中 needle 最后一次出现的数字位置。注意 PHP4 中,needle 只能为单个字符。如果 needle 被指定为一个字符串,那么将仅使用第一个字符。 //安云网咨询系统

 

//内容来自安云网

9#possible | 2012-12-12 13:03 //内容来自AnYun.ORG

要连载呀 呵呵 flase !== strrpos('jpg','php') 我看了半天 以为这个函数这么神奇 就检查第一个字符,原来是打错了 //内容来自安云网

 

//内容来自安云网

10#_Evil | 2012-12-12 13:14 //内容来自AnYun.ORG

@hacx - - 知道打错了 yy520说了

//安云网咨询系统

  //内容来自AnYun.ORG

11#_Evil | 2012-12-12 13:15

//安云网,anyun.org

png php的说 @hacx @possible //安云网,anyun.org

  //安云网,anyun.org

12#_Evil | 2012-12-12 13:16

//copyright AnYun.ORG

png php的说 @hacx @possible //内容来自安云网

  //本文来自安云网

13#yexin | 2012-12-12 15:31 //内容来自AnYun.ORG

好贴要来mark下

//内容来自安云网

  //ANYUN.ORG

14#一粒米 | 2012-12-13 10:11

//copyright AnYun.ORG

第5个,楼主应该是理解错误了。举例中的逻辑错误正好相反。

//内容来自安云网

 

//本文来自安云网

15#_Evil | 2012-12-13 13:01

//本文来自安云网

@一粒米 那是第3个 是个失误。。。

//copyright AnYun.ORG

  //本文来自安云网

16#hacx | 2012-12-13 14:21

//copyright AnYun.ORG

@_Evil 一粒米 说的是empty函数弄反了。

//安云网,anyun.org

http://cn2.php.net/empty

//本文来自安云网

empty

//内容来自安云网


//内容来自AnYun.ORG

(PHP 4, PHP 5) //安云网,anyun.org


//本文来自安云网

empty — 检查一个变量是否为空

//安云网咨询系统


//本文来自安云网

bool empty ( mixed $var ) //安云网咨询系统

如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

//内容来自安云网

  //内容来自安云网

17#_Evil | 2012-12-13 20:17 //内容来自AnYun.ORG

@hacx @一粒米 失误失误。。。 - - 起稿错了 下次会注意的

//本文来自安云网

 

//copyright AnYun.ORG

18#_Evil | 2012-12-13 21:47

//内容来自安云网

@hacx 请朋友发联系QQ到 [email protected] 欢迎吐曹 欢迎讨论 共同研究 呵呵

//安云网咨询系统

 

//安云网咨询系统

19#net2 | 2013-11-11 16:57 //ANYUN.ORG

你们这帮2货啊。误人子弟。自己去查下手册啊。乱解释。 //安云网咨询系统

 

//copyright AnYun.ORG

20#黑色的屌丝 | 2013-11-11 17:23 //ANYUN.ORG

但是思路还是好的

//本文来自安云网

  //安云网,anyun.org

21#Wdot | 2013-11-11 18:06 //ANYUN.ORG

php >$a=0;

//copyright AnYun.ORG

php > var_dump(empty($a));

//内容来自AnYun.ORG

bool(true)

//内容来自安云网


//内容来自AnYun.ORG

等于0怎么就不为真了

//安云网咨询系统

  //安云网咨询系统

22#D&G | 2014-10-15 10:48

//安云网咨询系统

有个小失误或者笔误,$msg=0了显然不为空了。。。 伤不起囧。。。    $msg=0 ;empty($msg); 返回是True才对,所以才会进行下面的处理逻辑。

//安云网,anyun.org

  //内容来自安云网

23#D&G | 2014-10-15 10:48 //安云网,anyun.org

。。。。我错了。原来都讨论过了。。。没看评论。。 //copyright AnYun.ORG

  //内容来自安云网

24#回复此人 | 2015-04-23 23:23

//本文来自安云网

路过,新手获益非浅,受教了 //ANYUN.ORG



//ANYUN.ORG

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片
相关内容
推荐内容