O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

1.602 visualizações

Publicada em

tài liệu

Publicada em: Software
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

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.đượ

×