对于该登录界面,如果SELECt * FROM TABLE WHERe USER='xxx' AND Password ='xxx'为真那么就可以登录成功。
那么如果我在User ID一栏输入的最后加上 'or 1=1# 那么该SQL语句是不是变成了SELECt * FROM TABLE WHERe USER='xxx' OR 1=1 #'AND Password ='xxx' ;
#是注释的意思,那么是不是后面的都被注释掉了,所以该语句的意思是不是就变成了如果USER等于我输入的值或者1=1那么就登录成功,因为1=1恒成立,那么是不是不管我输入什么都能登录成功,甚至不需要输入密码
SQL注入的分类1.基于数据类型的分类:
数字型注入:输入参数为整型时,如 Id 、年龄和页码等; 字符型注入:输入参数为字符串型时,如姓名、职业、住址等; 两者最大的区别:字符型注入一般要使用单引号进行闭合,而数字型注入则不需要; 2.基于注入位置分类 GET 注入:注入字符在 URL 参数中; POST 注入:注入字段在 POSt 提交的数据中; Cookie 注入:注入字段在 Cookie 数据中,网站使用通用的防注入程序,会对 GET 、 POST 提交的数据进行过滤,却往往遗漏 Cookie 中的数据进行过滤 3.基于从服务器接收到的响应分类 盲注入:盲注不会展现任何数据库报错内容,它是依据构造真或假的问题对数据库进行“提问”,注入方式主要有两种:基于布尔值与基于时间。 • 布尔盲注 如在 MySQL 中判断数据名长度的输入为 1' and length(database()) = 10 # ,通过相应的正确与否判断数据名的长度是否为 10 ,猜测数据库中数据的具体内容 时,可以借助书本上 SUBSTR 、 LIMIT 、 ASCII 等一些特殊的命令及函数进行猜 测; • 时间盲注 基于时间的 SQL 盲注入方式通常是在 SQL 语句中添加延时函数,依据相应时间来判断是否存在 SQL 注入,常用的延时函数或指令有 sleep 、 repeat 等。 4、其他类型 • 延时注入:使用延时函数方式; • 搜索注入:注入点在搜索框中; • 编码注入:将输入的字符串进行编码,如 base64 编码; • 堆叠查询注入:同时执行多条语句; • 联合查询注入:使用 union 操作码合并两条或多条 SQL 语句; SQL注入的产生点 • 页面的搜索框、登录框、输入栏。 • 请求方式 • 请求头 总而言之,一句话:所有能与用户进行交互的地方都可能存在注入 SQL注入的常见检测字符 • ‘(单引号) • “(双引号) • --+ (注释) • # (注释) • and( 与 ) • Or( 或 ) • Xor( 非 ) SQL注入的思路 1. 判断是否存在注入,注入是字符型还是数字型 2. 猜解 SQL 查询语句中的字段数 3. 确定显示的字段顺序 4. 获取当前数据库 5. 获取数据库中的表 盲注测试的思路 1. 判断是否存在注入,注入是字符型还是数字型 2. 猜解 SQL 查询语句中的字段数 3. 猜解当前数据库名 4. 猜解数据库中的表名 5. 猜解表中的字段名 6. 猜解数据 为什么会有SQL注入 • 代码对带入 SQL 语句的参数过滤不严格 • 未启用框架的安全配置,例如: PHP 的 magic_quotes_gpc • 未使用框架安全的查询方法 • 测试接口未删除 • 未启用防火墙,例如 IPTABLES 。 • 未使用其他的安全防护设备,例如: WAF SQL注入的业务场景以及危害 • 包括登陆功能、搜索功能、详情页、商品购买等 • 危害包括数据库泄漏:数据库中存放的用户的隐私信息的泄漏; • 网页篡改:通过操作数据库对特定网页进行篡改; • 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。 • 数据库被恶意操作:数据库服务器被攻击,数据库管理员账户被篡改。 • 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。 如何防范-SQL注入 1.关闭 SQL 错误回显 2.使用成熟的 waf、数据库审计、云防护、 ips 系统 3.前端输入字符白名单验证(长度、类型等) 4.SQL 服务运行于专门的账号,并且使用最小权限 5.对输入的特殊字符使用转义处理


