一键开启自动审计!
趁着这个时间大致浏览了一下网站的结构,它没有把全部功能写到controller里面
没有将
index.php
作为唯一的入口文件,可以访问其他文件进入其他控制器
它采用tp的
URL_MODEL=0
的模式,
index.php
对m传参进行清洗
网站如果访问
index.php
默认访问
Home
模块的
index
控制器。
而想进入后台,则要找到入口文件
××.php
,它的m值为默认
Admin
、进入
admin
模块。
所以要进后台,如果
××.php
没有改变的话,那么访问
××.php
就可以了。
经过不懈的努力,终于找到了一个文件上传的漏洞,这道题有点像ctf,
看来还是要多做点ctf的题呀,多练练思维。
以下为漏洞代码:
* 公共上传图片方法
public
function
Upload
(
)
{
$base64_image_content
=
I
(
"post.img"
)
;
$image_name
=
I
(
"post.name"
)
;
$len
=
I
(
"post.size"
)
;
$baseLen
=
strlen
(
$base64_image_content
)
;
if
(
$len!
=
$baseLen
)
$this
-
>
error
(
"上传图片不完整"
)
;
if
(
preg_match
(
'/^(data:\s*image\/(\w+);base64,)/'
,
$base64_image_content
,
$result
))
{
$uploadFolder
=
C
(
'UPLOADPATH'
)
.date
(
"Ymd"
)
.
"/"
;
if
(
!
is_dir
(
$uploadFolder
))
{
if
(
!
mkdir
(
$uploadFolder
, 0755, true
))
{
$this
-
>
error
(
'创建文件失败'
)
;
$type
=
$result
[
2
]
;
if
(
empty
(
$image_name
))
{
$new_file
=
$uploadFolder
.date
(
"His"
)
.
"_"
.mt_rand
(
0, 1000
)
.
".{
$type
}"
;
}
else
{
$new_file
=
$uploadFolder
.
$image_name
.
"_"
.date
(
"mdHis"
)
.
".{
$type
}"
;
$img_64
=
base64_decode
(
str_replace
(
$result
[
1
]
,
''
,
$base64_image_content
))
;
if
(
file_put_contents
(
$new_file
,
$img_64
))
{
$this
-
>
success
(
complete_url
(
$new_file
))
;
}
else
{
$this
-
>
error
(
"图片不存在"
)
;
由图可知,代码使用tp框架的函数I() 来获取数据,具有一定的安全性,它的函数实现了html实体转化。
但是呢,这里他使用了base64的编码进行输入,所以<>都可以生效。
接下来看一下满足的条件:
1.Size的post传参和
$baseLen
数据长度一样,也就是
size
就是
img
传参的长度。
2.
preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)//
只要输入的
img
满足
data: image/jpg;base64,
就能匹配出三个结果:
3.是否存在目录。(肯定有的~)
代码往下走就是:
$type=$result[2];
也就是说type是文件后缀,那让result[2]=php不就完美了?
于是就有:
data: image/php;base64
再接着这段代码: