[关闭]
@1kbfree 2019-09-04T16:45:19.000000Z 字数 4743 阅读 977

upload-labs通关笔记

渗透


第一关:

image.png-194.5kB

可以看到这里的上传的验证是javascript验证的,也就是前台认证,但是我们可以利用后台验证绕过。

步骤:
1、上传一个2.png
2、抓包将2.png修改为2.php

1.png-225.3kB

然后看看是否成功上传

1.png-16.1kB

upload目录是这个靶机上传的文件的存放目录,所以上传的东西都会在这里,所以看有没有成功上传的话可以直接来这里看,或者去访问一下http://xxx.xxx.xxx/upload/文件名,如我刚刚上传的2.php就是这个链接

http://127.0.0.1/upload/upload/2.php

1.png-51.8kB

第二关:

1.png-256kB

所谓文件类型就是上传文件的时候请求中的Content-Type,如下

1.png-206.5kB

这关的代码逻辑就是,如果上传的文件类型是image/jpegimage/pngimage/gif就可以上传。那么只要上传一个php文件,然后把文件类型修改为image/jpeg即可上传

1.png-132.5kB

1.png-30.6kB

成功上传~

第三关:

此关就是后台禁止phpjspaspaspx这四个文件上传

这关的代码比较长,我就直接贴出来了~

  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])) {
  4. if (file_exists(UPLOAD_PATH)) {
  5. $deny_ext = array('.asp','.aspx','.php','.jsp');
  6. $file_name = trim($_FILES['upload_file']['name']);
  7. $file_name = deldot($file_name);//删除文件名末尾的点
  8. $file_ext = strrchr($file_name, '.'); // 获取文件名的后缀(就是获取.后面的内容)
  9. $file_ext = strtolower($file_ext); //转换为小写
  10. $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  11. $file_ext = trim($file_ext); //收尾去空
  12. if(!in_array($file_ext, $deny_ext)) { // 如果$file_ext的值不在$deny_ext列表里,即进入条件
  13. $temp_file = $_FILES['upload_file']['tmp_name'];
  14. $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
  15. if (move_uploaded_file($temp_file,$img_path)) {
  16. $is_upload = true;
  17. } else {
  18. $msg = '上传出错!';
  19. }
  20. } else {
  21. $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
  22. }
  23. } else {
  24. $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
  25. }
  26. }

既然不能上传php,那么我们可以上传.php3(在某些环境下php3也是当php解析,介绍文章:https://www.cnblogs.com/natian-ws/p/7265806.html

1.png-135.2kB

然后看看是否上传了

1.png-25.3kB

可以看到是上传了的,但是为什么名字会那么长呢?
可以看看代码中第15

  1. $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;

这个$img_path就是上传后的文件的地址,UPDATE_PATH就是上传目录(upload),data("YmdHis")就是当前时间的年月日时分秒,rand(1000,9999)就是在00009999中随机抽数字,$file_ext就是上传的文件的后缀,所以拼接起来就是这么长的名字。

那么我们上传了这个文件后,看不到他的名字,我们就可以爆破当前时间的年月日时分秒,然后后面几个随机数字爆破,这里不演示了,直接打开看看php3是否和php效果一样~

第四关

这一关坏得很,因为他把全部后缀都加入黑名单了,代码如下

  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])) {
  4. if (file_exists(UPLOAD_PATH)) {
  5. $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".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");
  6. $file_name = trim($_FILES['upload_file']['name']);
  7. $file_name = deldot($file_name);//删除文件名末尾的点
  8. $file_ext = strrchr($file_name, '.');
  9. $file_ext = strtolower($file_ext); //转换为小写
  10. $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  11. $file_ext = trim($file_ext); //收尾去空
  12. if (!in_array($file_ext, $deny_ext)) {
  13. $temp_file = $_FILES['upload_file']['tmp_name'];
  14. $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
  15. if (move_uploaded_file($temp_file, $img_path)) {
  16. $is_upload = true;
  17. } else {
  18. $msg = '上传出错!';
  19. }
  20. } else {
  21. $msg = '此文件不允许上传!';
  22. }
  23. } else {
  24. $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
  25. }
  26. }

可以看到限制了很多后缀,但是我们可以上传.htaccess文件,然后在里面写

  1. SetHandler application/x-httpd-php

这个意思是把这个目录的所以文件当php解析,但是这个也是有环境限制的,只能在apache用,因为.htaccessapache的配置文件

第五关

这一关代码如下

  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])) {
  4. if (file_exists(UPLOAD_PATH)) {
  5. $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");
  6. $file_name = trim($_FILES['upload_file']['name']);
  7. $file_name = deldot($file_name);//删除文件名末尾的点
  8. $file_ext = strrchr($file_name, '.');
  9. $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  10. $file_ext = trim($file_ext); //首尾去空
  11. if (!in_array($file_ext, $deny_ext)) {
  12. $temp_file = $_FILES['upload_file']['tmp_name'];
  13. $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
  14. if (move_uploaded_file($temp_file, $img_path)) {
  15. $is_upload = true;
  16. } else {
  17. $msg = '上传出错!';
  18. }
  19. } else {
  20. $msg = '此文件类型不允许上传!';
  21. }
  22. } else {
  23. $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
  24. }
  25. }

这一段大概意思就是上传的文件后缀名不允许出现在$deny_ext里,但是我们可以通过上传Php来绕过~ 他这里限制了php不能上传 但是并没有将其全转换成小写 所以可以用大写绕过

1.png-241.9kB

第六关

1.png-60.1kB

这一关也是黑名单策略,然后把.htaccess文件也限制了,但是我们可以用php空格绕过,如下

1.png-211.2kB

第七关

1.png-104.4kB

这一关还是黑名单策略,因为这里没有把.删除,所以可以上传.php.绕过(原理是window会把文件后缀后面的.删除,比如上传1.php....会变成1.php这是window的特性)

1.png-195.2kB

第八关

1.png-104.8kB

还是黑名单,但是我们还是可以利用window的特性绕过,上传一个.php::$DATA后缀类型,上传后会变成.php

1.png-182.3kB

第九关

1.png-61.3kB

还是黑名单策略,但是我们可以利用only_free.php. .来绕过,因为第7行会删除末尾的点就变成了only_free.php.空格,然后第11行会把后面的空格去掉,就变成了only_free.php.然后经过window的特性,会变成only_free.php,如图

1.png-178.7kB

第十关

1.png-39.4kB

先看到第8行,代码意思是:把$file_name中的$deny_ext替换为空,意思就是如果我上传的文件名是1.phpphp$deny_ext列表里,然后就会把php替换为空,变成1.,但是这里有个逻辑缺陷。如上传一个1.pphphp他会把php去掉,如图1.png-0.7kB,然后就变成了1.php成功绕过,如图

1.png-212.5kB

第十一关

暂空

第十二关

暂空

第十三关

这一关比较奇特,不用上传php文件,只要能成功上传图片即可,而上传图片的前提是这个图片必须为图片马,何为图片马呢? 就是一个能正常显示,但是图片本身是带有恶意的代码的,详细可看如下链接

http://gv7.me/articles/2017/picture-trojan-horse-making-method/

这里上传的话上传一个only_free.jpg,然后内容是

  1. GIF98a
  2. <?php
  3. phpinfo();
  4. ?>

GIF98a是图片头,这样子表示这个是GIF图片,然后看上传结果

1.png-200.4kB

第十四关

1.png-102.3kB

看到这里的第四行是获取$filename的图片类型,依旧可以用GIF98a来绕过

1.png-216.4kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注