集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:400-111-8989  |   联系客服   |
当前位置:主页 > 培训课程 > 网络工程 >

成都网络安全培训:文件上传漏洞全面渗透姿势总结

发布者: 成都达内     浏览次数:     发布时间:2021-03-22 09:50:56

成都网络安全培训:文件上传漏洞是进行渗透是比较常见好利用的漏洞,利用它能够直接上传webshell,进行连接,是比较常见的攻击方式。针对文件上传场景检测和绕过进行了全面姿势总...

  0x00 文件上传场景

  (本文档只做技术交流,切勿进行违法犯罪操作,请做一个好人,不给别人添麻烦)

  文件上传的场景真的随处可见,不加防范小心,容易造成漏洞,造成信息泄露,甚至更为严重的灾难。

  再次声明:大家在自己的搭建的环境里面测试,不要给别人造成麻烦哈。

  文件上传漏洞是进行渗透是比较常见好利用的漏洞,利用它能够直接上传webshell,进行连接,是比较常见的攻击方式。针对文件上传场景检测和绕过进行了全面姿势总结。

  0x01 渗透姿势全面分析

  针对一个文件上传场景,首先判断是客户端JS校验还是服务器校验,判断依据:上传非法文件,返回结果是否很快?

  1.客户端JavaScript检测

  如果上传非法文件,返回结果很快,或者F12打开开发者模式,上传非法文件,发现没有网络请求,但是被拦截了,很有可能就是客户端进行了JS校验检测。这种前端采用JS限制上传类型和大小的方式:

  script type="text/javascript"

  function checkFile() {

  var file = document.getElementsByName('upload_file')[0].value;

  if (file == null || file == "") {

  alert("请选择要上传的文件!");

  return false;

  }

  //定义允许上传的文件类型

  var allow_ext = ".jpg|.png|.gif";

  //提取上传文件的类型

  var ext_name = file.substring(file.lastIndexOf("."));

  //判断上传文件类型是否允许上传

  if (allow_ext.indexOf(ext_name) == -1) {

  var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;

  alert(errMsg);

  return false;

  }

  }

  /script

  很是鸡肋,绕过思路:1.直接本地禁用JS,不让其做检测 2.抓包,修改文件后缀名类型,绕过检测限制

  2.服务器后端检测

  服务器后端检测有较多方式,普遍分为文件类型检测,文件头类型,文件扩展名名单检测,文件内容检测,接下来进行简要分析。

  a.文件类型检测

  此类检测防护主要是从content-type进行检测,检验请求中content-type是否符合可接受的上传类型(如"image/gif","image/png","image/jpeg")

  if (isset($_POST['submit'])) {

  if (file_exists(UPLOAD_PATH)) {

  if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {

  $temp_file = $_FILES['upload_file']['tmp_name'];

  $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];

  if (move_uploaded_file($temp_file, $img_path)) {

  $is_upload = true;

  绕过思路:抓包将content-type改为可接受图片形式,即可绕过

  b.文件头类型检测

  上个文件类型是检测content-type,比较好伪造,这个则是使用getimagesize()函数来获取文件的MIME类型,通过文件头进行判断文件类型

  if(file_exists($filename)){

  $info = getimagesize($filename);

  文件头就是文件特定的标志,如二进制PE文件的4D5A,bmp文件的424D,zip文件的504B0304,各种常见文件的文件头类型大家可以查找了解一下,常见图片文件头如下:

  gif: GIF89a

  jpg,jpeg: FF D8 FF

  png: 89 50 4E 47 0D 0A

  绕过思路:针对这种,上传木马恶意文件时,先使用编辑工具在数据最前面添加图片的文件头进行伪造,即可绕过

  c.文件扩展名检测

  这种类型有基于黑名单检测和白名单检测。通常基于黑名单是很不安全的,黑名单机制:只拦截名单中出现的扩展后缀名,其余默认放行。这就取决于名单中的扩展后缀名覆盖能力范围了,很难把所有的考虑全面,就很容易造成漏洞。

  黑名单绕过思路:可以从服务器的解析特性进行分析,如特殊可解析后缀php3,php7,phtml,jspx等 如特殊的解析方式陌生后缀名,带换行后缀名,双后缀名等解析差异造成的漏洞。 还可以从混淆方面出发,后缀名大小写,点绕过,空格绕过,以及上传.htaccess配置控制文件权限和::$DATA数据流的使用

  基于白名单相对于黑名单就安全很多了,要求只能是特定扩展名的文件才能够上传。

  白名单绕过思路:MIME绕过,修改文件类型为白名单可接受的类型,以及%00,0x00截断绕过,这种场景针对save_path可控。

  00截断原理其实很巧妙,利用场景是文件保存路径可控,这样一来我们上传的文件符合白名单就行,真正动手的地方在文件保存路径出,可以放上自己的webshell文件,然后在webshell文件后面添加%00,或0x00,再加一些字符,这样一来,系统在解析碰到00就会截断,后面字符就不起作用,只剩下前面的webshell文件名,就可以在url中进行访问了。%00和0x00的使用区别在于提交get请求时,是%00,会进行url自动解码动作,然后进入验证函数。0x00则是post请求直接进入验证函数。

  d.文件内容检测

  比较厉害的防护检测,就是针对内容做检测,这种防护能力比较强,但也不是不能绕过。自始至终,攻防都是在对抗中螺旋演进的。

  这种检测防护基本都是从webshell具有的代表性敏感字符?或者危险敏感函数。

  绕过思路:从特殊敏感字符开始进行Fuzz测试,探测webshell中有多少必要的字符存在被替换,如果构成webshell执行的字符

  被替换得较多,剩下未过滤的字符的难以支撑webshell执行,可以换个角度利用系统,调用脚本语言,如script language='php' system('ls'); script 。

  还有一种更强的基于内容检测机制,对上传的图片进行二次渲染,参考代码如下

  //判断文件后缀与类型,合法才进行上传操作

  if(($fileext == "jpg") && ($filetype=="image/jpeg")){

  if(move_uploaded_file($tmpname,$target_path)){

  //使用上传的图片生成新的图片

  $im = imagecreatefromjpeg($target_path);

  if($im == false){

  $msg = "该文件不是jpg格式的图片!";

  @unlink($target_path);

  }else{

  //给新图片指定文件名

  srand(time());

  $newfilename = strval(rand()).".jpg";

  //显示二次渲染后的图片(使用用户上传图片生成的新图片)

  $img_path = UPLOAD_PATH.'/'.$newfilename;

  imagejpeg($im,$img_path);

  @unlink($target_path);

  $is_upload = true;

  }

  } else {

  $msg = "上传出错!";

  }

  主要就是后端调用了php的GD库,利用imagecreatefromjpeg()函数提取了文件中的图片数据,然后再重新渲染,这样图片中插入的恶意代码就会被过滤掉了,经过测试发现,不管是直接修改文件头制作图片马,还是利用copy命令制作的图片马,都无法避免其中的一句话被过滤掉。

  绕过思路:借鉴二进制中钩子的思想,其实就是想在上传图片中找一块"地方",存储webshell,这块"地方"要求在后端处理后没有被过滤掉。那就上传一个正常的文件,然后下载下来,diff一下,查看哪些位置没有被改动过,然后添加webshell进行尝试。

  0x02 安全小思考

  以上防护和绕过姿势基本上都是从业务实战和CTF比赛中总结而来的,更多的时候需要各种信息进行综合利用,安全中攻击和防范永远是在对抗中相互成就的。敬畏前辈先验知识,展露后辈探索精神。

(责任编辑:范老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:成都市锦江区东大街紫东楼端35号明宇金融广场19楼1906室

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:400-111-8989

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:400-111-8989

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:400-111-8989

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座16层

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

2016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56 蜀ICP备18021046号-3