SQL Injection
SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一
SQL 注入分类 按SQLMap中的分类来看,SQL注入类型有以下 5 种:
UNION query SQL injection(可联合查询注入)
Stacked queries SQL injection(可多语句查询注入)
Boolean-based blind SQL injection(布尔型注入)
Error-based SQL injection(报错型注入)
Time-based blind SQL injection(基于时间延迟注入)
SQL注入基础知识铺垫
1. select有关的函数
- select user(); 查看当前用户
- select session_user(); 同上
- select database(); 查看数据库
- select @@version 查看当前MySQL版本
- select @@basedir 查看MySQL安装路径
- select @@datadir 查看MySQL数据存储路径
2.myslq中的默认表和作用
- Information_schema:提供了所有数据库中的元数据,存储了整个mysql中的所有库/表/列名等信息.
- Mysql:mysql的核心数据库,用来存储所有用户名/密码和数据库访问权限等信息.
- Performance_schema:记录了各种日志信息
3.必会基本查询语句
- select database(); #查看当前库名;
- select table_name from information_schema.tables where table_schema=database() ; #查看当前库下的表名
- select column_name from information_schema.columns where table_schema=database() and table_name='user'; #查询列名
- select name,password from user; #获取用户名和密码列
4.mysql中的注释风格(以下方式都可以)
- # (url编码为%23)
- -- (--后边要跟上一个或多个空格)
- /* ..... */
- /*! .... */ 内联注释
- select * /*!22222from*/ users; #数字小于当前mysql版本号,就正常显示;等于或大于就查询异常
SQL注入判断
SQL注入一般分为整数型、字符型和搜索型,整数型:用户从前端传输到服务器的数据被当做整数来处理,字符型:用户从前端传输到服务器的数据当做字符来处理。因为服务器处理整数和字符型数据,类型不同,整数型数据,不需要使用单引号封装,而字符型需要使用单引号封装。所以整数型和字符型注入过程中,最大的区别在于,字符型注入需要先对前面的数据进行封装,再结尾加上注释符号,而整数型就不需要封装和结尾注释。搜索型:这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%'
。
如何判断是否存在SQL注入:www.xxx.com/load?id=1
方法一:加符号判断法
第一步:再数据后门加单引号或者双引号,如果单引号页面显示异常,再加#后,页面正常显示,为单引号注入,如果双引号显示异常,再加#后显示正常,则为双引号注入
第二步:如果加单引号或者双引号后,不正常显示,加#后还是不能恢复正常页面,则尝试在引号后添加一到两个” )“右括号,查看是否能恢复正常,如果恢复正常,则为引号和右括号注入。
SQL注入冲代码上来看分为以下几类:
- select * from user where id = 1
- select * from user where id = '1'
- select * from user where id = "1"
- select * from user where (id = 1)
- select * from user where (id = '1')
- select * from user where (id = "1")
方法二:正确错误判断法
在数据后门添加上and 1=1 或者 and 1=2 ,1=1正确,1=2错误,查看页面是否会返回不同的响应,当使用and 1=1进行测试时返回正常页面而and 1=2进行测试时返回错误页面或者页面没有正常显示则说明该链接存在SQL 漏洞。
SQL 注入分类
SQL注入类型有以下 5 种:
UNION query SQL injection(可联合查询注入)
Stacked queries SQL injection(可多语句查询注入)
Boolean-based blind SQL injection(布尔型注入)
Error-based SQL injection(报错型注入)
Time-based blind SQL injection(基于时间延迟注入)
前面博客有先关的,自行查看
SQL注入之二次注入
原理:用户向数据库里存入恶意的数据,在数据被插入到数据库之前,肯定会对数据库进行转义处理,但用户输入的数据的内容肯定是一点摸样也不会变的存进数据库里,而一般都默认为数据库里的信息都是安全的,查询的时候不会进行处理,所以当用户的恶意数据被web程序调用的时候就有可能出发SQL注入。
举例:数据库中存在一个账户admin,密码:未知
通过注册功能,注册一个新的账户admin'#,密码:admin,注册成功后,登录之后更改admin'#的密码,密码为:123456,最后admin账户的密码变成的123456
原理:由于注册的时候,未过滤,导致admin'#账号的特殊符号也写入数据库。而更改密码的数据库语句为:username="admin'#" new_pass="123456" old_pass="admin"
$ sql = "update users set password ='$ new_pass' where username='$ username' and password='$ old_pass' ";
加入更改密码数据后为:
$ sql = "update users set password ='123456' where username='admin'#' and password='admin' ";
观察发现得,#后面的' and password='admin' ";被注释,修改的用户名为admin,执行后admin的用户名被更改
SQL注入之重叠注入
在SQL语句中,语句的结束都是以”;“结尾,但是如果我们在”;“后面再加上一条SQL语句,两条语句会一起执行吗?这也就是造成堆叠注入的原因了。