攻防世界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.1localhost關鍵字,隨手試一下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');

Tags: