目录
pass-1(js前端绕过)
pass-2(MiMe绕过)
pass-3(黑名单绕过)
pass-04(.htaccess文件上传)
pass-05
pass-06(大小写绕过)
pass-07(空格绕过)
pass-08(windows特性加点绕过)
pass-09(::$DATA绕过)
pass-10(点空点绕过)
pass-11(双写绕过)
pass-12(GET请求00截断)
pass-13(POST请求00截断)
pass-14(头文件绕过、图片码绕过、文件包含)
pass-15(头文件绕过、图片码绕过、文件包含)
pass-16(头文件绕过、图片码绕过、文件包含)
pass-17(二次渲染)
pass-18(条件竞争)
pass-19(中间件解析漏洞&条件竞争)
pass-20(%00截断)
pass-21(MIME、数组、/绕过)
源码:
由于是直接对上传的文件进行判断,只允许.jpg|.png|.gif,上传文件后,substring()函数会提取文件后缀名,由indexOf()处理返回指定的字符串值在字符串中首次出现的位置,然后进行比较,不符合或没有找到则返还 -1
从源码判断出只是在提交时,对后缀名进行检测然后上传至后台
1.上传一句话
2.burpsuite抓包,修改后缀,将. jpg 改为.php
访问1.php
源码:
1.上传一句话
2.bp抓包,修改content-type
MiMe是什么?一串简单的字符串组成的初期标识了邮件e-mail的附件的类型,后来在html文件中可以使用属性表示,当文件上传后,content-type会标记文件类型,简单来说当我们上传一个1.php文件的时候,content-type会自动将我们这个文件类型标识为application/octet-stream,不匹配时上传失败,这里仅允许content-type为image/jpeg,image/png,image/gif属性的通过
将content-type标识的application/octet-stream修改为image/jpeg
MiMe常见的绕过格式
源码:
过滤大写绕过,过滤php、asp等为后缀的文件,只是对文件名进行了限制,但是上传文件后,会更改文件名为当前时间
1.上传一句话
2.bp抓包,更改文件后缀
注意:在phpstudy下apache服务下,默认配置文件无法解析以.pthml,.php5等等为后缀的文件,不更改的话服务器无法解析
修改步骤
进入phpstudy的根目录→找到apache文件夹→打开conf→更改httpd.conf配置文件
修改默认值#AddType application/x-httpd-php
AddType application/x-httpd-php .php .phtml .php5 .pht
源码:
过滤大小写绕过,phtml,php5等等
1.先上传.htaccess文件
2.再上传1.jpg
.htaccess文件全称Hypertext Access(超文本入口),提供了针对目录改变配置的方法,通过修改此配置文件,可以帮我们实现自定义错误页面、更改扩展名、使用其他文件作为index文件等等
先上传一个.htaccess文件
SetHandler application/x-httpd-php //所有上传的文件都会当成php来解析
再上传一个1.jpg,被当成php解析
访问
(注:更新后的upload-labs又在第四关后插入第五关,原第五关改为第六关,第六关改为第七关,第七关改为第八关,以此类推)
源码:
方法一:
过滤phtml,php5等等,禁止上传.htaccess文件
1.过滤不严谨,没有过滤Php1,上传1.Php1
方法二:
点绕过
上传文件:1.php. .
过滤phtml,php5等等,禁止上传.htaccess文件
1.过滤不严谨,没有对大小写严格过滤,上传1.Php
源码:
没有对后缀去空处理,没有对大小写进行转换,因此可以在后缀名加空格绕过
1.上传一句话1.Php
2.bp抓包,在filename的文件名1.Php后增加一个空格
源码:
没有对后缀名"."进行处理,利用windows特性,会自动去掉后缀名中最后的".",可在后缀名中加"."绕过
1.上传1.php
2.bp抓包,将后缀修改为1.php.
源码:
在window的时候如果文件名+'::$DATA'会把::$DATA之后的数据当成文件流处理,不会检测后缀名。且保留::$DATA之前的文件名。利用windows特性,可在后缀名中加::$DATA绕过
源码:
代码先去除文件名最后的'.',去除文件名前后的空格,第15行和之前不太一样,路径拼接的是处理后的文件名,导致可以利用1.php. .(点+空格+点)绕过
源码:
str_ireplace函数:替换字符串中的一些字符(不区分大小写)。
语法:str_ireplace(find,replace,string)
find:规定查找的值。
replace:规定替换 find 中的值的值
string:规定被搜索的字符串
如:
输出:
Hello Shanghai!
1.双写绕过,上传一个1.pphphp
2.bp抓包
源码:
入手点在substr函数,返回白名单后进行拼接,如果将后缀名改为.php再利用%00截断后面的内容,即可执行一句话
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
当以GET方式提交请求的时候,数据会在url内暴露出来,以?分割,多个参数之间用&连接
1.上传文件
2.bp抓包,添加%00
注意:
截断条件:php版本小于5.3.4,magic_quotes_gpc为NO
更改php版本
勾选magic_quotes_gpc
源码:
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
以POST方式提交请求的时,数据不会在url内暴露出来,会放置在http包的包体中,以二进制流的方式传输,所以需要在二进制中进行修改增加%00
注:有些人的bp是新版,界面上可能并没有找到可以直接修改二进制的Hex
首先做个标记
然后从右拉栏里找到
将2b修改为00即可
上传文件
访问
源码:
ction getReailFileType($filename){ $file = fopen($filename, "rb"); $bin = fread($file, 2); fclose($file); $strInfo = @unpack("C2chars", $bin);
检测是否为真实图片格式,fread读取前两个字符的数量然后做检查
1.制作图片码,上传文件
2.bp抓包获取文件路径
3.利用文件包含漏洞执行
构造图片码
copy 1.jpg /b + 1.php /a ganyu.jpg
上传图片
利用文件包含访问
源码:
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE
将测定 GIF,JPG,PNG等等 图像文件的大小并返回图像的尺寸以及文件类型
1.修改一句话,上传文件
2.bp抓包获取文件路径
3.利用文件包含漏洞访问
截包,将1.php修改为1.jpg,修改content-type为image/jpeg,然后重放
如果直接访问图片,作为php进行解析,需要利用文件包含访问
payload:127.0.0.1/upload/include.php?file=upload/7220211007162015.gif
或者制作图片码代替头文件绕过
copy 1.jpg /b + 1.php /a ganyu.jpg
php_exif模块来判断文件类型,方法与上面两题相同
注意:需要先启用php_exif模块
源码:
当上传一个文件的时候,首先$fileext会判断是否为jpg的同时,content-type是否为image/jpeg,然后使用move_uploaded_file进行处理,成功则执行二次渲染
1.利用windows下的画图工具,然后保存为一张gif格式的图片(其他格式有的显示上传失败)
2.上传后,保存上传的图片,与原图做比较,利用winhex写入一句话
3.利用bp抓包,获取上传文件路径
4.利用文件包含读取、解析
上传成功后,右击保存上传后的文件
利用winhex,对比原图和上传图片的区别,在相同的地方写入一句话并保存,然后再上传保存的文件
访问
move_uploaded_file()函数将上传文件临时保存,再进行判断
不断上传文件,在文件还没被删除前去读取文件。
如果上传文件1.php内容为
');?>
在判断1.php的时候,服务器会解析写入一个内容为
的2.php文件。这时使用BurpSuite的Intruder不断上传1.php,浏览器不断访问1.php,即可造成条件解析漏洞
1.新建一个1.php文件,写入');?>
2.上传文件,使用bp抓包爆破
上传,设置爆破选项
Start attack
不断刷新浏览器页面后,访问生成的ganyu.php
源码:
利用Apache的解析漏洞,不管最后后缀是什么,构造以.php.xxx结尾,就会被Apache服务器解析成php文件,配合条件竞争访问2.php
注意:这里的路径缺失'/',上传的shell路径为../uploadxxx.php或自行修改源码
源码:
题目多出了一个写入保存名称,注意,与GET提交不同的是,POST方式请求的时,数据不会在url内暴露出来,会放置在http包的包体中,以二进制流的方式进行传输,所以需要在二进制中进行修改增加%00
上传2.php,在上传之前,写入保存名称为upload-19.php
给upload-19.php后写入+jpg(加号只是用作标记)
将+改为00,选择+号
然后从右拉栏里找到
将2b修改为00即可
上传
访问
源码:
检测content-type是否存在白名单
判断save_name是否为空定义$file变量
若file不为数组,则explode('.', strtolower($file))对file进行分割
将file变为一个数组,利用end函数将file数组的最后一个单位赋值给$ext
判断$ext是否匹配白名单
将file数组的第一个元素用点拼接最后一个元素,赋值给$file_name后上传
bp抓包
1.修改content-type
2.修改POST参数为数组类型,索引[0]为upload-21.php,索引[2]为jpg|png|gif,只要第二个索引不为1,$file[count($file) - 1]就等价于$file[2-1],值为空
访问