第一关
发现有一个checkFile()函数,推测可能是这个函数进行判断的,我们把它删除后再上传。
上传成功
第二关
仅仅判断content-type,于是修改content-type绕过:
第三关
发现是黑名单判断,于是尝试用php3,phtml绕过
在phpstudy的配置文件httpd-conf取消注释
第四关
虽然还是黑名单,但几乎过滤了所有有问题的后缀名,除了.htaccess,于是首先上传一个.htaccess内容如下的文件:
再上传图片马
第五关
还是黑名单,加上了.htaccess,但是没有将后缀进行大小写统一,于是可以通过大小写绕过:
windows忽略大小写
直接在后面干数字
第六关
还是黑名单,但是没有对后缀名进行去空处理,可在后缀名中加空绕过:
php文件后缀大小写
第七关
后面加"."
第八关
后缀加点,这里加俩
第九关
后缀加::$DATA
第十关
黑名单过滤,注意第15行和之前不太一样,路径拼接的是处理后的文件名,于是构造info.php. . (点+空格+点),经过处理后,文件名变成info.php.,即可绕过。
第十一关
依旧是黑名单过滤,注意到,这里是将问题后缀名替换为空,于是可以利用双写绕过:
第十二关
.条件:php版本小于5.3.4 2、php.ini的magic_quotes_gpc为OFF状态
知识点:这里利用的是00截断。move_uploaded_file函数的底层实现类似于C语言,遇到0x00会截断。
看到是白名单判断,但是$img_path直接拼接,因此可以利用%00截断绕过
第十三关
这题和上一题基本一样,只是save_path不在URL中了,而在POST数据里面,由于POST里面的数据不会被url自动解码,所以要稍微改变一下,首先,先改好路径,然后再路径后面加上一个字符,什么字符都可以,这里我为了方便用+号。
因为是十六进制所以这种截断叫做是0x00截断,其实是%00截断最终被url解码还是会变成0x00的。在url中%00表示ascll码中的0,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。这是一样的道理,所以这里还有另外一种做法。
第十四关
需要上传图片木马
正常是可以上传上的,因为本身就是jpg格式
访问查看居然是正常页面
以文本方式打开图片马,发现php代码前面为乱码
再木马文件前面随便加几个
合成新的木马文件
上传后使用DVWA的文件包含查看
第十五关
和上一关差不多
第十六关
估计下载的源码错误,点击上传显示空页面上传页面的框架内什么也没有,所以放弃。
第十七关 二次渲染
上传图像成功再下载下来
上一关在图片马最后输入的php代码没有了
找个空的地方输入php代码
没用十六进制工具,尝试可不可以
好像废掉了
使用十六进制试试
吐了,又废了
用这个方法试了一个gif文件成功了
第十八关
上传php文件,抓包
发送到intruder,情书$变量
设置没有载荷,无限期循环,开始攻击
python启动脚本文件
命令行运行
Python 脚本名.py
上传成功返回ok
第十九关(条件竞争)
代码可以看出,代码先检查后缀,然后上传文件,然后更改文件名。这里又有条件竞争,在文件改名之前访问到它就行(配合文件解析漏洞)
我去看了看checkExtension()函数的代码
checkExtension()函数检查最后一个点之后的文件名,也就是后缀,存在文件解析漏洞
上传123.php.xxx ,在后缀后面再加个后缀,我直接上传的图片马就成功了,看别的教程和上一关一样需要不停跑,这就有点复杂了,图片马不香吗
第二十关 文件解析漏洞
第二十一关
相比较于上一关的源码,此处服务器端先是检查了MIME类型,然后判断save_name参数是否为空,为空就把文件本来名称赋值给
f
i
l
e
,
否
则
就
是
将
s
a
v
e
n
a
m
e
参
数
的
值
赋
给
它
。
紧
接
着
判
断
file,否则就是将save_name参数的值赋给它。紧接着判断
file,否则就是将savename参数的值赋给它。紧接着判断file是否是数组。
如果不是数组则将其拆成数组,然后数组最后一个的值(end函数就是取数组最后一个的值)同白名单做比较,符合jpg、png、gif中的一种就允许上传了。
在允许上传之后还要把数组的值拼接在一起对文件进行重命名。所以我们可以构造save_name[0]=cs.php/ save_name[1]置为空 save_name[2]=jpg(一个白名单的合法后缀)。
这样的话,reset(
f
i
l
e
)
取
的
是
数
组
的
第
一
个
元
素
即
c
s
.
p
h
p
/
,
然
后
接
了
一
个
′
.
′
符
号
,
之
后
又
将
数
组
最
后
一
个
元
素
内
容
拼
接
到
一
起
。
可
能
有
的
人
会
疑
问
数
组
最
后
一
个
值
不
是
j
p
g
吗
?
其
实
当
我
们
只
设
置
了
两
个
数
组
元
素
的
时
候
,
数
组
的
元
素
个
数
就
只
有
两
个
了
。
!
[
在
这
里
插
入
图
片
描
述
]
(
h
t
t
p
s
:
/
/
i
m
g
−
b
l
o
g
.
c
s
d
n
i
m
g
.
c
n
/
20201226210831139.
p
n
g
)
既
然
一
共
只
有
两
个
元
素
,
这
里
就
是
file)取的是数组的第一个元素即cs.php/,然后接了一个'.'符号,之后又将数组最后一个元素内容拼接到一起。 可能有的人会疑问数组最后一个值不是jpg吗?其实当我们只设置了两个数组元素的时候,数组的元素个数就只有两个了。  既然一共只有两个元素,这里就是
file)取的是数组的第一个元素即cs.php/,然后接了一个′.′符号,之后又将数组最后一个元素内容拼接到一起。可能有的人会疑问数组最后一个值不是jpg吗?其实当我们只设置了两个数组元素的时候,数组的元素个数就只有两个了。既然一共只有两个元素,这里就是file[2-1]也就是$file[1]。因此拼接的就是空的,最终得到的文件名就是cs.php/.。
对于像cs.php/.这样的文件路径,move_uploaded_file()函数会忽略掉文件末尾的/.。如此一来我们上传到服务器的文件还是被重命名为了php后缀。
第一步:上传文件,抓包修改参数