[关闭]
@1kbfree 2018-05-08T16:34:46.000000Z 字数 1369 阅读 1145

[初级]代码审计之逻辑上传漏洞挖掘

代码审计


选自:http://www.php0.net/index.php?m=content&c=index&a=show&catid=6&id=19166

只是给这篇文章里面的代码做一些注释,让更多的人看得懂~

  1. if($operateId == 1){ //第一个{}开始
  2. $date = date("Ymd"); //获取时间(Y是年;m是月;d是日)
  3. $dest = $CONFIG->basePath."data/files/".$date."/"; //路径(以时间命名的文件夹)
  4. $COMMON->createDir($dest); //创建这个文件夹
  5. $nameExt = strtolower($COMMON->getFileExtName($_FILES['Filedata']['name'])); //获取上传的文件的后缀名并且都转成小写。
  6. $allowedType = array('jpg', 'gif', 'bmp', 'png', 'jpeg'); //白名单思想,只有数组里面有的后缀名才能上传
  7. if(!in_array($nameExt, $allowedType)){ //如果后缀名不在数组里
  8. $msg = 0;
  9. } //第一个{}结束
  10. if(empty($msg)){ //如果$msg是""(空)、0、"0"、NULL、FALSE、array()、var $var那么返回True
  11. $filename = getmicrotime().'.'.$nameExt; //这个是以时间来设置文件名(这个函数应该是他们自己写的,我也不知道功能是什么,大概就是获取时间吧~)
  12. $file_url = urlencode($CONFIG->baseUrl.'data/files/'.$date."/".$filename); //拼接文件的地址
  13. $filename = $dest.$filename; //文件绝对路径
  14. if(empty($_FILES['Filedata']['error'])){ 如果错误报告为空(也就是没报错)
  15. move_uploaded_file($_FILES['Filedata']['tmp_name'],$filename); //移动文件到文件绝对路径
  16. }
  17. if (file_exists($filename)){
  18. $msg = $file_url;
  19. @chmod($filename, 0444);
  20. }else{
  21. $msg = 0;
  22. }
  23. }
  24. $outMsg = "fileUrl=".$msg;
  25. $_SESSION["eoutmsg"] = $outMsg;
  26. exit;
  27. }

empty用法.png-56.6kB

  1. if (empty(0)){
  2. echo 0;
  3. }
  4. /*
  5. * 返回的结果为0
  6. */

所以上面的代码中有一段是这样的:

  1. $allowedType = array('jpg', 'gif', 'bmp', 'png', 'jpeg');
  2. if(!in_array($nameExt, $allowedType)){
  3. /*
  4. * 这里的是判断后缀是否在数组中,如果在$msg的值为0,也就是说,不管我们上传的是不是合法文件,我们都可以上传,因为empty(0)也是返回True,写这个程序的程序员肯定是以为empty函数是判断变量是否存在的,其实并不是。因为误解所以才会这样操作,使$msg赋值为0,导致empty(0)返回的任然为True
  5. */
  6. $msg = 0;
  7. }

image_1cc6m0c9u1iec1i9t19171c4c15tvm.png-14.6kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注