XCTF 高校战“疫”网络安全分享赛
easy_trick_gzmtu
- 首先说一下这个题的脑洞确实强
- 打开题目后,是一个好看的博客,源码里提示
?time=Y或者?time=2020
- 测试的存在盲注,但是当构造payload的时候,一直是500,猜测是后端对提交的数据进行了过滤,试了n种姿势,都fuzz不出来,想了好久,最后才发现是,每个字符前加上
\
就行了(orzzzzzzzzzz
- 接下来就是盲注脚本一把梭
- 爆出的最后数据如下
数据库名:trick
表名:admin,content
列名:id,username,passwd,url,id,content,createtime
admin表内容:
username:admin
password:20200202goodluck //goodluck个锤子
url:/eGlhb2xldW5n
- 发现了另一个链接,套娃。。。。。
- 访问后,发现是要登陆的,用爆出来的登陆一下
- 发现可以读取文件
- 在源码里又发现提示:
<!--/eGlhb2xldW5n/eGlhb2xldW5nLnBocA==.php-->
- 尝试读一下,回显:请从本地访问
- 本来以为是XFF之类的头部伪造,后来才发现想错了(给的提示就有歧义
- 使用file://localhost/var/www/html/eGlhb2xldW5n/eGlhb2xldW5nLnBocA==.php(用127.0.0.1好像也不行,后来读了源码才知道,后台只写了localhost,有点崩溃
- 读出的
eGlhb2xldW5n/eGlhb2xldW5nLnBocA==.php
<?php
class trick{
public $gf;
public function content_to_file($content){
$passwd = $_GET['pass'];
if(preg_match('/^[a-z]+\.passwd$/m',$passwd))
{
if(strpos($passwd,"20200202")){
echo file_get_contents("/".$content);
}
}
}
public function aiisc_to_chr($number){
if(strlen($number)>2){
$str = "";
$number = str_split($number,2);
foreach ($number as $num ) {
$str = $str .chr($num);
}
return strtolower($str);
}
return chr($number);
}
public function calc(){
$gf=$this->gf;
if(!preg_match('/[a-zA-z0-9]|\&|\^|#|\$|%/', $gf)){
eval('$content='.$gf.';');
$content = $this->aiisc_to_chr($content);
return $content;
}
}
public function __destruct(){
$this->content_to_file($this->calc());
}
}
unserialize((base64_decode($_GET['code'])));
?>
<?php
include("../conn.php");
if(empty($_SESSION['login'])){
die('请登录!');
}
if(isset($_GET['url'])){
$url = $_GET['url'];
$parts = parse_url($url);
if(empty($parts['host']) || $parts['host'] != 'localhost') {
die('请从本地访问');
}
if(!preg_match