Csrf ( cross site request forgery )
- 20 trang
- file .pdf
CSRF ( Cross Site Request Forgery ) là kĩ thuật tấn công bằng cách sử dụng
quyền chứng thực của người sử dụng đối với 1 website khác.Các ứng dụng web
hoạt động theo cơ chế nhận các câu lệnh http từ người sử dụng,sau đó thực thi các
câu lệnh này.
CSRF sẽ lừa trình duyệt của người dùng gửi đi các câu lệnh http đến các ứng dụng
web.Trong trường hợp phiên làm việc của người dùng chưa hết hiệu lực thì các câu
lệnh trên sẽ dc thực hiện với quyền chứng thực của người sử dụng.
CSRF còn dc gọi là "session riding", "XSRF"
Các kiểu tấn công CSRF xuất hiện từ những năm 1990,tuy nhiên các cuộc tấn
công này xuất phát từ chính IP của người sử dụng nên log file của các website k
cho thấy các dấu hiệu của CFRS.Các cuộc tấn công theo kĩ thuật CSRF k dc báo
cáo đầy đủ,đến năm 2007 mới có một vài tài liệu miêu tả chi tiết về các trường hợp
tấn công CSRF.
Năm 2008 người ta phát hiện ra có khoảng 18 triệu người sử dụng eBay ở Hàn
Quốc mất các thông tin cá nhân của mình.Cũng trong năm 2008,một số khách
hàng tại ngân hàng Mexico bị mất tài khoản cá nhân của mình.Trong 2 trường hợp
kể trên hacker đều sử dụng kĩ thuật tấn công CSRF
Bob duyệt qua 1 diễn đàn yêu thích của mình như thường lệ.Một người dùng
khác,Malory ,đăng tải 1 thông điệp lên diễn đàn .Giả sử rằng Malory có ý đồ k tốt
và anh ta muốn lấy tiền từ những người có tài khoản tại ngân hàng như Bob.Malory
sẽ tạo 1 thông báo,trong đó có chèn 1 đoạn code như sau:
Mexico Bank has just announce a new interest rate....

Đoạn mã trên dc che giấu rất khéo,thứ nhất nó thêm các thông điệp bình thường
để người dùng không chú ý.Thứ hai thẻ "
kích thước 0x0 pixel và người dùng sẽ k thấy dc
Giả sử Bob vừa mới truy cập vào tài khoản ngân hàng của mình và chưa thực hiện
logout để kết thúc.Trình duyệt của Bob sẽ gửi câu lệnh
http get đến địa chỉ lưu trong thẻ "
bằng quyền chứng thực của Bob.
Trong ví dụ trên hacker có thể sử dụng 1 URL khác ,ví dụ :
http://www.projectpage.com/admin/project/13/delete để xóa đi một dự án
quan trọng nào đó mà Bob đang làm.
Một chú ý là cần phải có 1 chút kĩ thuật Social Engineering để có thể biết dc victim
sử dụng tài khoản ngân hàng nào,account của dịch vụ nào và forum thường hay
vào là gì.Xem thêm Social Engineering
Ngoài thẻ "![]()
Các kĩ thuật CSRF rất đa dạng,lừa người dùng click vào link,gửi email chứa các
đoạn mã độc đến người dùng...Hacker còn có thể che giấu các link ở trên rất khéo
léo.Ví dụ trong trường hợp thẻ "
link chứa trong src="http://mexicobank.com/withdraw?
account=bob_id&amount=1000000&for=Malory_ id"/>.
Tuy nhiên người dùng sẽ rất có phát hiện nếu hacker dùng đường link như sau :

