1、客户端校验
- 抓包改后缀(当代码全为js写的并没有向服务器发包时抓不到数据包)
- 关掉js (谷歌:设置=>高级 隐私和安全性=>网站设置) 或者直接将他源码下载到本地删掉js,改action。也可以f12改…
2、服务端校验(content-type)
改字段是根据你上传文件名所显现出来的
绕过方法:
- 抓包改content-type 字段
- 改文件名后上传抓包后再改回文件名
- 上传 正常文件改文件内容
- 最终目的是:…该字段正确就ok
图片马
当验证文件头时getimagesize、exif_imagetype 函数会判断是否为一张图片),即使修改了content-type也不行
因为必须为图片,此时可以找一个图片将一句话写入
copy a.jpg/b+a.txt b.jpg
多了解下姿势:
或者用工具(记事本/010等)将 马 插入到图片中
图片马 要不 和文件包含(将包含的文件当成脚本运行)一起用 ;或者搭配上 下面 的 .haccess 等任意解析漏洞
3、服务端校验—黑名单(名单中有的不能过)
常见几种绕过姿势:
- 大小写绕过,例如Php、PhP
- 常见的后缀 php3456 pht phtml …
- 配合Apache 的 .htaccess文件 或者 nginx的 .user.ini 文件上传解析 (配置文件,伪静态转换)
.htaccess
SetHandler application/x-httpd-php
其他中间件可以用 .user.ini
注意:修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载
auto_prepend_file=test.jpg
或者
auto_append_file=test.jpg
配图片马(test.jpg)可以直接连
- 00截断 例如上传1.php.txt ,抓包修改对应16进制的 filename 为00 那么最后出来是1.php(可以修改空格的16进制,空格的16进制20) ps : PHP版本<5.3(不包括5.3);
- 超长文件名截断上传(windows 258byte | linux 4096byte)
- 若在没有在最后首位去空,则可以改包时在包末尾加上空格,同理 没有末尾去点 就在末尾加点 (因为是先检验再上传+系统特性)
- :: D A T A 在 w i n d o w 的 时 候 如 果 文 件 名 + " : : DATA 在window的时候如果文件名+":: DATA在window的时候如果文件名+"::DATA"会把 :: D A T A 之 后 的 数 据 当 成 文 件 流 处 理 , 不 会 检 测 后 缀 名 , 且 保 持 : : DATA之后的数据当成文件流处理,不会检测后缀名,且保持:: DATA之后的数据当成文件流处理,不会检测后缀名,且保持::DATA之前的文件名,他的目的就是不检查后缀名 例如:例如:“1.php:: D A T A " W i n d o w s 会 自 动 去 掉 末 尾 的 : : DATA"Windows会自动去掉末尾的:: DATA"Windows会自动去掉末尾的::DATA变成"phpinfo.php”
4、服务端校验—白名单(名单中有的可过)
00截断
可以在绕过waf后写入到文件时截断后面白名单中的后缀 如jpg、png等从而显出我们真正的名字1.php
00截断 在地址中用 %00 也可以改hex ,在filename 中用0x00
php 版本<5.3.4
中间件解析漏洞:
ps:下面参考 https://blog.csdn.net/weixin_44940180/article/details/107944176
Apache:
低版本(如:2.X)Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断, 比如 yijuhua.php.owf.raar “.owf”和”.raar” 这两种后缀是apache不可识别解析,apache就会把sec.php.owf.rar解析成 .php 文件
换行解析漏洞 (2.4.0~2.4.29) 当有黑名单检验是,在filename 处给 1.php 后缀在hex改为 0a
修复:
- apache配置文件,禁止.php.这样的文件执行,配置文件里面加入
- 用伪静态能解决这个问题,重写类似.php.*这类文件,打开apache的httpd.conf找到
- 限制只允许 特定后缀才能上传
IIS:
-
上传 xx.php/asp;.jpg 会自动将分号后面的去掉,从而会认为只有xx.php/asp
-
例如/abc.asp/1.jpg ,在以asp/php等路径下的文件(1.jpg)会以asp/php解析
-
使用Asp的网站,默认承认.aspx/.asa/.cer/.cdx,即这些与asp解析规则一样
-
在一个文件路径(/xx.jpg)后面加上/xx.php会将 / xx.jpg/1.php解析为 php 文件 (fast-cgi开启)
ps:上面前三个 发生在5.x-6.0的版本之间 ,最后一个 发生在iis7.0-7.5的版本之间
nginx:
- 畸形解析漏洞 同上4 ,在fast-cgi开启下,上传含有木马的.jpg文件,然后访问xx.jpg/xx.php 得shell
- 在文件名后添加一个%00字节,可以截断某些函数对文件名的判断
因为在许多语言的函数中,比如C、PHP等语言的常用字符串处理函数中,0x00被认为是终止符,例如:xx.php[\0].jpg ,[\0]为16进制的 00字符
以上两种均在 Nginx <8.03 下
文件名逻辑漏洞 (0.8.41~1.4.3 || 1.5.0-1.5.7)
成功上传1.jpg后,访问我们上传的地址在 url处最后加上 … .php 将…分别在hex下改为20 00
二次渲染逻辑漏洞-条件竞争
应用情景:
文件上传后,再检测是否合法,不合法就删除(意味着文件存在于服务器上过,只是存在时间很短,所以理论上可以趁着服务器
还没“反应”过来时,是可以访问到的!
两种情况:
有上传路径下:
编写“竞争”的文件 1.php
接下来用bp的爆破模块不断上传 和访问我们上传成功的文件路径(可以再模块中随便找一个无用数来跑!)
直到 访问 出现 200
没有上传路径的话之能用脚本上传了…