安恆12月賽Web題解
阿新 • • 發佈:2018-12-22
吐槽一下
這次的web題目感覺完全是新手題,思路很直接,我就不摻和了,做完web就逃23333,繼續完成密碼學課程實驗報告去了。。。但還是記錄一下。
easy
這個題目考的是一個php反序列化的一個繞過,上來就給了一段程式碼,很簡單
<?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
ezweb2
這個題目上來發現沒什麼線索,只能掃一下目錄,發現了一個admin.php
,但是進去卻回顯You are not admin...
,這樣思路就很明確了,我們需要偽造admin的身份,查一下cookie,果然需要偽造一下,把cookie的值從user
->admin
就好,還需base64一下
然後就可以進入一個命令執行的頁面,輸入ls
發現有回顯,但是很多東西都被過濾了
可以嘗試一下讀檔案,在config.php
發現黑名單
admin.php
<?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
<?php
session_start();
function waf_exec($str){
$black_str = "/(;|&|>|}|{|%|#|!|\?|@|\+| )/i";
$str = preg_replace($black_str, "",$str);
return $str;
}
關鍵是如何繞過這個黑名單去讀到flag,這裡已經把很多東西都過濾了,但是$
以及/
都沒被過濾,可以很好地執行命令
成功讀取flag