bài trước edu.com.vn đã hướng dẫn các bạn khai thác lỗi sqli: http://edu.com.vn/thuc-hanh-khai-thac-loi-sql-injection/
hôm nay edu.com.vn sẽ hướng dẫn Phòng chống lỗi SQL Injection:
Để chống tấn công sql injection ta liệt kê một mảng các từ khóa dùng trong truy vấn sql bất hợp pháp từ người dùng:
Ví dụ ta đưa vào danh sách các từ khóa bị cấm sau:
<?php $cautruyvan = $_SERVER['QUERY_STRING']; $tukhoa = array('chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(', 'cmd=', '%20cmd', 'cmd%20', 'rush=', '%20rush', 'rush%20', 'union%20','order','or','%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=', 'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(', 'mcd%20', 'mrd%20', 'rm%20', '%20mcd', '%20mrd', '%20rm', 'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(', 'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(', 'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall', 'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(', 'vi%20', 'insert%20into', 'select%20', 'nigga(', '%20nigga', 'nigga%20', 'fopen', 'fwrite', '%20like', 'like%20', '$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20', 'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow', 'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'uname\x20-a', '/usr/bin/id', '/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g\+\+', 'bin/python', 'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '.pl', '/usr/X11R6/bin/xterm', 'lsof%20', '/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml', 'file\://', 'window.open', '<SCRIPT>', 'javascript\://','img src', 'img%20src','.jsp','ftp.exe', 'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd', 'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history', 'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20', 'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con', '<script', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from', 'select from', 'drop%20', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php', '?>', 'sql='); $kiemtra = str_replace($tukhoa, '*', $cautruyvan); if ($cautruyvan != $kiemtra) { $cremotead = $_SERVER['REMOTE_ADDR']; $cuseragent = $_SERVER['HTTP_USER_AGENT']; die( "Phat hien co su tan cong! <br /><br /><b>Viec tan cong nay da bi ngan chan va se duoc ghi nhan lai:</b><br />$cremotead - $cuseragent" ); } ?>
các bạn có thể chèn trưc tiếp đoạn code trên vào đầu trang nào bị lỗi hoặc có thể để vào một file cho dễ sử dụng, ví dụ mình cho các từ này vào một file tên “AntiSQLInjection.php”
Tiếp theo ta sẽ include file này vào trang nào bị lỗi sql injection
Trong trong triviet.tk trang bị lỗi có đường link sau: http://triviet.tk/?frame=product_detail&id=’id’
Vậy ta sẽ để file “AntiSQLInjection.php” cùng thư mục với file “product_detail”, và include vào đầu của file “product_detail” để loại bỏ câu truy vấn bất hợp pháp từ người dùng.
<?php
include “AntiSQLInjection.php”;
?>
vậy là xong.
có nhiều cách chống tấn công sqli khác nhau, nhưng ở đây mình chỉ làm theo cách này thấy hiệu quả. các bạn cùng góp ý ngen.
có gì thắc mắc các bạn gửi mail: minhtri.cntt2@gmail.com, hoặc yahoo: duyminh264@yahoo.com