Web-1(1-4)-BUUCTF平臺

本篇內容:
[HCTF 2018]WarmUp
[強網杯 2019]隨便注
[護網杯 2018]easy_tornado
[SUCTF 2019]EasySQL

上一篇 | 目錄 | 下一篇


[HCTF 2018]WarmUp

一打開一個表情包,直接F12查看源代碼,發現source.php
在這裏插入圖片描述
訪問發現如下代碼:

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

在這裏插入圖片描述

首先,要傳入一個file參數。
1、file不爲空
2、file值是字符串
3、經過emmm類裏的checkFile方法後返回值爲1

都成立的情況下就會包含(include)file。

分析checkFile方法。
有一個白名單

$whitelist = ["source"=>"source.php","hint"=>"hint.php"];

那就包含一下hint.php試試,發現flag in ffffllllaaaagggg。
在這裏插入圖片描述
接着往下看:
在這裏插入圖片描述

1、if判斷中共有三個判斷會return true。之前的payload:

source.php?file=hint.php

其實就是第一個判斷的return true。但這裏就無法包含我們想要的ffffllllaaaagggg文件。

2、那就試着滿足第二個判斷的return true,構造payload:

1)source.php?file=hint.php?../../../../../ffffllllaaaagggg
(2)source.php?file=hint.php%3f../../../../../ffffllllaaaagggg

這裏%3f就是?的url編碼,由於瀏覽器會自動的解碼一次,所以%3f就被解碼爲?了,和第一條沒區別。

成功拿到flag。
在這裏插入圖片描述
在這裏插入圖片描述

這裏能成功包含ffffllllaaaagggg文件是因爲PHP將第一個斜槓/之前的視爲了一個文件夾,
然後../逐級返回根路徑下找ffffllllaaaagggg文件,../多寫幾個完全沒有問題。

3、同樣的,試着滿足第三個判斷的return true,構造payload:

source.php?file=hint.php%253f../../../../../ffffllllaaaagggg

在這裏插入圖片描述

這裏%253f就是?的兩次編碼,經過瀏覽器一次url解碼,php判斷裏的一次url解碼後就變爲?了,滿足條件。




[強網杯 2019]隨便注

訪問網址
在這裏插入圖片描述
輸入 1’ 報錯, 1’# 顯示正常,說明存在注入。
輸入 1’ order by 2# 顯示正常,輸入 1’ order by 3# 報錯。
輸入 1’ union select 1,2# 返回一個正則過濾規則,幾乎常用的字段都被過濾了。
在這裏插入圖片描述
嘗試堆疊注入 1’;show databases# 成功回顯:
在這裏插入圖片描述
在這裏插入圖片描述
得到兩個表 1919810931114514words
words表裏的字段:

1';show columns from words#

在這裏插入圖片描述
發現words表字段爲id和data,這和最開始回顯的內容對應。
在這裏插入圖片描述
猜測回顯的就是words表裏的內容。
再來看看1919810931114514 表的內容,數據庫中全數字組成的表需要用反引號`括起來。

1';show columns from `1919810931114514`#

在這裏插入圖片描述
發現這張表有我們想要的flag。
回顯的是words表裏的id和data,那怎麼取出1919810931114514表裏的flag呢?
騷操作:改名。
沒有過濾alterrename,那就將1919810931114514表改名爲words,將flag字段改爲id。

1、在MySQL中,RENAME語句修改表名。基本語法格式如下:
	RENAME 舊錶名 TO 新表名;
2、在MySQL中,ALTER TABLE語句修改數據表的字段名。基本語法格式如下:
	ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型;

最終payload:

1';rename table words to aaa;rename table `1919810931114514` to words;alter table words change flag id varchar(100);show columns from words;#

在這裏插入圖片描述
接着只要輸入 1' or '1'='1 就能拿到flag。
在這裏插入圖片描述





[護網杯 2018]easy_tornado

訪問網址:
在這裏插入圖片描述
點擊/flag.txt,說明flag在 /fllllllllllllag 裏。
在這裏插入圖片描述
點擊/welcome.txt,render()函數是渲染函數,進行服務器端渲染。具體的我不咋懂,但是能想到的是模板注入
在這裏插入圖片描述
點擊/hints.txt
在這裏插入圖片描述
直接嘗試一下訪問/fllllllllllllag,

file?filename=/fllllllllllllag

發現網址跳轉了,還發現了奇怪的參數。
在這裏插入圖片描述
reader()函數聯想到模板注入,嘗試一下:
在這裏插入圖片描述
嘗試了±*/等符號,都被過濾了,異或^沒被過濾,成功回顯。
注意到之前訪問/flag.txt/welcome.txt/hints.txt頁面時後頭都帶了md5值,然後/hints.txt給瞭如下信息:

md5(cookie_secret+md5(filename))

現在就要知道cookie_secret怎麼拿到,百度了一下發現是Tornado框架的附屬文件handler.settings中存在cookie_secret。
嘗試一下:

error?msg={{handler.settings}}

在這裏插入圖片描述
cookie_secret爲 bdc2d594-c0cc-4920-b52d-84c0decdb795 。
然後filename就是/fllllllllllllag了,進行md5加密後就是 3bf9f6cf685a6dd8defadabfb41a03a1 。
在這裏插入圖片描述
cookie_secret和filename拼接後再進行md5加密,值爲 34ad8ee4e06e7d3f7283264d7a32d30c 。
在這裏插入圖片描述
嘗試訪問一下拿到最終flag:

file?filename=/fllllllllllllag&filehash=34ad8ee4e06e7d3f7283264d7a32d30c

在這裏插入圖片描述





[SUCTF 2019]EasySQL

訪問網址:
在這裏插入圖片描述
嘗試了一下,發現回顯的就三種樣子:
成功回顯就會有存在Array字眼;
失敗回顯就是空;
被過濾了就是Nonono。

Fuzz模糊測試了一下,發現過濾了一大堆:
在這裏插入圖片描述
嘗試了一下堆疊注入,成功回顯:

1;show databases;

在這裏插入圖片描述

1;show tables;

在這裏插入圖片描述

1;show columns from tables;

在這裏插入圖片描述
該死的,查看了一下之前Fuzz的結果,發現from被過濾了。
啊啊啊,不會寫,百度,發現原理是

select $_GET['query'] || flag from flag

還發現原來沒有過濾*,導致了非預期解。
在這裏插入圖片描述
預期解:

知識點:
PIPES_AS_CONCAT:將“||”視爲字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣的,也和字符串的拼接函數concat相類似。
在oracle 缺省支持 通過“||”來實現字符串拼接,但在mysql缺省不支持。需要調整mysql 的sql_mode 模式爲pipes_as_concat。

所以payload如下:

1;set sql_mode=pipes_as_concat;select 1

在這裏插入圖片描述






自己還是太菜了,還需努力啊。

========================================================
上一篇-----------------------------------目錄 -----------------------------------下一篇
========================================================
轉載請註明出處
本文網址:https://blog.csdn.net/hiahiachang/article/details/105411470
========================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章