前端
js类绕过
- 页面直接修改js上传文件方法(按F12使用网页审计元素,把校验的上传文件后缀名文件删除,即可上传。);
- 抓包改包,在contnet-type将上传的文件后缀进行修改;(例如:a.jsp.jpg ——抓包修改为——a.jsp;%00截断文件名)
https://www.runoob.com/http/http-content-type.html
- 复制页面,重新构建新页面,获取方法,并修改;
后端
一、黑名单绕过
基于黑名单验证思路:只针对黑名单中没有的后缀名,文件才能上传成功。
当后缀在黑名单中时,存在可供替代的后缀名绕过黑名单(可以burpsuite使用字典批量尝试)
语言 |
默认(服务器)可解析后缀 |
盲猜绕过可解析后缀 |
asp.net |
【IIS】 |
asp,aspx,asa,asax,ascx,ashx, asmx,cer,aSp,aSpx,aSa,aSax, aScx,aShx,aSmx,cEr |
php |
.php.html.htm【apache】 |
php,php5,php4,php3,php2, pHp,pHp5,pHp4,pHp3,pHp2, html,htm,phtml,pht,Html,Htm, pHtml |
jsp |
*.jsp,*.jspx【tomcat】 |
jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp, jSpx,jSpa,jSw,jSv,jSpf,jHtml |
-
直接修改php脚本代码
- Tomcat添加可解析后缀名:
路径: apache-tomcat-x.x.x\conf\web.xml
文件: web.xml
修改位置: <url-pattern>*.*</url-pattern>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
- Apache添加可解析后缀名:
路径:Apache24\conf\httpd.conf
文件:httpd.conf
修改位置:AddType application/x-httpd-php .php .html .htm
在htaccess 里写入 SetHandler application/x-httpd-php 则可以文件重写成 php 文 件。要htaccess 的规则生效 则需要在apache开启rewrite重写模块,一般多数都是自动开启的。
如果需要手动开启方式:
路径:Apache24\conf\httpd.conf
文件:httpd.conf
位置1:如下代码↓
<Directory "${SRVROOT}/htdocs">
Options Indexes FollowSymLinks
AllowOverride None (将None改为ALL)
Require all granted
</Directory>
位置2: 去掉注释
#LoadModule rewrite_module modules/mod_rewrite.so
-
(win)点绕过
Windows 系统下,文件后缀名最后一个点会被自动去除。
Linux 系统下,文件后缀名最后一个点不会被自动去除。
使用方法:利用 BurpSuite 工具截断 HTTP 请求,上传文件后缀名加 . 绕过上传。
-
(win)空格绕过
Windows系统下,对于文件名中空格【demo.php(空格)】会被作为空处理,程序中的检测代码却不能自动删除空格,从而绕过黑名单。
通过BurpSuite截断 HTTP 请求之后,在对应的文件后缀名处添加空格。
-
(win)点绕过和空格绕过结合
例如:
a.php[空格](点)[空格]
a.php .
a.php(点)[空格](点)
Windows下:
a.php(点)+空格+(点)
deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为1.php.
利用Windows自动去除最后一个点,导致成功上传1.php;
背景原因:(windows特性)
在window系统下,如果上传的文件名为a.php::$DATA,它会在服务器上生成一个a.php的文件,其中内容和所上传内容相同,并被解析。
利用示例:
通过BurpSuite截断 HTTP 请求之后,在对应的文件后缀名处添加::$DATA。
特别说明:
在windows下,无法直接测试::$DATA,因为windows不允许后缀名中存在特殊字符;
-
配合中间件解析漏洞(*待补充)
nginx 0.83 截断字符 1.jpg%00php
apahce 1x 或者2x 当apache 遇见不认识的后缀名,会从后向前解析例如1.php.rar 不认识rar就向 前解析,直到知道它认识的后缀名。
phpcgi 漏洞(nginx iis7 或者以上) 上传图片后1.jpg。访问1.jpg/1.php 也会解析成 php。 Apache HTTPD 换行解析漏洞(CVE-2017-15715) apache 通过mod_php 来运行脚本,其2.4.0-2.4.29 中存在apache换行解析漏洞, 在解析php时xxx.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的 安全策略。
如:a.php——>a.pphphp
过滤掉php后,会重新拼接为新的php
防御措施:
使用递归循环过滤,不使用一次过滤
$_POST['save_name']文件是可控
攻击方法:
1.上传文件,文件马采用%00 截断,抓包解码例如moon.php%00.php 截断后 moon.php 或者使用/.
2.与中间的漏洞配合使用 例如 iis6.0 上传1.php;1.jpg apache 上传1.php.a 也 能解析文件 a.asp;1.jpg 解析成asp
注意: %00 截断 需要gpc 关闭 抓包 解码 提交即可 截断文件名 php版本小于 5.3.4
二、白名单绕过
-
MIME绕过(类似于js法2)
MIME绕过,又叫HTTP请求头中的Content-Type属性绕过
每个MIME类型由两部分组成,前面是数据的大类别,例如声音 audio、图象 Image等,后面定义具体的种类。
MIME拦截代码样例:
@Controller
@RequestMapping(value = "/users", method = RequestMethod.POST, consumes="image/*")
@ResponseBody
public List<User> addUser(@RequestBody User userl) {
return List<User> users;
}
//consumes:指定处理请求的提交内容类型(Content-Type),例如application/json、text/html;等。如果不是指定的类型不响应;
//上面这个方法【仅处理】请求Content-Type为【image/*】类型的请求。
MIME利用示例:
通过抓包的形式,修改Content-Type类型,将类型指定为:image/*
Content-Type类型位于HTTP Request 中,要以网站为中心,request表示获取数据,response表示返回数据;
-
%00截断(后端要求目录可控)
00截断的核心:
当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃。
例如1.php%00.1.jpg 变成 1.php(GET参数直接是%00即可,但POST需要把%00 decode 才可以)
这种情况常出现在ASP程序中,PHP 版本<5.3.4时也会有这个情况,JSP中也会出现。
- php版本要小于5.3.4; 5.3.4及以上已经修复该问题
- magic_quotes_gpc需要为OFF状态,否则会把%00转换成其他的字符
文件上传绕过之00截断
【%00和0x00】区别:
它们最终的结果都是一样的,都代表着chr(0),即空字符,只不过使用的位置不同,0x00代表16进制的空字符00,需要在HEX中改为00,进行截断,而**%00是URL解码之前的字符**,它被解码成16进制ASCII码之后实际上也是0x00,所以它们最终都对应的是空字符,这里%00可以用在URL中如xx.php?filename=test.php%00.txt,也可以直接插在Burp包中的路径中,如path=shell.jsp%00.txt
0x00截断
0x00是十六进制表示方法,表示ASCII码为0的字符,在一些函数处理时,会把这个字符当作结束符。
0x00可以用在对文件名的绕过上,具体原理:系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。也就是说系统是按二进制或十六进制读取文件,遇到ASCII码为0的位置就停止,而这个ASCII码为0的位置在十六进制中是00。
总之就是利用ASCII码为0这个特殊字符,让系统认为字符串已经结束。
0x0a截断
0x0a是十六进制表示方法,表示ASCII码为/n的换行字符,具体为换行至下一行行首起始位置
方法一:
a)先将一句话木马写入txt文件,改文件后缀为png格式(白名单中存在的后缀名);
b)用010打开,将正确Png文件头放入,保存即可。
c)上传,用bp抓包,然后修改文件后缀为.php格式,放包
d)用蚁剑连接
方法二:
a)准备一个要上传的图片;一个一句话木马.php
b)执行命令:
copy CSDN.png/b+1.php/a phpinfo.png
c)上传图片!
方法三:
burpsuite 上传的数据包头加上GIF89a(数据头)
getimagesize 是获取图片的大小,如果头文件不是图片会报错直接可以用图片马 绕过检测。
通常一个session建立是会被session锁定机制进行锁住,防止多个并发请求同时修改session数据,这个漏洞的原理是利用了PHP_SESSION_UPLOAD_PROGRESS 特性,当 PHP 处理文件上传请求时,会短暂解锁会话文件,允许并发请求访问,攻击者利用这个窗口,发送包含恶意 PHP_SESSION_UPLOAD_PROGRESS 字段的请求来达到任意命令执行的目的
Burpsuite抓包后intuder爆破(提高线程使得删除文件时间延长,便于访问的时候文件还存在),改包
三、数组上传绕过
支持数组上传或者数组命名。
构造上传表单,设置数组上传。
四、二次图片渲染绕过
二次渲染:为了压缩图片对图片进行二次渲染,会删除图片中的恶意代码。在源码中使用imagecreatefromgif函数对图片进行二次生成
注意:gif图片在二次渲染后,与原图片差别不会太大。 所以二次渲染攻击最好用git图片马。
方法:
- 制作图片马
- 将原图片上传,下载渲染后的图片进行对比(010/ winhex——》工具——》比较——》搜索相同;展示区,蓝色部分是没有发生变化的),找相同处,在相同的地方覆盖字符串,填写一句 话后门,或者恶意指令
五、文件头绕过
1.图片马
2.php文件改后缀白名单,010打开修改16进制头文件格式,抓包改回后缀
3.burp抓包直接在文件前面添加文件头
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论