攻防世界Web之fakebook
打開題目,得到一個網頁,包含一個表格、兩個按鈕。
習慣性先查看網頁源碼,但沒發現有效信息。
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Fakebook</title>
<link rel="stylesheet" href="css/bootstrap.min.css" crossorigin="anonymous">
<script src="js/jquery-3.3.1.slim.min.js" crossorigin="anonymous"></script>
<script src="js/popper.min.js" crossorigin="anonymous"></script>
<script src="js/bootstrap.min.js" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<h1>the Fakebook</h1>
<p>Share your stories with friends, family and friends from all over the world on <code>Fakebook</code>.</p>
<table class="table">
<tr>
<th>#</th>
<th>username</th>
<th>age</th>
<th>blog</th>
</tr>
<tr></tr>
</table>
</div>
</body>
</html>
打開login.php
,是一個登錄頁面,隨手試了幾個弱口令和SQL注入,沒有成功,查看網頁源碼,也沒有提示,估計問題不在這。
打開join.php
頁面,隨便輸入一點東西提交,都提示錯誤:Blog is not valid.
,說明對blog
字段的格式有要求,從字面和題目信息上理解,就是分享你的故事,應該沒什麼限制才對。
後來想了一下,可能是需要提交一個博客地址,嘗試提交//127.0.0.1
和//localhost
,均提示錯誤。
猜測可能過濾了127.0.0.1
和localhost
關鍵字,隨手試一下www.baidu.com
,此時提示成功。
再次打開首頁,發現多了一條記錄。
點擊用戶名111
,打開一個頁面,看到the contents of his/her blog
,興奮了一下,不會是ssrf吧?
直接查看源碼,發現是空的base64
。
直接上DNSLOG試試,也不行。到這裡思路就斷了,重新整理了一下,發現被繞進去了,問題不一定在blog
字段,這個用戶名和年齡是有回顯的,猜測是XSS或二次注入,直接排除XSS,試一下注入吧。
好傢夥,直接報錯,把Web路徑報出來了,明顯是SQL注入。
嘗試了一下插入已存在的用戶名時會提示用戶名已存在,說明後台會先在數據庫中查找用戶是否存在,可以用圖中的SQL注入繞過檢測。
猜測後台SQL語句如下:
# 檢查用戶是否存在
SELECT * FROM user WHERE username='';
# 插入新的記錄
INSERT INTO user SET username='',passwd='',age='',blog='';
但是插入數據時,注入的用戶名會被直接寫入數據庫,說明寫入的時候用SQL預編譯,無法注入。
直接用sqlmap跑,沒發現flag,把users
表dump出來,data
這一列明顯是PHP序列化,但是只能控制其中的字符串,不能控制整個反序列化字符串,所以不能使用反序列化。
使用sqlmap的--sql-shell
參數,進入SQL交互,嘗試執行SQL語句,把源碼dump出來分析,沒分析出啥。
select load_file('/var/www/html/index.php');
select load_file('/var/www/html/user.php');
select load_file('/var/www/html/db.php');
select load_file('/var/www/html/view.php');
隨手試一下flag.php
,居然成功了。
select load_file('/var/www/html/flag.php');