文件上传:
一、前端js校验
使用burpsuite抓包修改,先传一个jpg文件,抓包的时候修改为php文件
二、服务器校验
1. content-type校验 使用burp suite 修改请求包的type字段
2. 文件后缀之黑名单绕过:
(1)多后缀 .php3 .php4 .php5 .phtml
(2)大小写混淆绕过
(3)windows . 空格
(4)windows ::$DATA
(5).htaccess文件绕过
(6)双写文件后缀绕过
(7)解析漏洞:
1. apache 从右往左 形如aaa.bbb.ccc 先尝试解析ccc 不行则bbb
2. iis
6.0
文件夹以.asp .asa .cer .cdx 作为结尾 此时该文件夹下的文件优先当作asp处理
文件名中包含.asp; .asa; .cer; .cdx; 此时该文件无论后缀 优先当作asp处理
7.0-7.5
xxx.xxx/xxx.php
比如存在一个a.jpg文件,里面内容<?php phpinfo();?>
直接访问这个a.jpg文件是一张图片,并不能解析php代码
当IIS服务器遇到文件路径/a.jpg/bbb.php时,若/a.jpg/bbb.php不存在,则会去掉最后的/bbb.php,然后判断/a.jpg是否存在,该目录下/a.jpg存在,由于服务器配置不当,造成了服务器把a.jpg当做 了php脚本执行了。
3. nginx
特定版本的nginx(视频中5.2.17) xxx.xxx/xxx.php
低版本下 %00.php
3. 文件后缀之白名单绕过:
(1) %00截断( php版本 < 5.3.4 并且 php.ini中 magic_quotes_gpc = Off )
(2) 联合include 文件包含(图片马)
(3) 二次渲染
(4) 条件竞争
(5) save_name数组绕过
三、upload-labs 1-21关
第一关: 前端js校验 使用burpsuite抓包修改php文件的后缀名为jpg
第二关: content-type校验 使用burp suite 修改请求包的type字段为 image/jpeg
第三关: 双写 ::$DATA 绕过 (感觉可以php3绕过)
第四关: wamp软件下,可以使用.htaccess 绕过 或者 .空格. 绕过
第五关: .空格. 绕过
第六关: 文件后缀大小写混淆绕过 或者 双写 ::$DATA 绕过
第七关: 空格绕过 或者 双写 ::$DATA 绕过
第八关: .空格 绕过
第九关: ::$DATA 绕过
第十关: .空格. 绕过
第十一关: 双写php绕过
第十二关: %00截断(GET方式接收svae_path) 绕过
重点:save_path=../upload/2022_11_3.php
(php后面本来多加了个字符,然后通过十六进制改为00,所以看不见了)
POST /Pass-12/index.php?save_path=%2e%2e%2f%75%70%6c%6f%61%64%2f%32%30%32%32%5f%31%31%5f%33%2e%70%68%70%00 HTTP/1.1
.....
第十三关: %00截断(post方式接收save_path) 绕过
POST /Pass-13/index.php HTTP/1.1
......
------WebKitFormBoundaryLiu6QH63sOOD5SgE
Content-Disposition: form-data; name="save_path"
重点:../upload/2022_11_3.php (同样后面有看不见的字符,十六进制改为00了,然后post请求体不能用url编码后的代码)
第十四关: 普通的图片马绕过(再加上文件包含漏洞)
制作简单的图片马
copy /b ok.jpg+1.txt= ok_new.jpg
http://www.upload.com/include.php?file=./upload/8620221103202108.png
第十五关: 普通的图片马绕过(再加上文件包含漏洞)
第十六关: 需要开启 php.ini的php_exif模块
第十七关: 图片马,二次渲染绕过
(本关因为会从图片中生成新的图片,然后删除原来上传的图片,并且普通的图片马,从新生成之后,里面的php代码被删除了,所以要二次渲染)
制作gif图片马,以十六进制的方式写入php代码,不破坏图片原本结构
第十八关: 条件竞争绕过
上传一个利用file_put_contents()函数写入文件的php文件
因为源码是先移动到指定目录,在判断类型是不是jpg,png,gif文件,如果是就重命名,如果不是就删除
所以我们可以利用burpsuite的intruder模块
一边不断的去上传文件
另外一边不断去访问上传的文件
利用服务器处理不过来的间隙,执行了文件代码,永久的生产了一个新的文件
第十九关: 普通的图片马绕过,需要文件包含(网上还有说需要条件竞争,保持原图片名的,但我感觉不需要)
第二十关: .空格.绕过 或者 00截断
第二十一关: save_name数组绕过
1. 类型改为 image/jpeg
2. save_name 变为数组
3. save_name[0] 是test.php
save_name[2] 是jpg
save_name[1] 让它不存在
------WebKitFormBoundarySTsD2JKbxy7BAPQw
Content-Disposition: form-data; name="upload_file"; filename="test.php"
Content-Type: image/jpeg
<?php phpinfo();?>
------WebKitFormBoundarySTsD2JKbxy7BAPQw
Content-Disposition: form-data; name="save_name[0]"
test.php
------WebKitFormBoundarySTsD2JKbxy7BAPQw
Content-Disposition: form-data; name="save_name[2]"
jpg
------WebKitFormBoundarySTsD2JKbxy7BAPQw