不会SQL注入的PHPer不是好的python脚本编写者。
一、题目分析
进入发现站点存在pdf文件链接和子站点,不过能找到的信息也就这些了。
那么扫个后台——发现存在login.php和admin.php,根据出题者的hint可知,admin页面无法绕过,并且通过设置debug参数,我们可以查看login页面源码。
简单测试发现login页面存在注入点(有报错,后台数据库是sqlite),通过代码审计及关于sqlite数据库特性的一些联想,我们可以找到注入反馈点:cookie。从这里我们能得到admin密码的sha1哈希值,并且根据表中的hint可知:对应的password在这个教授的论文里。
由此,最后的工作就是:爬取该站点的所有pdf文件并爆破。
知识点小结:
sqlite_master、简单爬虫、PDF文件解析。
二、具体思路
- 使用御剑扫后台,发现存在login.php页面和admin.php页面。
一点感想:基本上你可以自己编写一个扫描器——就是一本字典和状态码检测,没什么难的。
- admin页面F12发现关键hint:don’t even try to bypass this。那么转到login页面寻找漏洞。
- login页面F12发现关键hint:debug-Parameter。在url后加上参数debug得到页面源码,跟进。
- 代码审计可知,sql注入点位于query函数,sql反馈点位于setcookie函数。需要注意的是:password是和salt ‘Salz!’拼接之后经过一个sha1哈希才传入查询逻辑的,这也就意味着数据库中“password”表项存放的是密码加盐之后的哈希值。
- 在login表单中简单注入可发现后端数据库是sqlite。那么通过查询其全局模式表sqlite_master(存放本数据库所有表、视图、索引、触发器等的定义)可找到用户表的sql定义。
构造payload:user=’ union select name,sql from sqlite_master --。(sqlite注释符是‘–’)。
从cookie反馈信息可以看到:用户表名为Users,具有id、name、password、hint四个表项。
- 那么再依次从Users表中提取出id、name、password、hint。
payload:user=’ union select id, (id或name或password或hint) from Users --。
从cookie反馈信息中可以找到用户admin的加盐密码哈希值,以及一条hint:my fav word in my fav paper?!
由此可见,密码就藏在教授的论文中,所以我们需要爬取站点所有pdf并转换为txt,逐一比对以求爆破。
- 爬取站点所有pdf文件。
import urllib.request
import re
allHtml=[]
count=0
pat_pdf=re.compile("href=\"[0-9a-z]+.pdf\"")
pat_html=re.compile("href=\"[0-9]/index\.html\"")
def my_reptile(url_root,html):
global pat_pdf
global pat_html
html=url_root+html
if(isnew(html)):
allHtml.append(html)
print("[*]starting to crawl site:{}"<