文件上传之后缀名绕过
当目标限制了上传文件的后缀名之后,我们可以尝试以下方法进行绕过
1.大小写问题
例如,.Php .pHp .phP
2.空格问题
例如,"webshell.php " “webshell. php”
3."."问题
在windows中php会自动去除后缀名中最后的 “.” 的符号
4.::$DATA问题
windows下,php,在文件名后面加上::$DATA系统会把它当作文件流来进行处理,不会检测文件的后缀名,且保留::$DATA之前的文件名以及后缀
5.双写后缀名
有些站点判断方式会把文件后缀名替换为空字符,遇到这种情况我们只需要双写后缀名来绕过, 例如,yijuhua.phphpp 原理就是服务器把后缀名中的php进行替换,替换成空字符之后为被替换的剩余字符组成了php,从而达到绕过的效果
6.%00截断
%00截断经常用在服务端把文件路径和文件名加在一起进行判断后缀, 例如/upload/webshell.php%00webshell.jpg 在这里系统解析的时候会自动忽略%00后面的内容,最终解析为/upload/webshell.php 从而达到绕过的目的
文件类型Content-Type绕过
是指通过各种手段绕过服务器对上传文件类型的检测,以上传不符合要求的文件。
绕过方法
常见的绕过方法包括但不限于以下几种:
-
修改文件后缀:上传者将文件后缀名修改为服务器允许的类型,从而绕过文件类型的检测。例如,将一个可执行文件的后缀名修改为图片文件的后缀名。
-
修改Content-Type头:上传者可以通过修改HTTP请求中的Content-Type头部信息,将其伪装为允许的文件类型,以欺骗服务器。
-
绕过前端检测:前端检测只是一种表面上的检测,上传者可以通过修改前端代码或使用其他工具来绕过这种检测。
-
利用漏洞:上传者可以利用服务器端的漏洞,绕过文件类型的检测。例如,上传脚本文件,通过漏洞执行恶意代码。
防绕措施
为了防止文件类型Content-Type绕过,可以采取以下措施:
-
后端验证:在服务器端进行文件类型的验证,不仅依赖于前端的验证,而且对上传的文件进行严格的检查,确保文件类型的合法性。
-
使用白名单:限制服务器接受的文件类型,只允许特定的文件格式上传,并拒绝其他类型的文件。
-
文件内容验证:不仅验证文件的后缀名,还可以通过检查文件的内容来验证文件的类型是否正确。
-
安全上传组件:使用安全的文件上传组件,这些组件通常会提供更多的安全特性和防护措施,防止文件类型绕过攻击。
文件上传content-type实际操作writeup:文件上传漏洞基础/content-type绕过/黑名单绕过/content-type: image/png白帽Chen_D的博客-CSDN博客
[极客大挑战 2019]Upload
这里主要是绕过常规php文件后缀检测方法
原来的抓包:
改了之后的:
最需注意的是这一点,传完后网域名会变成:
这里需要在意见与菜刀链接时将后缀名改为:....../upload/1234.phtml才能连接上不然会显示传入内容为空
之后就获得了进入网站的权力了
相关文件绕过资料:【后端检测-绕过】文件头检测绕过、二次渲染绕过文件头绕过黑色地带(崛起)的博客-CSDN博客
[ACTF2020 新生赛]BackupFile
主要要注意的是对于题目的信息提取,如本题,通过对题目的翻译得到备份文件的线索,再在网上查询备份文件名常见文件备份有 .swp(vim未正常退出备份)
.bak
.back
,猜测可能为.bak后缀,再加上index.php。得到php代码:
解读发现是弱比较:
==:先将字符串转换同类型在进行比较 ===:先判断两种字符串的类型是否相同在进行比较 isset()函数检测变量是否已被设置并且非NULL is_numeric()用于检测变量是否为数字或者数组字符串,这里说明key如果不是数字的话将退出执行并输出Just num intval()可以获取变量的正整数值,进行数据类型转换,将字符串的变量转换为整数类型 因为$key==$str 属于弱比较 key=123获得flag)
get传参key=123即解出
[极客大挑战 2019]BuyFlag
打开得到精美页面,得到提示
打开源码找信息
发现php弱比较类型,用post传参得到下一个提示
这里说要输入正确密码,但页面没有任何的输入框,我们打开bp对其进行抓包,查看相关信息。
这里得到Cookie栏的user=0,猜测登录为二进制登录设置,将其改为user=1;发包得到新信息
这里要我们支付钱来买flag,这里因其为post协议故用post传参的方式对其进行付款。
第一次尝试用1亿直接付但回显数字太长
换个短点的
这里又回显钱太少了,这里明显是不对劲的,没有任何提示,怀疑有漏洞,查看php版本![image-20230912165537470](C:\Users\杨尚典\AppData\Roaming\Typora\typora-user-images\image-20230912165537470.png)
网上搜索漏洞发现有函数strcmp()数组绕过漏洞
php strcmp()漏洞
注:这一个漏洞适用与5.3之前版本的php
我们首先看一下这个函数,这个函数是用于比较字符串的函数
```
int strcmp ( string $str1 , string $str2 )
```
参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 !!!! 也就是虽然报了错,但却判定其相等了。这对于使用这个函数来做选择语句中的判断的代码来说简直是一个致命的漏洞,当然,php官方在后面的版本中修复了这个漏洞,使得报错的时候函数不返回任何值。但是我们仍然可以使用这个漏洞对使用老版本php的网站进行渗透测试。看一段示例代码:
```
<?php
$password="***************"
if(isset($_POST['password'])){if (strcmp($_POST['password'], $password) == 0) {
echo "Right!!!login success";n
exit();
} else {
echo "Wrong password..";
}
?>
```
对于这段代码,我们能用什么办法绕过验证呢, 只要我们$_POST[‘password’]是一个数组或者一个object即可,但是上一个问题的时候说到过,只能上传字符串类型,那我们又该如何做呢。
其实php为了可以上传一个数组,会把结尾带一对中括号的变量,例如 xxx[]的name(就是$_POST中的key),当作一个名字为xxx的数组构造类似如下的request
```
POST /login HTTP/1.1
Host: xxx.com
Content-Length: 41
Accept: application/json, text/javascript
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Connection: closepassword[]=admin
```
即可使得上述代码绕过验证成功。