0x00背景

买了一本从0到1来看,是真的贵。不吐槽了。我只配买二手的。然后正好BUU上有配题。顺带刷了。反正都是基础题。当复习多年前学的基础知识了。

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

这个题一打开,就是让搜集信息。我想都没想,输入robots.txt:
1621582984012

结果呢访问:

1621583002279

flag1:n1book{info_1

只有半截。这ctf题目是这样的。

按照渗透常规的话。可以做个目录扫描。而ctf题型里面也涉及到一个源码泄露:

.git泄露
git是一个主流的分布式版本控制系统,开发人员在开发过程中经常会遗忘.git文件夹,导致攻击者可以通过.git文件夹中的信息获取开发人员提交过的所有源码。
.svn泄露
.hg泄露

扫一下这个目录:

由于buu特性。肯定是429加个延时吧。

最后只有延迟1s才不会429.。哎。等吧继续看下书。

扫出来一个了:

1621583946057

访问看一哈。这儿又涉及到一个知识点,swp是linux下面使用vi生成的临时文件。因而使用vi即可打开。

1621584140987

这哈有了:

flag1:n1book{info_1
flag3:p0rtant_hack}'

然后还差flag2,这哈继续看dirsearch结果:

1621584237435

访问哈:

flag2:s_v3ry_im
所以最后拼接下:n1book{info_1s_v3ry_imp0rtant_hack}

信息收集是非常重要的!知己知彼,百战不殆!

这儿记录下敏感备份文件的知识点:

1.gedit备份文件

这个我还不知道呢。使用gedit编辑器(Linux)下保存文件后,当前目录就会生成一个后缀为~的文件。

也就是说上面这个题目中的index.php~是使用改编辑器编辑了index.php留下的。我们试一试:

网上都用的ubuntu,懒得装了。

2.vim备份文件

vim的泄露问题发生在用户意外退出文件时候会生成一个备份文件:

.文件名.swp(这里还有个小知识点,第一次意外退出是swp第二次swo,第三次swn一次类推)

swp备份文件可以使用vim -r命令回复。

其实在实际渗透中,常规文件导致源码泄露比较多:

比如:robots.txt
readme.txt
www.zip/rar/tar.gz
又或者是网站域名的压缩包
baidu.com.zip

继续做题。

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

1621585248115

这不就git源码泄露。

用下我们的工具。

我直接用的GitHack。其他都是一样的。

1621585405423

然后有个index.html的源码。直接就有flag.

都没涉及到分支的问题。包括怎么恢复历史上传文件。都没用到命令。其实就是多几步都差不多。

刷题都到sql注入了。书上的话还有banner识别。简单过一下吧。平常用的也挺多的。

继续刷题了。sql注入:

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

http://79ca0aae-c50b-4bf5-8e7a-b13351bf1edd.node3.buuoj.cn/index.php?id=1%27+and+%271%27=%271
直接就存在sql注入。最基础的。sqlmap一把梭哈吧。不想手注了。

1621586039632

老套路了。每次都这样玩。可恶。然后我回过头发现。字段名是fllllag了。可恶在cmd里面1和l好像。

1621586203783

ok完成。

我为啥老做些不动脑子的easy题。sql-lasb也是刷了几遍了。都当玩嘛。哎。

[第一章 web入门]afr_1

进入页面后:

http://1666ed77-0011-4f7b-b938-28f86f42c6a1.node3.buuoj.cn/?p=hello

结果显示hello,world!

也就是这儿p参数可能指文件极有可能后台代码:

include("$_GET['p']"."php")

所以解题很简单了:

p=php://filter/convert.base64-encode/resource=flag
//这儿用php的伪协议进行文件流读取,猜测为flag文件。

然后得到一串base64:

1622349656175

[第一章 web入门]afr_2

进去后只有一个图片:

1622356870895

点到这个链接:

退到img后发现目录遍历:

1622356906101

然后用../进行遍历:

http://e7fd8615-3fa5-46b7-a5ec-82ed9516636a.node3.buuoj.cn/img../

1622356952454

直接就有flag了。。

今天看到一个知识点,这也是为什么../有时候能用有时候不能用的原因了。

有的是代码直接把../这三个都过滤了。而更绝的是有点像sql注入那种预处理,比如上面这个/img../它如果没有把../当作上级目录识别而是识别img..为一个目录就会提示404而不会跨越目录。

[第一章 web入门]afr_3

继续第三道题

直接点击点击就出现了下面的:

http://73c1f4b2-5f9a-4d5c-8ad3-a7bbdef04e71.node3.buuoj.cn/article?name=../../../../../../../../../../../../etc/passwd
//我构造的../就读取到了/etc/passwd

然后直接读取flag.

结果提醒。no permission。这。

我发现只要输入flag字符就会提示没有权限。可以用Linux中bash的一些字符来绕过。

例如\。不行看样子不是这个思路。

重新看了下书一般ctf题还有其他比较重要的目录:

/proc/self/cmdline
获取当前执行的系统命令。
获取这个主要是有些题目构建flag文件需要执行了某些命令而没有结束进程

1622360563763

执行了一个server.py

/proc/self/cwd/server.py
获取执行文件的内容

得到

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)

虽然整齐。特殊字符被编码了。看着好难受