Upload-labs通关教程
1、pass-01
尝试把webshell传入到服务器,发现服务器对文件后缀名进行过滤。
绕过方法1:修改后缀
绕过方法2:禁用JS
安装Quick Javascript Switcher插件,关闭前端JS
JS关闭后直接上传php文件,发现上传成功
2、Pass-02
尝试上传php文件,发现同样对其进行过滤。
尝试把webshell后缀名改为png格式上传,发现可以上传。
通过BurpSuite截获数据,将文件名改为PHP文件即可绕过。
2、Pass-03
尝试第二关的方法,发现存在文件后缀黑名单
上传webshell.php5文件(直接修改php后缀为php5),因为已经在配置文件加入了.php5后缀的验证,所以.php5既可以绕过黑名单,网站也能解析。
但是蚁剑无法连接,原因服务器没允许,要想可以就修改apache的配置文件。
文件位置:phpstudy–>其他菜单选项–>打开配置文件–>httpd-conf。
在文件中加入:AddType application/x-httpd-php .php .phtml .phps .php5 .pht .html,如下所示。
目的是使浏览器能解析带有以下后缀的文件。保存,重启服务。
4、Pass-04
查看源代码,发现黑名单禁止了很多后缀文件通过,可以用.htaccess进行绕过。
简单来说.htaccess文件的作用就是把当前目录的所有文件都当作php解析,无论上传什么文件都当作php执行。
.htaccess 是配置文件 通常位于网站的根目录或特定的文件中,并影响该目录及子目录。每个目录都可以有这个文件。
httpd.conf 是全局的文件,整个服务器的 管理员才可以修改,并且要重启
.htaccess文件可以通过文本编辑器直接进行修改或创建,且修改后会立马生效,不用重启
使用.htaccess的前提是
①.mod_rewrite模块开启。(php是默认开启的)
②.AllowOverride All
创建一个.htaccess文件,里面的内容为如下:
AddType application/x-httpd-php .jpg
这个文件的目的是把上传的.jpg文件全部转化成.php文件
特殊情况:
很多windows操作系统是禁止将文件名设置为空的,但是我们可以用cmd命令来实现。
首先新建一个名为1.txt的文件,然后输入上述代码。接着在该文件夹下打开cmd窗口,输入:
ren 1.txt .htaccess
先上传.htaccess,再上传webshell.jpg。
上传webshell.jpg的时候用BurpSuite抓包,可以发送到重发器,在回显包中记住路径。
5、Pass-05
这题连.htaccess也过滤掉了
查看源码:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".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)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.$file_name;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件类型不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
可以看到这里是先删除文件最后的一个逗号和空格然后再寻找处后的文件名的最后一个逗号,再对该逗号后面(就是文件扩展名)进行变小写再去除::$DATA字符串
发现删除了文件末尾的.且进行了首尾去空,尝试使用BurpSuite拦截修改数据为webshell.php. .
发现成功绕过
上传成功
6、Pass-06
检查源码发现缺少大小写检验,绕过方法直接BurpSuite进行抓包修改,但不能为黑名单中的后缀名。
7、Pass-07
观察源码发现在处理尾缀的时候少过滤了空格于是可以抓爆修改文件尾缀。
8、Pass-08
观察源码发现在处理尾缀的时候少过滤了点于是可以抓爆修改文件尾缀。
9、Pass-09
观察源码发现在处理尾缀的时候少对特殊字符::$DATA
的过滤于是可以抓爆修改文件尾缀。
::$DATA
后缀在 Windows 操作系统中表示文件的数据流(Data Stream)。Windows 文件系统,特别是 NTFS 文件系统,支持附加数据流(Alternate Data Streams,简称 ADS)。在 NTFS 文件系统中,文件不仅可以包含主数据流(默认数据流),还可以有附加的隐含数据流,这些数据流不会被标准文件查看工具直接看到。
当看到 ::$DATA
时,通常指的是文件的默认数据流(即主数据流),但文件可能还会有其他数据流隐藏在其中,这些数据流可以用来存储额外的信息,如元数据、隐藏的文件内容,甚至恶意代码。
10、Pass-10
后端校验 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini,与此同时脚本还会对上传文件名进行过滤,包括首尾去空、删除文件名末尾的点、将字符转换为小写、去除字符串::$DATA等。
但由于只对点进行了单次过滤,因此如果我们上传webshell.php. .
最终会过滤为webshell.php.
这样也就演变成了第八题。
虽然以上几题都能通过这种方式绕过限制,但是这并不意味着我们要“一招鲜,吃遍天”,而学习多种绕过姿势才是我们的目的。
11、Pass-11
查看源码,发现其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini,当上传文件的后缀名与黑名单匹配时会自动去除后缀名,没有了后缀名文件自然也无法解析,但由于只过滤单次后缀名,因此我们可以双写后缀名绕过限制。
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");$file_name = trim($_FILES['upload_file']['name']);$file_name = str_ireplace($deny_ext,"", $file_name);$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.$file_name; if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
12、Pass-12
这一关白名单,通过Get %00截断可绕过白名单限制,但需确保PHP版本低于5.3.4且magic_quotes_gpc已关闭。
PHP函数如move_uploaded_file在底层C语言实现时,会因遇到0x00(URL编码为%00)截断字符串。利用此特性,可绕过某些文件上传限制。
13、Pass-13
这一关白名单,通过POST %00截断可绕过白名单限制,但需确保PHP版本低于5.3.4且magic_quotes_gpc已关闭。
如果启用了magic_quotes_gpc,PHP会自动转义所有通过 GET、POST 和 COOKIE 数据传递的特殊字符,这可能会阻止 %00 截断攻击。但这个配置项在PHP 5.4.0中被移除。
首先进行抓包,在upload后面写一个php文件,在文件的后面加一个空格符号
点开十六进制页面 ,找到刚才输入的空格,将其改为00,放行即可
14、Pass-14
这一关是图片马文件包含绕过,首先,将一个jpg文件和php文件合成图片马,然后将图片马上传。
下面这段代码中通过获取URL中的file参数,进行文件包含。执行图片文件。
http://192.168.197.133/upload-labs-master/include.php?file=./upload/9720241027120850.jpg
15、Pass-15
同14关一致,多了一个函数
$info = getimagesize($filename);
利用检测文件头来判断上传的文件是不是图像文件,同样是利用上传图片马和文件包含漏洞。
16、Pass-16
也是一样进行文件类型判断,没有对图片马进行判断,照样可以使用第14关的绕过方法。
17、Pass-17
上传的图片经过了后缀名、内容类型和imagecreatefromgif函数的严格验证,确保其为GIF格式。随后图片经过了二次渲染处理。
攻击步骤:
1、文件准备(做gif图片马)
通过010Editor查看木马是否插入
2、重新对渲染的图片马修改
上传图片马,然后下载下来查看
使用010Editor检查发现木马没有了
查找渲染的分离点,可以使用010Editor的同步对比功能
可以看到,绿色的部分开始有变化
所以,我们可以利用在没有发生改变的地方再次插入一句话木马**(注意,是插入到渲染过的图片上)**
复制一句话木马的16进制
然后在没有被渲染的地方插入即可
3、将修改后的文件上传,使用文件包含进行利用
使用文件包含利用
http://192.168.197.133/upload-labs-master/include.php?file=./upload/22399.gif
使用蚁剑进行连接
18、Pass-18
条件竞争
19、Pass-19
条件竞争
20、Pass-20
黑名单
21、Pass-21
数组绕过
片转存中…(img-i1NP8uds-1730036138285)]
然后在没有被渲染的地方插入即可
[外链图片转存中…(img-NcDYyrs1-1730036138285)]
3、将修改后的文件上传,使用文件包含进行利用
[外链图片转存中…(img-BNkAWuCt-1730036138285)]
使用文件包含利用
http://192.168.197.133/upload-labs-master/include.php?file=./upload/22399.gif
使用蚁剑进行连接
[外链图片转存中…(img-gPXAvWmp-1730036138286)]
18、Pass-18
条件竞争
19、Pass-19
条件竞争
20、Pass-20
黑名单
21、Pass-21
数组绕过