và cấu hình lại máy chủ
Redirect 302/abc.jpg http://mexicobank.com/withdraw?
account=bob_id&amount=1000000&for=Malory_ id"/>
Kết thúc vấn đề kĩ thuật tại đây.Bạn có thể xem thêm một số chủ đề có liên quan:
CEH v6 Module 12 : Phishing
CEH v6 Module 13 :Hacking Email Account
Social Engineering
XSS
CSRF SECURE
Dựa trên nguyên tắc của CSRF "lừa trình duyệt của người dùng(hoặc người dùng)
gửi các câu lệnh http",các kĩ thuật phòng tránh sẽ tập trung vào viêc tìm cách phân
biệt hạn chế các câu lệnh giả mạo.
Có nhiều lời khuyến cáo dc đưa ra ,tuy nhiên cho đến nay vẫn chưa có biện pháp
nào có thể phòng chống triệt để CSRF.Sau đây là một vài kĩ thuật sử dụng.
HẠN CHẾ THỜI GIAN HIỆU LỰC CỦA SESSION (SESSION TIMEOUT)
Tùy theo ngôn ngữ hoặc web server dc sử dụng mà các thực hiện có thể rất khác
nhau.Với PHP,thông số "session.gc_maxlifetime" trong file php.ini qui định thời
gian hiệu lực của session.
Nếu lập trình viên sử dụng ngôn ngữ k hỗ trợ chức năng này và họ phải quản lý
session bằng CSDL (ví dụ lưu bảng session...) hay bằng các file tạm (ví
dụ /tmp/session/) thì họ sẽ viết các chương trình hỗ trợ việc xóa các session này
(cron job,scheduler...)
SỬ DỤNG GET VÀ POST HỢP LÍ
Phương thức GET dc dùng để truy vấn dữ liệu,đối với các thao tác tạo ra sự thay
đổi hệ thống thì các phương thức khác như POST hay PUT sẽ dc sử dụng (theo
khuyến cáo của W3Ctổ chức tạo ra chuẩn http)
SỬ DỤNG CAPTCHA,SỬ DỤNG CÁC THÔNG BÁO XÁC NHẬN.
Captcha dc sử dụng để nhận biết đối tượng đang thao tác với hệ thống là con
người hay k?Các thao tác quan trọng như"đăng nhập" hay là " chuyển
khoản" ,"thanh toán" thường là hay sử dụng captcha.Tuy nhiên ,việc sử dụng
captcha có thể gây khó khăn cho một vài đối tượng người dùng và làm họ khó
chịu.
Các thông báo xác nhận cũng thường dc sử dụng,ví dụ như việc hiển thị một thông
báo xác nhận "bạn có muốn xóa hay k" cũng làm hạn chế các kĩ thuật
SỬ DỤNG TOKEN
Tạo ra một token tương ứng với mỗi form,token này sẽ là duy nhất đối với moit64
form và thường thì hàm tạo ra token này sẽ nhận đối số là"session".Khi nhận lệnh
http post về,hệ thống sẽ thực hiên so khớp giá trị token này để quyết định có thực
hiện hay k.
Một số framework hiện nay đã hỗ trợ tạo token như là: aspnet webform,ruby on
rails,django.
Mã:
def authenticity_token_from_session_id
key = if request_forgery_protection_options[:secret].respond_to?
(:call)request_forgery_protection_options[:secret].call(@session)
else
request_forgery_protection_options[:secret]
end
digest = request_forgery_protection_options[:digest]||= 'SHA1'
OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new(digest),key.to_s,
session.session_id.to_s)
end
Đây là một đoạn mã Ruby tạo token session của người dùng.Token này dc tạo từ
1 sesstion và 1 "secretekey" ( khóa bí mậtdo người xây ứng dụng tạo ra )
Mã:
onclick="if (confirm('Are you sure?'))
[var f = document.
createElement('form');
f.style.display = 'none';
this.parentNode.appendChild(f);
f.method = 'POST';
f.action = this.href
var m = document.
createElement('input');
m.setAttribute('type','hidden');
m.setAttribute('name','_method');
m.setAttribute('value','delete');
f.appendChild(m);
var s = document.
createElement('type','hidden');
s.setAttribute('name','authenticity_token');
s.setAttribute('value','4a21023fcbb630120a747e317f-f6a1bc912797e');
f.appendChild(s);f.submit(););
return false;">
Destroy
Đoạn mã trên sử dụng phương thức POST để thực hiện thao tác xóa ,đồng thời nó
cũng hiển thị thông báo,đòi hỏi người dùng phải xác nhận.Nó còn sử dụng thêm 1
"authenticity_token".
Bên phía máy chủ,trước khi thực hiện phương thức "xóa" theo 1 đoạn mã trên thì
chương trình sẽ kiểm tra xem câu lệnh http gửi đến có phải là post k
SỬ DỤNG COOKIE RIÊNG BIỆT CHO PHẦN QUAN TRỊ.
Một cookie k thể dùng chung cho các domain khác nhau,chính vì vậy việc sử dụng
"admin.site.com" thay vì sử dụng" site.com/admin" là an toàn hơn
THIẾT KẾ HỆ THỐNG LOG
Một vài framework ghi tất cả thông tin,dữ liệu xử lý vào các file log.Điều này rất
nguy hiểm nếu như đó là các thông tin nhạy cảm như mật khẩu ,số tài khoản.
KIỂM TRA REFERRER
Kiểm tra xem các câu lệnh http gửi đến hệ thống xuất phát từ đâu.Một ứng dụng
web có thể hạn chế chỉ thực hiện các lệnh http gửi đến từ các trang đã dc chứng
thực.
Tuy nhiên cách làm này có nhiều hạn chế và k thật sự hiệu quả.
KIỂM TRA IP.
Một số hệ thống quan trọng chỉ cho truy cập từ những IP dc thiết lập sẵn
Kĩ thuật CSRF còn có thể dc sử dụng với kĩ thuật XSS ( Cross Site
Scipting ) để tạo ra những cách tấn công tinh vi hơn
CSRF by Example, How to do it, How to
defend it
July 6, 2009 07:45 by
For a little bit of background I would recommend that you read the article that I originally
wrote titled XSS by Example. I was originally intrigued by Cross Site Scripting and
decided to give it a try. As dblackshell pointed out in the comments what I had originally
attempted was CSRF or Cross Site Request Forgery. Following the link he put in the
article and reading up a bit more I finally figured out how to perform a Cross Site
Request Forgery to kick an Article at DotNetKicks.com (a rating site similar to Digg
for .Net developers).
CSRF what didn't work
If you read my previous article you would have seen my first two failed attempts at
CSRF. In one attempt I tried a cross site AJAX post which the browser wouldn't allow.
In my second attempt I tried to load DotNetKicks in an IFrame and then manipulate it
from my web page which the browser didn't allow.
CSRF what did work
I knew that the request needed to be a post so what I finally ended up getting to work was
a Form with an action that posted the values to DotNetKicks.com. Below is an image
from Firebug showing the request that I needed to forge.
AJAX can make CSRF difficult
If you are familiar with Firebug than you can clearly tell that the post above is an AJAX
post using JSON and not simply a name value pair. At first I had a difficult time
duplicating the request as the following type of form would not work.
view plaincopy to clipboardprint?
1.
What I finally got to work was an input element with a blank name and a value of the
JSON string that I wanted to replicate. Below is the code that will vote for whatever
article you choose.
view plaincopy to clipboardprint?
1.
2.
3.RunXc CSRF example
4.
6.
19.
20.
21.
25.
27.
28.
If you create an ASPX page using the html above you can coerce anyone on your website
to kick an article of your choosing (as long as they are still logged on at
DotNetKicks.com. remember that is how CSRF works) with a simple Iframe somewhere
else on your site that looks like this.
view plaincopy to clipboardprint?
1.
Now that I know this what should I do?
Information is power. I hope with this little script that anyone who has a website that
could be targeted by CSRF that they might be able to hack their own site and then figure
out how to protect their site from it. You need to understand how hackers will attack
your site to be able to protect yourself from it. I know that you can use a hidden field and
validate the value against what you sent out but I would like to know what others are
doing to protect against this kind of attack.
Hướng dẫn : Sử dụng chương trình Scuba để rà soát security cho
Oracle Database March 17, 2009
Filed under: Hướng dẫn : Sử dụng chương trình Scuba để rà soát security cho Oracle
Database,Linux — kienmanowar @ 4:36 am
Tags: use Scuba to scan Oracle DB
Hướng dẫn : Sử dụng chương trình Scuba để rà soát
security cho Oracle Database
Nội dung chính
Giới thiệu
Cài đặt Scuba
Cấu hình để kết nối tới Database cần test
Test Configuration
Output Options Configuration
Thực hiện rà soát Cơ sở dữ liệu đã chọn
Xuất kết quả ra báo cáo
Giới thiệu
Scuba là một công cụ nhỏ gọn dùng để đánh giá cơ sở dữ liệu, nó được sử dụng để
thu thập các thông tin cấu hình liên quan tới security của một database. Bằng việc sử
dụng Scuba có thể giúp chúng ta tìm ra hàng trăm thiếu sót như unpatched sofware
(phần mềm chưa cập nhật bản vá), unsafe processes (các tiến trình không an toàn),
weak passwords (các mật khấu “yếu”) , qua đó giúp ta đánh giá được những lỗi có độ
rủi ro cao mà từ đó khiến cho cơ sở dữ liệu của chúng ta có khả năng bị tấn công bất
cứ lúc nào.
Điều đặc biệt là Scuba hoàn toàn free, được viết bằng Java, nó hỗ trợ scan các db phổ
biến như : Oracle, DB2, MS-SQL để tìm ra các lỗi cũng như những thiếu sót trong
việc cấu hình.Dựa trên kết quả mà chương trình đánh giá được, Scuba sẽ ghi lại kết
quả vào một file XML và kèm theo các mẫu báo cáo có sẵn của nó để xuất ra các báo
cáo chi tiết dựa trên kết quả mà nó đã thu thập được.
Theo đánh giá của Pete Finnigan, một chuyên gia hàng đầu trong lĩnh vực Oracle
Security thì Scuba thường được sử dụng để tìm ra những lỗi “simple”, và vì nó là một
công cụ free cho nên việc đánh giá của nó sẽ không toàn diện được như những công
cụ thương mại. Tuy nhiên, cá nhân ông vẫn xem Scuba là một công cụ hữu ích cho
những nhà quản trị cơ sở dữ liệu.
Cài đặt Scuba
Để cài đặt Scuba trước tiên chúng ta phải download công cụ tại:
http://www.imperva.com/products/scuba.html . Điền đầy đủ các thông tin yêu cầu bạn
sẽ nhận được email cung cấp đường dẫn để download chương trình. Scuba là một file
thực thi độc lập, chúng ta không cần phải cài đặt. Chương trình yêu cầu tối hiểu hệ
thống phải cài đặt JRE phiên bản từ 1.4 trở lên để chạy được chương trình. Scuba bao
gồm một file cấu hình test cơ bản và một số báo cáo mẫu dùng cho việc xuất kết quả.
Khi ta chạy chương trình lần đầu tiên, nó yêu cầu chúng ta điền một số các thông tin
để hoàn tất quá trình đăng kí sử dụng cũng như chấp nhận các điều khoản của chương
trình.
Để chạy được Scuba ta cần thực hiện theo ba bước:
1. Cấu hình Database connection.
2. Lựa chọn file test và cấu hình các thống số test.
Thiết lập Output location để lưu file kết quả và lựa chọn mẫu báo cáo.
Cấu hình để kết nối tới Database cần
test
Sau khi cài đặt xong chương trình, mặc định màn hình DB Config của Scuba hiện lên
như sau :
Màn hình này yêu cầu chúng ta cung cấp các thông tin cần thiết để kết nối tới
Database Server :
1. DB Type :
Lựa chọn kiểu DB, các db mà chương trình hỗ trợ :
• Oracle (versions 8i through 10gR2)
• MS SQL (versions 6 through 2005)
• Sybase (versions 11.x – 15.x)
• DB2 (8.x and all versions with support for DRDA communications)
2. Host :
Nhập host name hoặc ip của máy chủ database.
3. Port :
Nhập cổng mà DB server đang lắng nghe, nếu là Oracle thì mặc định là 1521. Nếu bạn
cấu hình để listener lắng nghe trên một cổng khác thì nhập lại vào phần Port. Bảng
ánh xạ các port :
4. DB Name :
Trường này là cần thiết khi bạn lựa chọn loại cơ sở dữ liệu là Oracle hoặc DB2. Các
trường hợp khác thì để trống. Đối với cơ sở dữ liệu Oracle thì trường DB Name này ta
cần nhập SID (Service ID).
5. Windows Authentication :
Trường này được sử dụng trong trường hợp lựa chọn Db Type là MS SQL Server.
6.User :
Account của người sử dụng hợp lệ dùng để đăng nhập vào DB. Nên chọn account có
đủ quyền trong việc truy cập dữ liệu đặc biệt là các Data Dictionary trên Db server.
7.Password :
Mật khẩu để xác thực.
Sau khi cung cấp đầy đủ toàn bộ thông tin liên quan, nhấn nút “Test Connectivity” để
kiểm tra việc kết nối tới DB có thành công hay không? Nếu thành công ta sẽ nhận
được thông báo sau :
Test Configuration
Chọn phần Test Config, màn hình test config xuất hiện như sau :
Trước khi chạy chương trình để đánh giá DB được chọn ta cần cấu hình các mục tại
phần Test Config. Bao gồm :
1. File :
Đường dẫn đến file testconfig.xml, đây là một file xml bao gồm các mô tả về việc test
mà sẽ được áp dụng cho DB mà chúng ta cần rà soát. Scuba đã cung cấp cho chúng ta
một file mặc định, đi kèm với nó là thông tin về Date mô tả thời gian về lần cập nhật
cuối cùng cho file này. Để cập nhật các thông tin mới nhất ta chọn phần Check For
Updates.
1. Max Info :
Giá trị trong trường này có thể được sử dụng để hạn chế về lượng thông tin kiểm tra
bị thất bại mà ta thu thập từ cơ sơ dữ liệu
1. Parameters :
Trong thực tế nhiều DB được cấu hình với một số các policy chẳng hạn Password
Policy, thông tin trong trường parameters cho phép ta rà soát liên quan tới Policy đã
được cấu hình bởi các nhà quản trị. Lấy ví dụ: độ dài tối thiểu cho một password mới
là bao nhiêu, thời gian hết hiệu lực của password v..v.. Bạn có thể thay đổi các giá trị
Parameter cho phù hợp với mục đích kiểm tra của mình.
PS: Trong bài viết này của tôi, mọi thông tin trong phần Test Config đều được để
nguyên theo mặc định của chương trình.
Output Options Configuration
Tiếp theo ta chuyển qua phần Output Config, màn hình cấu hình như sau :
Trước khi thực hiện việc rà soát cơ sở dữ liệu ta cần cấu hình để Scuba lưu thông tin
kết quả của quá trình kiểm tra ra một file. Trong trường hợp của tôi, mọi thông tin thu
được sẽ được xuất ra file results.xml.
Sau khi thực hiện xong việc rà xoát, dựa trên file kết quả này chúng ta có thể tạo ra
các báo cáo dựa trên template là các file XSL có sẵn của Scuba. Chương trình bao gồm
các mẫu báo cáo sau :
• Scuba_Assessment_Report.xsl for reporting on all executed tests
• Scuba_Summary_Report.xsl for a graphical summary of the assessment run
• Scuba_Assessment_Report(No Details).xsl
• ScubaOutputTransformOnlyFailedTests.xsl for reporting all tests that failed
• ScubaOutputTransformOnlyInfo.xsl for reporting information only tests
Tùy chọn Use External Browser cho phép chúng ta sử dụng IE browser để hiện thị các
báo cáo. Nếu như ta không chọn tùy chọn này thì kết quả sẽ hiện thị trong một Java
text pane.
Thực hiện rà soát Cơ sở dữ liệu đã chọn
Sau khi toàn bộ các thông tin liên quan về việc cấu hình đã hoàn tất, giờ là lúc ta tiến
hành rà soát cơ sở dữ liệu của mình. Đơn giản chỉ bằng việc nhấn nút Go, chương
trình sẽ thực hiện tự động và lưu kết quả vào file results.xml đồng thời hiện thị thông
báo sau khi hoàn tất quá trình thực hiện.
Môi trường thử nghiệm của tôi như sau :
OS: Enterprise Linux Enterprise Linux AS release 4 (October Update 5)
Oracle DB Version: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 – Prod
Oracle SID: VD11
Host Name: test
quyền chứng thực của người sử dụng đối với 1 website khác.Các ứng dụng web
hoạt động theo cơ chế nhận các câu lệnh http từ người sử dụng,sau đó thực thi các
câu lệnh này.
CSRF sẽ lừa trình duyệt của người dùng gửi đi các câu lệnh http đến các ứng dụng
web.Trong trường hợp phiên làm việc của người dùng chưa hết hiệu lực thì các câu
lệnh trên sẽ dc thực hiện với quyền chứng thực của người sử dụng.
CSRF còn dc gọi là "session riding", "XSRF"
Các kiểu tấn công CSRF xuất hiện từ những năm 1990,tuy nhiên các cuộc tấn
công này xuất phát từ chính IP của người sử dụng nên log file của các website k
cho thấy các dấu hiệu của CFRS.Các cuộc tấn công theo kĩ thuật CSRF k dc báo
cáo đầy đủ,đến năm 2007 mới có một vài tài liệu miêu tả chi tiết về các trường hợp
tấn công CSRF.
Năm 2008 người ta phát hiện ra có khoảng 18 triệu người sử dụng eBay ở Hàn
Quốc mất các thông tin cá nhân của mình.Cũng trong năm 2008,một số khách
hàng tại ngân hàng Mexico bị mất tài khoản cá nhân của mình.Trong 2 trường hợp
kể trên hacker đều sử dụng kĩ thuật tấn công CSRF
Bob duyệt qua 1 diễn đàn yêu thích của mình như thường lệ.Một người dùng
khác,Malory ,đăng tải 1 thông điệp lên diễn đàn .Giả sử rằng Malory có ý đồ k tốt
và anh ta muốn lấy tiền từ những người có tài khoản tại ngân hàng như Bob.Malory
sẽ tạo 1 thông báo,trong đó có chèn 1 đoạn code như sau:
Mexico Bank has just announce a new interest rate....
Đoạn mã trên dc che giấu rất khéo,thứ nhất nó thêm các thông điệp bình thường
để người dùng không chú ý.Thứ hai thẻ "
Giả sử Bob vừa mới truy cập vào tài khoản ngân hàng của mình và chưa thực hiện
logout để kết thúc.Trình duyệt của Bob sẽ gửi câu lệnh
http get đến địa chỉ lưu trong thẻ "
Trong ví dụ trên hacker có thể sử dụng 1 URL khác ,ví dụ :
http://www.projectpage.com/admin/project/13/delete để xóa đi một dự án
quan trọng nào đó mà Bob đang làm.
Một chú ý là cần phải có 1 chút kĩ thuật Social Engineering để có thể biết dc victim
sử dụng tài khoản ngân hàng nào,account của dịch vụ nào và forum thường hay
vào là gì.Xem thêm Social Engineering
Ngoài thẻ "
Các kĩ thuật CSRF rất đa dạng,lừa người dùng click vào link,gửi email chứa các
đoạn mã độc đến người dùng...Hacker còn có thể che giấu các link ở trên rất khéo
léo.Ví dụ trong trường hợp thẻ "
account=bob_id&amount=1000000&for=Malory_ id"/>.
Tuy nhiên người dùng sẽ rất có phát hiện nếu hacker dùng đường link như sau :

