1) GIF89A 伪造文件头上传 . 缺陷:文件只验证上传Type是否为 image/gif 等这样的类型, GIF89A 是用 CA32m 等这些 反汇编 16 进制 工作在文件头获取的! 2)SQL 查询绕过 ( 鸡助 )
如: $token = explode(".",$upload_filename); ....................................... $extension = $tokens[count($tokens)-1]; //获取最后一个后缀 .............................. $result = forum_exec_query("SELECT * From $extensions_table WHERE extension = '$extension' AND file_type = 'Image'",$link); ........................................................................................
需要GPC=off Apache解释漏洞 我们上传文件:shell.xsser.php.' or 'a'='a
闭合:.........extension = ' ' or 'a'='a' AND file_type = 'image'.......
空 or 'a'='a' 就是进行了或运算: 错误 or 对 = 对 这样就能使sql查询 成功 了! 而且 Apache 解释漏洞 能获取 Webshell . 3)strrpos() 函数造成的漏洞 先介绍下strrpos()这函数:定义和用法 strrpos() 函数查找字符串在另一个字符串中最后一次出现的位置。 如果成功,则返回位置,否则返回 false。 语法 strrpos(string,find,start) 参数 描述 string 必需。规定被搜索的字符串。 find 必需。规定要查找的字符。 start 可选。规定开始搜索的位置。
看漏洞形成代码:......... $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函数只读取 一个字符串 的,如: jpg中有 p 字符,那么php也有 p 字符. 囧ORZ。。。。 就成功不返回false了。。。<?php if (flase !== strrpos('jpg','php')){ echo "ture"; }else{ echo "ORZ"; } ?>
4) move_uploaded_file()+rename() 函数与某些逻辑缺陷 百度搜索下: ImgUpload V2.01 汉化版 里面的 upload.php (文章字数关系不贴了.)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 了。 if(move_uploaded_file ($_FILES[$whichfile]['tmp_name'], $user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name'])) 如果函数成功移动xsser.jpg到了xsser目录if语句就 Ture . 随后 rename 函数将xsser.jpg进行改名字: rename($user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name'], $user_dat['usrdir'] . "/" . $split_img[0] . "." . strtolower ($split_img[1])); strtolower 函数将文件后缀转换为小写. 看着是没问题的,其实问题出在rename问题上: WINDOWS系统下,要想文件改名字失败,需要两种情况: 1.已经有了这个用户名,文件名字不能重复。 2.文件名字有特殊字符。 我们来看看这个判断: 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 rename($user_dat['usrdir'] . "/" . $_FILES[$whichfile]['name'], $user_dat['usrdir'] . "/" . $split_img[0](xsser) . "." . strtolower($split_img[1])(jpg)); //上面的括号是我的注释. 如果我们上传两处的话呢? 第一次上传xsser.jpg.php ->改名为xsser.jpg 第二次上传xsser.jpg.php ->尝试改名为xsser.jpg->但是文件存在 不能改名 ->xsser.jpg.php出现了!!! 5) 程序员对 empty 的错误认识 only_guest $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了显然不为空了。。。 伤不起囧。。。。 6) 程序缺陷一 : Jannock 代码中: $filename = paramsFmt(urldecode($_GET["filename"])); //filename我们完全可以控制! ............................. 然后: $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; } 恩 对我们上传的程序进行了判断呢. ................................... $filenameNew = $dest.$filename; //完全完全可以控制 if(empty($_FILES["file"]['error'])){ move_uploaded_file($_FILES["file"]["tmp_name"],$filenameNew); //上传了。 .................................................................... 伤不起啊 $_GET["filename"] 我们能 直接赋值 ,果断能 覆盖绕过 啊~~~~~ 7) 缺陷一归 : 鬼哥用友软件再再暴用 xxx.php. 这样一样可以解析为 php 的 绕过了 expload 分割数组 验证,而且 xx.php. 某些系统能解释 php. 修复判断 :判断最后一个字符是否为.
对于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就 没限制 了呵呵. 某些上传 漏洞 : php3 php4 php5 php7 PHP PHP3 p html pHp-> 大小写 pphphp->( 经过过滤 )->php 还有一些奇葩的格式听说可以:x."php" x.'php
.htaccess 文件很牛逼哦 配合CGI程序: <FilesMatch "_php.gif"> SetHandler application/x-httpd-php </FilesMatch> 文件改后缀 shell.php.gif 能解释 php ! 吐槽WB 精彩评论: hacx |2012-12-12 10:06 @_Evil 打错了 <?php if (FALSE !== strrpos('jpg','php')){ echo "ture"; }else{ echo "ORZ"; } ?> 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 被指定为一个字符串,那么将仅使用第一个字符查看更多关于php上传绕过及缺陷经验解说 - 网站安全 - 自学p的详细内容...