Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Kỹ thuật tấn công sql injection và cách phòng chống trong php

1,639 views

Published on

tài liệu

Published in: Software
  • Login to see the comments

  • Be the first to like this

Kỹ thuật tấn công sql injection và cách phòng chống trong php

  1. 1. k thu t t n công SQL Injection và cáchỹ ậ ấ phòng ch ng trong phpố AUTHOR: THEHALFHEART PUBLIC DATE: 14/08/2014 CATEGORY: PHP VIEWS: 511 bài tr c chúng ta ã c tìm hi u cáchƠ ướ đ đượ ể phòng ch ng CSRFố , v y thì trong bài này ta s tìmậ ẽ hi u thêm m t k thu t khác c ng r t hay s d ng t n công vào nh ngể ộ ỹ ậ ũ ấ ử ụ để ấ ữ website c a nh ng tayủ ữ ngh thi u kinh nghi m l p trình, ó làề ế ệ ậ đ k thu t t n công SQL Injectionỹ ậ ấ . 1. SQL Injection là gì? SQL Injection là m t k thu t l i d ng nh ng l h ng v câu truy v n l y d li u c a nh ngộ ỹ ậ ợ ụ ữ ỗ ổ ề ấ ấ ữ ệ ủ ữ website không an toàn trên web, âylà m t k thu t t n công r t ph bi n và s thành công c ađ ộ ỹ ậ ấ ấ ổ ế ự ủ nó c ng t ng i cao. Tuy nhiên vào nh ng n m tr l i âythì xu t hi n nhi u Framwork nênnóũ ươ đố ữ ă ở ạ đ ấ ệ ề gi m h n, vì cácFW ãh tr r t t t vi c ch ng l iả ẳ đ ỗ ợ ấ ố ệ ố ạ hack SQL Injection này. Ch c h n các b n ã bi t mô hình ho t ng c a website r i nh ? Khi m t request c g i tắ ẳ ạ đ ế ạ độ ủ ồ ỉ ộ đượ ử ừ client thì ngôn ng SERVER nh PHP s l y các thông tin t request ó. Nh ng b n thân nóữ ư ẽ ấ ừ đ ư ả không h phát hi n ra nh ng thông tin ó có ch a nh ng câuSQL c, vì th công vi c này taề ệ ữ đ ứ ữ độ ế ệ ph i trách nhi mả đổ ệ t i kinh nghi m c a l p trình viên.ớ ệ ủ ậ Ví d :ụ Gi s tôi có m t trang ng nh p v i hai thông tin làả ử ộ đă ậ ớ tên ng nh pđă ậ và m t kh uậ ẩ . Và o n code x lý t n công sql injectionđ ạ ử ấ c a tôi có d ng nh sau:ủ ạ ư 1 2 3 4 $username = $_POST['username']; $password = $_POST['password']; $sql = "select count(*) from user where username = '$username' AND password = '$pa Tr ng h p 1:ườ ợ Bâygi tôi nh pờ ậ username = thehalfheart và password = matkhau thì câutruy v n s là:ấ ẽ select count(*) from user where username = 'thehalfheart AND password = 'matkhau'
  2. 2. Tr ng h p 2: Bây gi tôi nh pườ ợ ờ ậ username = somename và password = something' OR '1. Như v y câusql s là:ậ ẽ SELECT * FROM cms_user WHERE user_username = 'thehalfheart' AND user_password = 'something' OR '1' Ch y câutruy v n này lênthì k t qu nó tr v là danh sách user nênn u code cùicùi thì login cạ ấ ế ả ả ề ế đượ luôn. Trên âylà m t ví d i n hình thôi, ch th c t thì hacker còn r t nhi u m u m o khác. Tuy nhiênđ ộ ụ đ ể ứ ự ế ấ ề ư ẹ chung quy l i v i k thu t t n công SQL Injection ta v n có th không ch c nó.ạ ớ ỹ ậ ấ ẫ ể ế đượ 2. Phòng ch ng SQL Injectionố V i kinh nghi m c a mình thì th t s ch a phântích sâuvào k thu t này, tuy nhiênmình c ng bi tớ ệ ủ ậ ự ư ỹ ậ ũ ế chút ít kinh nghi m có th ch ng l i k thu t này.ệ để ể ố ạ ỹ ậ 2.1. Nh n d li u ki u INTậ ữ ệ ể Khi b n nh n d li u ID trênURL thì cách t t nh t b n nênạ ậ ữ ệ ố ấ ạ ép ki uể , chuy n nó v ki u s INT, sauể ề ể ố ó chuy n v ki u STRING (n u c n thi t).đ ể ề ể ế ầ ế Ví d : tôi có url nh sau: domain.com/detail.php?id=12ụ ư 1 $id = isset($_GET['id']) ? (string)(int)$_GET['id'] : false; Nh v y thì cho dù ta nh p vào k t gì i n a u s b clear ra kh i h t. Ho c ta có th dùngư ậ ậ ỳ ự đ ữ đề ẽ ị ỏ ế ặ ể cách d c b ng cách dùngướ ằ hàm preg_replace trong PHP xóa i nh ng ký t không ph i là chđể đ ữ ự ả ữ s .ố 1 2 $id = isset($_GET['id']) ? $_GET['id'] : false; $id = str_replace('/[^0-9]/', '', $id); R t n gi n, tuy nhiênmình khuy n khích nêndùng ép ki u trong PHP, vì nó n gi n.ấ đơ ả ế ể đơ ả 2.2 Vi t l i ng d n có thế ạ đườ ẫ ể ch ng SQL Injectionố V n này có v h i l nh ng b n thânmình th y r t úng. Khi b n vi t l i ng d n dùtrên hấ đề ẻ ơ ạ ư ả ấ ấ đ ạ ế ạ đườ ẫ ệ th ng route c aố ủ FW hay dù trên file .htaccess thì hãy fix chính xác o n mã Regular Expressionđ ạ (Tham kh oả Regular Expression c n b nă ả ). Ví d :ụ Tôi có ng d n sau khi rewirte là nh sau: domain.com/hoc-lap-trinh-mien-phi-tai-đườ ẫ ư freetuts.html thì o n Regex tôi s vi t là:đ ạ ẽ ế /([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html/ . Thay vì nh v y thì tôi s vi t chính xácư ậ ẽ ế /([a- zA-Z0-9-]+)/([0-9]).html/ thì s t t h n. Và ng quên là c ng n i ng link g c c a nóẽ ố ơ đừ ũ ẩ đ đườ ố ủ nhé. 2.3 S d ng hàm sprintf vàử ụ mysql_real_escape_string xác nh ki u d li u chođể đị ể ữ ệ câutruy v n.ấ
  3. 3. Nh b n bi t hàmư ạ ế sprintf g m có hai tham s tr lên, tham s th nh t là chu i và trong ó cóồ ố ở ố ứ ấ ỗ đ ch a m t o n Regex thay th , tham s th 2 tr i là các giátr s c thay th t ng ng.ứ ộ đ ạ để ế ố ứ ở đ ị ẽ đượ ế ươ ứ Giátr rápvào s c convert phùh p r i m i rap vàoị ẽ đượ ợ ồ ớ Ví d :ụ 1 2 3 $webname = 'freetuts.net'; $title = 'học lập trình miễn phí'; echo sprintf('Website %s laf website %s', $webname, $title); K t qu in ra là:ế ả Website freetuts.net là website h c l p trình mi n phíọ ậ ễ . N u b n ch a bi t v hàm sprintf thì vàoế ạ ư ế ề link này c nhé.đọ Nh b n bi t hàmư ạ ế mysql_real_escape_string có nhi m v s chuy n m t chu i thành chu iệ ụ ẽ ể ộ ỗ ỗ query an toàn, nênta s k t h p nó gánvào câutruy v n. Ví d :ẽ ế ợ để ấ ụ 1 2 $sql = "SELECT * FROM member WHERE username = '%s' AND password = '%s'"; echo sprintf($sql, mysql_real_escape_string("thehalfheart"), mysql_real_escape_str K t qu là:ế ả SELECT * FROM member WHERE username = 'thehalfheart' AND password = 'matkhau'. ang C p Nh t Thêm...Đ ậ ậ 3. L i k tờ ế Th t s thì k thu t này r t nhi u và dài, ki n th c c a mình ch mang t m c n b n nên mình chậ ự ỹ ậ ấ ề ế ứ ủ ỉ ầ ă ả ỉ share c c n b n. N u b n mu n nâng cao thì có th c thêm tài li u trên m ng, ch y u làđượ ă ả ế ạ ố ể đọ ệ ạ ủ ế ti ng anh. Tuy nhiên th t s khi i làm b n nên s d ng Framwork, vì FW a h tr r t t t nh ngế ậ ự đ ạ ử ụ đ ỗ ợ ấ ố ữ ki u t n công website thông d ng hi n nay r i, b n thân chúng ta không th nào tìm hi u sâuể ấ ụ ệ ồ ả ể ể c.đượ

×