và cấu hình lại máy chủ
Redirect 302/abc.jpg http://mexicobank.com/withdraw?
account=bob_id&amount=1000000&for=Malory_ id"/>
Kết thúc vấn đề kĩ thuật tại đây.Bạn có thể xem thêm một số chủ đề có liên quan:
CEH v6 Module 12 : Phishing
CEH v6 Module 13 :Hacking Email Account
Social Engineering
XSS
CSRF SECURE
Dựa trên nguyên tắc của CSRF "lừa trình duyệt của người dùng(hoặc người dùng)
gửi các câu lệnh http",các kĩ thuật phòng tránh sẽ tập trung vào viêc tìm cách phân
biệt hạn chế các câu lệnh giả mạo.
Có nhiều lời khuyến cáo dc đưa ra ,tuy nhiên cho đến nay vẫn chưa có biện pháp
nào có thể phòng chống triệt để CSRF.Sau đây là một vài kĩ thuật sử dụng.
HẠN CHẾ THỜI GIAN HIỆU LỰC CỦA SESSION (SESSION TIMEOUT)
Tùy theo ngôn ngữ hoặc web server dc sử dụng mà các thực hiện có thể rất khác
nhau.Với PHP,thông số "session.gc_maxlifetime" trong file php.ini qui định thời
gian hiệu lực của session.
Nếu lập trình viên sử dụng ngôn ngữ k hỗ trợ chức năng này và họ phải quản lý
session bằng CSDL (ví dụ lưu bảng session...) hay bằng các file tạm (ví
dụ /tmp/session/) thì họ sẽ viết các chương trình hỗ trợ việc xóa các session này
(cron job,scheduler...)
SỬ DỤNG GET VÀ POST HỢP LÍ
Phương thức GET dc dùng để truy vấn dữ liệu,đối với các thao tác tạo ra sự thay
đổi hệ thống thì các phương thức khác như POST hay PUT sẽ dc sử dụng (theo
khuyến cáo của W3Ctổ chức tạo ra chuẩn http)
SỬ DỤNG CAPTCHA,SỬ DỤNG CÁC THÔNG BÁO XÁC NHẬN.
Captcha dc sử dụng để nhận biết đối tượng đang thao tác với hệ thống là con
người hay k?Các thao tác quan trọng như"đăng nhập" hay là " chuyển
khoản" ,"thanh toán" thường là hay sử dụng captcha.Tuy nhiên ,việc sử dụng
captcha có thể gây khó khăn cho một vài đối tượng người dùng và làm họ khó
chịu.
Các thông báo xác nhận cũng thường dc sử dụng,ví dụ như việc hiển thị một thông
báo xác nhận "bạn có muốn xóa hay k" cũng làm hạn chế các kĩ thuật
SỬ DỤNG TOKEN
Tạo ra một token tương ứng với mỗi form,token này sẽ là duy nhất đối với moit64
form và thường thì hàm tạo ra token này sẽ nhận đối số là"session".Khi nhận lệnh
http post về,hệ thống sẽ thực hiên so khớp giá trị token này để quyết định có thực
hiện hay k.
Một số framework hiện nay đã hỗ trợ tạo token như là: aspnet webform,ruby on
rails,django.
Mã:
def authenticity_token_from_session_id
key = if request_forgery_protection_options[:secret].respond_to?
(:call)request_forgery_protection_options[:secret].call(@session)
else
request_forgery_protection_options[:secret]
end
digest = request_forgery_protection_options[:digest]||= 'SHA1'
OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new(digest),key.to_s,
session.session_id.to_s)
end
Đây là một đoạn mã Ruby tạo token session của người dùng.Token này dc tạo từ
1 sesstion và 1 "secretekey" ( khóa bí mậtdo người xây ứng dụng tạo ra )
Mã:
onclick="if (confirm('Are you sure?'))
[var f = document.
createElement('form');
f.style.display = 'none';
this.parentNode.appendChild(f);
f.method = 'POST';
f.action = this.href
var m = document.
createElement('input');
m.setAttribute('type','hidden');
m.setAttribute('name','_method');
m.setAttribute('value','delete');
f.appendChild(m);
var s = document.
createElement('type','hidden');
s.setAttribute('name','authenticity_token');
s.setAttribute('value','4a21023fcbb630120a747e317f-f6a1bc912797e');
f.appendChild(s);f.submit(););
return false;">
Destroy
Đoạn mã trên sử dụng phương thức POST để thực hiện thao tác xóa ,đồng thời nó
cũng hiển thị thông báo,đòi hỏi người dùng phải xác nhận.Nó còn sử dụng thêm 1
"authenticity_token".
Bên phía máy chủ,trước khi thực hiện phương thức "xóa" theo 1 đoạn mã trên thì
chương trình sẽ kiểm tra xem câu lệnh http gửi đến có phải là post k
SỬ DỤNG COOKIE RIÊNG BIỆT CHO PHẦN QUAN TRỊ.
Một cookie k thể dùng chung cho các domain khác nhau,chính vì vậy việc sử dụng
"admin.site.com" thay vì sử dụng" site.com/admin" là an toàn hơn
THIẾT KẾ HỆ THỐNG LOG
Một vài framework ghi tất cả thông tin,dữ liệu xử lý vào các file log.Điều này rất
nguy hiểm nếu như đó là các thông tin nhạy cảm như mật khẩu ,số tài khoản.
KIỂM TRA REFERRER
Kiểm tra xem các câu lệnh http gửi đến hệ thống xuất phát từ đâu.Một ứng dụng
web có thể hạn chế chỉ thực hiện các lệnh http gửi đến từ các trang đã dc chứng
thực.
Tuy nhiên cách làm này có nhiều hạn chế và k thật sự hiệu quả.
KIỂM TRA IP.
Một số hệ thống quan trọng chỉ cho truy cập từ những IP dc thiết lập sẵn
Kĩ thuật CSRF còn có thể dc sử dụng với kĩ thuật XSS ( Cross Site
Scipting ) để tạo ra những cách tấn công tinh vi hơn
CSRF by Example, How to do it, How to
defend it
July 6, 2009 07:45 by
For a little bit of background I would recommend that you read the article that I originally
wrote titled XSS by Example. I was originally intrigued by Cross Site Scripting and
decided to give it a try. As dblackshell pointed out in the comments what I had originally
attempted was CSRF or Cross Site Request Forgery. Following the link he put in the
article and reading up a bit more I finally figured out how to perform a Cross Site
Request Forgery to kick an Article at DotNetKicks.com (a rating site similar to Digg
for .Net developers).
CSRF what didn't work
If you read my previous article you would have seen my first two failed attempts at
CSRF. In one attempt I tried a cross site AJAX post which the browser wouldn't allow.
In my second attempt I tried to load DotNetKicks in an IFrame and then manipulate it
from my web page which the browser didn't allow.
CSRF what did work
I knew that the request needed to be a post so what I finally ended up getting to work was
a Form with an action that posted the values to DotNetKicks.com. Below is an image
from Firebug showing the request that I needed to forge.
AJAX can make CSRF difficult
If you are familiar with Firebug than you can clearly tell that the post above is an AJAX
post using JSON and not simply a name value pair. At first I had a difficult time
duplicating the request as the following type of form would not work.
view plaincopy to clipboardprint?
1.
What I finally got to work was an input element with a blank name and a value of the
JSON string that I wanted to replicate. Below is the code that will vote for whatever
article you choose.
view plaincopy to clipboardprint?
1.
2.
3.
4.
6.
19.
20.
21.
25.
27.
28.
If you create an ASPX page using the html above you can coerce anyone on your website
to kick an article of your choosing (as long as they are still logged on at
DotNetKicks.com. remember that is how CSRF works) with a simple Iframe somewhere
else on your site that looks like this.
view plaincopy to clipboardprint?
1.
Now that I know this what should I do?
Information is power. I hope with this little script that anyone who has a website that
could be targeted by CSRF that they might be able to hack their own site and then figure
out how to protect their site from it. You need to understand how hackers will attack
your site to be able to protect yourself from it. I know that you can use a hidden field and
validate the value against what you sent out but I would like to know what others are
doing to protect against this kind of attack.
Hướng dẫn : Sử dụng chương trình Scuba để rà soát security cho
Oracle Database March 17, 2009
Filed under: Hướng dẫn : Sử dụng chương trình Scuba để rà soát security cho Oracle
Database,Linux — kienmanowar @ 4:36 am
Tags: use Scuba to scan Oracle DB
Hướng dẫn : Sử dụng chương trình Scuba để rà soát
security cho Oracle Database
Nội dung chính
Giới thiệu
Cài đặt Scuba
Cấu hình để kết nối tới Database cần test
Test Configuration
Output Options Configuration
Thực hiện rà soát Cơ sở dữ liệu đã chọn
Xuất kết quả ra báo cáo
Giới thiệu
Scuba là một công cụ nhỏ gọn dùng để đánh giá cơ sở dữ liệu, nó được sử dụng để
thu thập các thông tin cấu hình liên quan tới security của một database. Bằng việc sử
dụng Scuba có thể giúp chúng ta tìm ra hàng trăm thiếu sót như unpatched sofware
(phần mềm chưa cập nhật bản vá), unsafe processes (các tiến trình không an toàn),
weak passwords (các mật khấu “yếu”) , qua đó giúp ta đánh giá được những lỗi có độ
rủi ro cao mà từ đó khiến cho cơ sở dữ liệu của chúng ta có khả năng bị tấn công bất
cứ lúc nào.
Điều đặc biệt là Scuba hoàn toàn free, được viết bằng Java, nó hỗ trợ scan các db phổ
biến như : Oracle, DB2, MS-SQL để tìm ra các lỗi cũng như những thiếu sót trong
việc cấu hình.Dựa trên kết quả mà chương trình đánh giá được, Scuba sẽ ghi lại kết
quả vào một file XML và kèm theo các mẫu báo cáo có sẵn của nó để xuất ra các báo
cáo chi tiết dựa trên kết quả mà nó đã thu thập được.
Theo đánh giá của Pete Finnigan, một chuyên gia hàng đầu trong lĩnh vực Oracle
Security thì Scuba thường được sử dụng để tìm ra những lỗi “simple”, và vì nó là một
công cụ free cho nên việc đánh giá của nó sẽ không toàn diện được như những công
cụ thương mại. Tuy nhiên, cá nhân ông vẫn xem Scuba là một công cụ hữu ích cho
những nhà quản trị cơ sở dữ liệu.
Cài đặt Scuba
Để cài đặt Scuba trước tiên chúng ta phải download công cụ tại:
http://www.imperva.com/products/scuba.html . Điền đầy đủ các thông tin yêu cầu bạn
sẽ nhận được email cung cấp đường dẫn để download chương trình. Scuba là một file
thực thi độc lập, chúng ta không cần phải cài đặt. Chương trình yêu cầu tối hiểu hệ
thống phải cài đặt JRE phiên bản từ 1.4 trở lên để chạy được chương trình. Scuba bao
gồm một file cấu hình test cơ bản và một số báo cáo mẫu dùng cho việc xuất kết quả.
Khi ta chạy chương trình lần đầu tiên, nó yêu cầu chúng ta điền một số các thông tin
để hoàn tất quá trình đăng kí sử dụng cũng như chấp nhận các điều khoản của chương
trình.
Để chạy được Scuba ta cần thực hiện theo ba bước:
1. Cấu hình Database connection.
2. Lựa chọn file test và cấu hình các thống số test.
Thiết lập Output location để lưu file kết quả và lựa chọn mẫu báo cáo.
Cấu hình để kết nối tới Database cần
test
Sau khi cài đặt xong chương trình, mặc định màn hình DB Config của Scuba hiện lên
như sau :
Màn hình này yêu cầu chúng ta cung cấp các thông tin cần thiết để kết nối tới
Database Server :
1. DB Type :
Lựa chọn kiểu DB, các db mà chương trình hỗ trợ :
• Oracle (versions 8i through 10gR2)
• MS SQL (versions 6 through 2005)
• Sybase (versions 11.x – 15.x)
• DB2 (8.x and all versions with support for DRDA communications)
2. Host :
Nhập host name hoặc ip của máy chủ database.
3. Port :
Nhập cổng mà DB server đang lắng nghe, nếu là Oracle thì mặc định là 1521. Nếu bạn
cấu hình để listener lắng nghe trên một cổng khác thì nhập lại vào phần Port. Bảng
ánh xạ các port :
4. DB Name :
Trường này là cần thiết khi bạn lựa chọn loại cơ sở dữ liệu là Oracle hoặc DB2. Các
trường hợp khác thì để trống. Đối với cơ sở dữ liệu Oracle thì trường DB Name này ta
cần nhập SID (Service ID).
5. Windows Authentication :
Trường này được sử dụng trong trường hợp lựa chọn Db Type là MS SQL Server.
6.User :
Account của người sử dụng hợp lệ dùng để đăng nhập vào DB. Nên chọn account có
đủ quyền trong việc truy cập dữ liệu đặc biệt là các Data Dictionary trên Db server.
7.Password :
Mật khẩu để xác thực.
Sau khi cung cấp đầy đủ toàn bộ thông tin liên quan, nhấn nút “Test Connectivity” để
kiểm tra việc kết nối tới DB có thành công hay không? Nếu thành công ta sẽ nhận
được thông báo sau :
Test Configuration
Chọn phần Test Config, màn hình test config xuất hiện như sau :
Trước khi chạy chương trình để đánh giá DB được chọn ta cần cấu hình các mục tại
phần Test Config. Bao gồm :
1. File :
Đường dẫn đến file testconfig.xml, đây là một file xml bao gồm các mô tả về việc test
mà sẽ được áp dụng cho DB mà chúng ta cần rà soát. Scuba đã cung cấp cho chúng ta
một file mặc định, đi kèm với nó là thông tin về Date mô tả thời gian về lần cập nhật
cuối cùng cho file này. Để cập nhật các thông tin mới nhất ta chọn phần Check For
Updates.
1. Max Info :
Giá trị trong trường này có thể được sử dụng để hạn chế về lượng thông tin kiểm tra
bị thất bại mà ta thu thập từ cơ sơ dữ liệu
1. Parameters :
Trong thực tế nhiều DB được cấu hình với một số các policy chẳng hạn Password
Policy, thông tin trong trường parameters cho phép ta rà soát liên quan tới Policy đã
được cấu hình bởi các nhà quản trị. Lấy ví dụ: độ dài tối thiểu cho một password mới
là bao nhiêu, thời gian hết hiệu lực của password v..v.. Bạn có thể thay đổi các giá trị
Parameter cho phù hợp với mục đích kiểm tra của mình.
PS: Trong bài viết này của tôi, mọi thông tin trong phần Test Config đều được để
nguyên theo mặc định của chương trình.
Output Options Configuration
Tiếp theo ta chuyển qua phần Output Config, màn hình cấu hình như sau :
Trước khi thực hiện việc rà soát cơ sở dữ liệu ta cần cấu hình để Scuba lưu thông tin
kết quả của quá trình kiểm tra ra một file. Trong trường hợp của tôi, mọi thông tin thu
được sẽ được xuất ra file results.xml.
Sau khi thực hiện xong việc rà xoát, dựa trên file kết quả này chúng ta có thể tạo ra
các báo cáo dựa trên template là các file XSL có sẵn của Scuba. Chương trình bao gồm
các mẫu báo cáo sau :
• Scuba_Assessment_Report.xsl for reporting on all executed tests
• Scuba_Summary_Report.xsl for a graphical summary of the assessment run
• Scuba_Assessment_Report(No Details).xsl
• ScubaOutputTransformOnlyFailedTests.xsl for reporting all tests that failed
• ScubaOutputTransformOnlyInfo.xsl for reporting information only tests
Tùy chọn Use External Browser cho phép chúng ta sử dụng IE browser để hiện thị các
báo cáo. Nếu như ta không chọn tùy chọn này thì kết quả sẽ hiện thị trong một Java
text pane.
Thực hiện rà soát Cơ sở dữ liệu đã chọn
Sau khi toàn bộ các thông tin liên quan về việc cấu hình đã hoàn tất, giờ là lúc ta tiến
hành rà soát cơ sở dữ liệu của mình. Đơn giản chỉ bằng việc nhấn nút Go, chương
trình sẽ thực hiện tự động và lưu kết quả vào file results.xml đồng thời hiện thị thông
báo sau khi hoàn tất quá trình thực hiện.
Môi trường thử nghiệm của tôi như sau :
OS: Enterprise Linux Enterprise Linux AS release 4 (October Update 5)
Oracle DB Version: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 – Prod
Oracle SID: VD11
Host Name: test