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

admin 2021年4月3日19:26:27评论28 views字数 5050阅读16分50秒阅读模式

1) GIF89A伪造文件头上传.

缺陷:文件只验证上传Type是否为image/gif等这样的类型,GIF89A是用CA32m

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

例子:_Evil

2)SQL查询绕过(鸡助)

  1. 如: $token = explode(".",$upload_filename);
  2. .......................................
  3. $extension = $tokens[count($tokens)-1]; //获取最后一个后缀
  4. ..............................
  5. $result = forum_exec_query("SELECT * From $extensions_table WHERE extension = '$extension' AND file_type = 'Image'",$link);
  6. ........................................................................................

需要GPC=off Apache解释漏洞

我们上传文件:

  1. shell.xsser.php.' or 'a'='a

闭合:

  1. .........extension = ' ' or 'a'='a' AND file_type = 'image'.......

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

3)strrpos()函数造成的漏洞

先介绍下strrpos()这函数:

  1. 定义和用法
  2. strrpos() 函数查找字符串在另一个字符串中最后一次出现的位置。
  3. 如果成功,则返回位置,否则返回 false
  4. 语法
  5. strrpos(string,find,start)
  6. 参数 描述
  7. string 必需。规定被搜索的字符串。
  8. find 必需。规定要查找的字符。
  9. start 可选。规定开始搜索的位置。

看漏洞形成代码:

  1. .........
  2. $upfiletype="gif|jpg";
  3. ............
  4. $size=$_FILES['userfile']['size'];
  5. $strFileName=$_FILES['userfile']['name'];
  6. $arrName = explode(".",$strFilename);
  7. $intName = sizeof($arrName);
  8. $extName = strtolower($arrName[$intName-1]); //作用取得上传文件的后缀名.
  9. if (false !== strrpos($upfiletype,$extName)){} //问题出在这里.
  10. else{
  11. echo "不允许上传".$extName."类型的文件";
  12. exit;
  13. }
  14. .......................................................

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

jpg中有p字符,那么php也有p字符. 囧ORZ。。。。 就成功不返回false了。。。

4) move_uploaded_file()+rename()函数与某些逻辑缺陷

百度搜索下:ImgUpload V2.01汉化版里面的upload.php(文章字数关系不贴了.)

  1. switch($_FILES[$whichfile]['error']

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

  1. $split_ext = explode(',', $globalvars->settings['allowed_ext']);
  2. $split_img = explode('.', $_FILES[$whichfile]['name']);
  3. //这个为我们上传的文件如xsser.php explode分割后

$split_img[0]是xsser $split_img[1]是php

  1. $globalvars->settings['allowed_ext']

的值为 jpg:allow,jpeg:allow,png:allow,bmp:allow,gif:allow

  1. $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移动到

  1. $user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name']

这个目录里.

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

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

如果函数成功移动xsser.jpg到了xsser目录if语句就Ture.

随后rename函数将xsser.jpg进行改名字:

  1. rename($user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name'], $user_dat['usrdir'] . "/" . $split_img[0] . "." . strtolower
  2. ($split_img[1]));

strtolower函数将文件后缀转换为小写.

看着是没问题的,其实问题出在rename问题上:

WINDOWS系统下,要想文件改名字失败,需要两种情况:

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

2.文件名字有特殊字符。

我们来看看这个判断:

  1. 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

  1. rename($user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name'], $user_dat['usrdir'] . "/" . $split_img[0](xsser) . "." .
  2. strtolower($split_img[1])(jpg));
  3. //上面的括号是我的注释.

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

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

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

5)程序员对empty的错误认识

only_guest

  1. $nameExt = strtolower($COMMON->getFileExtName($_FILES['Filedata']['name'])); $allowedType = array('jpg', 'gif', 'bmp', 'png',
  2. 'jpeg'); if(!in_array($nameExt, $allowedType)){ $msg = 0; } if(empty($msg)){$filename = getmicrotime().'.'.$nameExt;
  3. $file_url = urlencode($CONFIG->baseUrl.'data/files/'.$date."/".$filename);
  4.  
  5. $filename = $dest.$filename;
  6. ............................................................

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

6)程序缺陷一:

Jannock

代码中:

  1. $filename = paramsFmt(urldecode($_GET["filename"])); //filename我们完全可以控制!
  2. .............................
  3. 然后:
  4. $nameExt = strtolower($COMMON->getFileExtName($_FILES['file']['name']));
  5. $unallowedType = array('php', 'jsp', 'asp', 'sh', 'pl', 'js', 'jar', 'jad', 'class', 'java');
  6. if(in_array($nameExt, $unallowedType)){
  7. if($ft == '1'){
  8. echo 'pe';
  9. }else if($ft == '2'){
  10. echo 'fe';
  11. }
  12. exit;
  13. }

恩 对我们上传的程序进行了判断呢.

  1. ...................................
  2. $filenameNew = $dest.$filename; //完全完全可以控制
  3. if(empty($_FILES["file"]['error'])){
  4. move_uploaded_file($_FILES["file"]["tmp_name"],$filenameNew); //上传了。
  5. ....................................................................

伤不起啊$_GET["filename"]我们能直接赋值,果断能覆盖绕过啊~~~~~

7)缺陷一归:

鬼哥用友软件再再暴用

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

修复判断:判断最后一个字符是否为

  1. .

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

php截断上传

xxx.php(NULL字节).jpg ice.php%00.gif (%00为php截断字符需要GPC为off,也需要php版本支持)

大家如果问如果gpc开启或者php版本高怎么办? 参考 HEX 20改00

某些java程序 方法用上面的php一样,不过java中的null就没限制了呵呵.

某些上传漏洞:

  1. php3 php4 php5 php7
  2. PHP
  3. PHP3
  4. phtml

pHp->大小写

pphphp->(经过过滤)->php

还有一些奇葩的格式听说可以:

  1. x."php" x.'php

.htaccess文件很牛逼哦 配合CGI程序:

  1. SetHandler application/x-httpd-php

文件改后缀shell.php.gif能解释php!

吐槽WB.

转自:http://zone.wooyun.org/content/1910


精彩评论:

hacx |2012-12-12 10:06

@_Evil 打错了

http://php.net/manual/zh/function.strrpos.php

(PHP 4, PHP 5)

strrpos — 计算指定字符串在目标字符串中最后一次出现的位置

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

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

文章来源于lcx.cc:php上传绕过及缺陷经验解说

相关推荐: 【vb知识】VB Ascii 码对照表

Ascii 码对照表 文章来源于lcx.cc:【vb知识】VB Ascii 码对照表相关推荐: 【Asp】ASP接收Post的Byte数组数据并保存ASP接收Post来的二进制/Byte数组数据,并保存为文件: Server.ScriptTimeout=360…

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年4月3日19:26:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   php上传绕过及缺陷经验解说http://cn-sec.com/archives/322515.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息