这是我的第一篇blog,对于一些知识点会有针对的详略,不过会做到尽可能的精简与便于理解,我的知识量与能力也有限,有些问题大家可以指出。
SQL注入的原理
简要的说SQL注入漏洞产生的原因就是WEB应用程序对用户输入的合法性没有判断,前端传入的参数是攻击者可控的,并且带入数据库查询,达到了攻击者构造非法语句实现对数据库的任意操作。
SQL注入漏洞的产生需要满足两个条件:
- 参数用户可控
- 参数带入数据库查询
这里我们通过sqli-labs靶场的第一关来探究一下SQL注入漏洞的原理,这里需要结合关键代码来结合理解。
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
这就是一句基本的SQL语句带入数据库查询并且输出结果的php代码,通过代码可以看到,前端通过GET方式传入ID参数拼接成一句SQL语句,这就叫满足了参数用户可控这个条件
之后这个SQL语句直接交给数据库查询,并且输出得到了结果,也满足了第二个条件参数能够带入到数据库查询
由于传入的参数没有经过任何的过滤就交给了MySQL服务器处理,这就能够使得达到了攻击者构造非法语句实现对数据库的任意操作。
检测是否存在SQL注入漏洞的方式
存在sql注入的地方必须要传入我们的参数,所以要找到可输入点,发送数据的方式主要有GET和POST两种方式,当然,还有header头注入的方式。所以,先需要找到用户输入点。
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
这个代码使得id参数可控,此时我们就可以通过一些语句来判断是否存在SQL注入漏洞
sql注入也有数字类型和字符类型的分类
数字类型可以通过下面这种方式
?id=1' and 1=1 --+ //回显正常
?id=1' and 1=2 --+ //回显不正常
如果同时满足这两种情况说明可能存在SQL注入
字符类型可以通过下面这种方式
?id=1' and '1' ='1 //回显正常
?id=1' and '1' ='2 //回显不正常
如果同时满足这两种情况说明可能存在SQL注入
我们这里展示拼接之后的语句就会更加明白这个的原理
这是输入id=1正常的代码组成的SQL语句,执行后就会给前端返回第一行的数据,此时若是把?id=1’ and 1=1 --+输入进去之后,拼接成的就是:
此时由于and 1=1 还是逻辑判断正确,所以仍然返回id=1时的结果把?id=1’ and 1=2 --+输入进去之后,拼接成的就是:
此时由于and 1=2 的逻辑判断为否,所以只能返回为空
这里只尝试了数字型的方式,字符型的可以自己进行尝试一下
与MySQL注入相关的知识点
每个SQL数据库都可能会存在SQL注入的风险,基于MySQL自身的一些优势,如开源效率高,是目前较为流行的数据库,也是初学者接触的,所以这里先介绍MySQL注入的基础与技巧,如果系统学习过MySQL会对SQL注入的知识会有更好的理解和使用,因为从某种意义来说SQL注入就是在执行攻击者的攻击语句达到意图,那么就是只要符合MySQL语句的语法都可以得到执行。
这里先说一下MySQL注释
MySQL注释
单行注释
- # 注释
SELECT * FROM users WHERE id='1' and 1=1 #' LIMIT 0,1"; 这里#注释就把LIMIT限制给注释掉了
- --
SELECT * FROM users WHERE id='1' and 1=1 --' LIMIT 0,1"; 这里--+注释就把LIMIT限制给
这里说明一下为什么url框里有时会用–+进行注释,因为注释后需要一个空格才会生效,有些代码却没有空格会导致没有达到注释的效果,而+在url编码之后就是空格符号,所以习惯url输入的注释是–+,而get方式的传入会使用#作为注释符号
多行注释
- /**/
/*之间所有的内容都会被注释掉*/
一些查询数据库基本信息的函数
user() 当前用户名
database() 当前数据库
version() 当前数据库版本
可以根据自己的需要去了解一些函数,一些信息对注入具有非常重要的意义,比如各个版本有各自的特性,利用一些特性有特别的注入方式
还有非常重要的知识就是MySQL的默认库,通过默认库可以查询出很多数据,通过这张图可以方便了解
总结
这里我只列举了我认为一些相对重要的知识来方便大家对SQL注入的了解,注重实用性会更加大家学习,详细的攻击方式在之后的内容会给出,朋友们觉得本文有瑕疵或建议可以联系我并提出,谢谢大家