首先进行操作系统判断
改url大小写看能否正常访问 windows(正常访问)无视大小写
linux(不能访问)看大小写
一.前端js绕过
Bp看有没有包
二. 后端
绕过MIME-Type验证
查http包的Content-Type字段中的值来判断上传文件是否合法的
小技巧,可以先成功上传一个案例,观察服务器允许的mime的类型,然后再抓包修改测试
利用Burpsuite工具截断HTTP请求,在Repeater重放修改MIME-Type类型绕过验证。
首先上传一个文件1.asjhdih随便后缀 能上传成功的是黑名单 不能上传成功的是白名单
黑名单绕过:黑名单不全1.特殊后缀(php3,php5,phtml)
2.上传htaccess让后来的可以上传的任何文件解析成php文件运行 (比如上传用php代码写的png图片)
SetHandler application/x-httpd-php
3. .user.ini
auto_prepend_file=1.jpg
其图片马(1.jpg)为 在我访问php文件时,自动包含.user.ini ,而.user.ini这个里面又有1.jpg,1.jpg就是图片马,上传成功之后,用webshell管理工具添加该图片的路径,但该图片名改为当前目录下的php文件,例如readme.php,也就是执行这个1.jpg里面的代码,输入密码连接成功。
4.空格绕过,点绕过(1.php. .),大小写绕过
5发现没有str_ireplace(‘::$DATA’)所以没有去除字符串,所以在文件名后加上::$data达到绕过的目的,需要注意的是在访问的时候必须把::$data去掉进行访问,因为windows系统会自动去掉末尾的::$data,你如果访问时候加上说明这是去不掉的。
6.双写绕过(1.pphphp)由于 str_ireplace() 函数将所有匹配的字符串替换成空字符串,并且不关心替换的字符串在原始字符串中出现的位置或次数,这会导致一个潜在的漏洞。他会把中间的PHP替换为空。
这里他的替换是直接把整个后缀提取出来,然后检查你的后缀有没有连续的PHP,如果有,他就给你替换为空。不能有php但是可以有1.pphphp然后在上传之后给删除中间的php剩下1.php
白名单绕过:
上传正常jpg,在保存时利用某种方式后缀名变为php
(1)路径上传方式为get :比如filename=1.gif先通过验证
但是save_path=../upload/998.php%00 此时%00直接截断,所以保存的就是../upload/998.php此时可以当作php文件执行代码(回显包里有报错也说明可以服务端接收)
或者
也可以直接进入hex在路路径后面加上00
上传正常jpg,利用服务器里有的函数进行执行代码(任意文件包含,这个不好找)
图片webshell:在PHP中,使用include、 require、 include_once、 require_once函数包含的文件都会被当作PHP代码执行,无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。其中服务器本来就包含include.php这种类型的文件
其中可能Content-Type验证。修改为image/gif 或 image/jpg 符合当前文件类型的MIME
图片马制作:windows命令 cd desktop
copy 1.png /b + 2.php /a 123.jpg
将1.png以二进制打开 2.php以ascil码打开
合并成一个文件123.jpg
(以什么形式打开都不影响)
图片马本身不会执行,只有通过解析或者文件包含漏洞才行
上传1.jpg,然后用include.php或者其他文件进行解析(这个文件靠后端代码审计得出,但是后端代码是看不见的,白盒测试可以审计后端代码)
涉及知识:二次渲染(将图片剪碎再重新拼接,但重要部分不会变)(网站压缩的缩略图就是二次渲染的一种体现)
对比上传前后的图片,看哪里没被改动 哪个地方就写木马 然后保存再次上传
3.竞争条件(利用时间差)
原理
文件上传后服务器对文件进行非法检测,若合法保留文件,否则删除文件;
绕过
上传非法文件后,在文件被删除前访问该文件执行恶意代码,可在服务器生成一个webshell文件,通过新的webshell文件攻击服务器;
就是让携带的代码在极短时间内在当前目录下再写入一个webshell,然后携带的代码被删除但是webshell留下了
用于上传的php文件'); ?>
它的作用是在服务器上创建一个名为 “shell.php” 的文件,并将 “” 的内容写入该文件。
条件竞争原理:当我们成功上传了php文件,服务端会在短时间内将其删除,我们需要抢在它删除之前访问文件并生成一句话木马文件,所以访问包的线程需要大于上传包的线程。
首先上传包1.php用bp抓包
然后直接尝试访问shell.php这个文件用bp抓包
攻击模块的positions不要设置 默认spiner
Payloads设置为null payloads
Resource pool 线程设置数 或者多开几个攻击窗口效果是一样的(没必要
如果一共发1000个包 线程设置200 那么发5次就能发完
一次发200个
最后攻击出现200响应码成功
include():找不到被包含文件,报错,但会继续运行脚本;
include_once():与include()类似,区别在于,当重复调用同一文件时,程序只调用一 次;
require():找不到被包含文件,报错,并且停止运行脚本;
require_once() :与require类似,区别在于,当重复调用同一文件时,程序只调用一次 ;
当使用这四个函数包含一个新的文件时,该文件将作为PHP代码执行, PHP内核并 不会在意该包含的文件是什么类型。(无论是txt、图片文件,远程URL,全都作为PHP代码执行)
条件:1. included等函数通过动态变量的方式引入需要包含的文件
2. 用户能够控制该动态变量
3. 被包含的文件可被访问
防护措施
1. 包含文件的参数过滤
① 文件名过滤:白名单或者黑名单过滤
②不使用动态变量进行包含操作,设置字典等静态处理
③文件名后缀固定
2、路径限制
①目录限制,在用户提交的变量前增加固定的路径,限制用户可调用的目录范围 ②目录回退符过滤,避免回退符生效导致路径变化
3、中间件的安全配置
①PHP版本小于5.4在php.ini中设置magic_quotes_gpc=on(5.4 以后被放弃用)
magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的’"\加上反斜线
②限制访问区域:php.ini中设置open_basedir来限制用户访问文件的活动范围等;
apache 也有相关配置
③设置访问权限:限制当前中间件所在用户的访问权限,例如; web 服务器独立用户,并且 只拥有访问目录和使用中间件的权限,从而有效避免越权访问其他文件;
4.搭建RASP阻止代码注执行
代码要是不被执行会回显出里面的内容
服务器解析漏洞不详细讲