一、sql注入原理
SQL注入就是把SQL命令插入到Web表单然后提交到所在页面请求(查询字符串),从而达到欺骗服务器执行恶意的SQL命令。
它是利用现在已有的应用程序,将SQL语句插入到数据库中执行,程序没有细致过滤用户输入的数据,从而导致非法数据进入系统。
二、注入的产生条件
1、参数用户可控:前端传给后端的参数内容是用户可以控制的。
2、参数带入数据库查询:传入的参数拼接到SQL语句,且带入参数库查询。
三、SQL注入的危害
1、数据库信息泄露:数据库中存放的用户的隐私信息的泄露。
2、网页篡改:通过操作数据库对特定网页进行篡改。
3、数据库被恶意操作︰数据库服务器被攻击,数据库的系统管理员帐户被窜改。
4、服务器被远程控制︰被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
四、sql注入类型分类
1、注入点参数类型
1)、数字型注入:当输入参数为数字类型时,例如页码,ID等,存在注入时则为数字类型的注入。
2)、字符型注入:当输入参数为字串类型时,则为字串类型的输入,其与数字类型的注入的区别在于注入时需要使用引号来闭合。
3)、搜索型注入:这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。
2、提交方式类型
1)、GET注入:GET注入是最简单的注入,不需要额外的工具。GET提交数据的方式的特点是将用户操作生成的语句直接显示在url上,常见于不需要保密传输的页面。
2)、POST注入:使用POST提交的页面通常需要一定的保密性,常见于用户登录页面,用户操作生成的语句会存在于表单中,需通过抓包获取,常用抓包工具BurpSuite。抓取数据包后,可以通过修改提交的内容,结合网站页面反馈,判断是否可进行注入。
3)、Cookie注入:Cookie存在用户本地客户端的数据集合,HTTP 请求表单中会带上客户端的 Cookie, 注入点存在于Cookie 当中的字段中。和POST一样,Cookie也要通过抓包来查看。
4)、Http头注入:HTTP头注入是指攻击者通过在HTTP头中注入恶意的SQL语句,从而获得对数据库的访问权限。攻击者通过修改HTTP头中的User-Agent、Referer等字段来实现SQL注入攻击。
3、注入点反馈类型
1)、联合查询注入:联合查询适合于有显示位的注入,即页面某个位置会根据我们输入的数据的变化而变化。
2)、报错注入:数据库在执行SQL语句时,会先对SQL进行检测,如果SQL语句存在问题,会将报错的语句反馈到页面中。可以构造恶意的SQL,触发数据库的报错,而在报错的信息中就存在我们想要获取的信息。常用的报错函数:updatexml()、extractvalue()、floor()。
updatexml():这个函数实际上是去更新了XML文档,但是我们在XML文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合输入规则报错了,但是报错的时候其实已经执行了那个子查询代码
extractvalue():是mysql对xml文档数据进行查询的xpath函数,只适用于MySQL 5.1以上版本,且只回显32位字符
floor():mysqk中用来取整的函数,并且没有版本和字符限制
3)、布尔盲注:sql服务器不会直接反馈查询内容,而是通过反馈一个布尔参数给网站服务器,然后再由网站服务器将内容反馈到浏览器,而布尔类型只有两个参数,ture和false,此时可通过配合猜解函数如if(),ascii(),length(),left(),substr()等,来判断注入操作的效果。
if():if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
left():left(a,b),从左截取a的前b位,正确返回1错误返回0
ascii():将某个字符串转化为ascii值
length():返回字符串的长度
substr():截取字符串
4)、时间延时盲注:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。常用的延时函数:sleep()、waitfor delay '0:0:0'
sleep():为mysql睡眠函数,可以使查询数据时回显数据的响应时间增长,使用方法如sleep(5),这里的5为睡眠时间,页面返回将延时5秒
waitfor delay '0:0:0' :是SQLServer中Transact-SQL提供的一个流程控制语句。它的作用就是等待特定时间,然后继续执行后续的语句。它包含一个参数delay,用来指定等待的时间。使用方法如waitfor delay '0:0:5',这里的5为等待时间,页面返回将等待5秒。
5)、堆叠注入:mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔开,而堆叠注入就是通过结束符来执行多条sql语句。
五、防范措施
1、使用参数化查询,可防止sql注入攻击,并提高代码的可读性和可维护性。
2、输入验证和过滤,可防止恶意输入和错误数据导致的安全漏洞和应用程序错误。
3、使用存储过程,存储过程是一组预定义的sql语句集合,可以在数据库中进行重复性和复杂性的操作。
4、最小权限原则,是一种安全性原则,指的是为了保护敏感数据和系统资源,用户被授予最小必须的权限,也就意味着用户只能访问和执行他们工作所需的数据库对象和操作,而不是拥有对整个数据库的完全访问权限。
5、使用准备语句,是一种预编译的sql语句,它可以提高数据库操作的性能和安全性,同时能防止sql注入攻击。
6、使用安全的数据库连接,可以保护数据库免受恶意攻击和数据泄露。
7、使用防火墙和入侵检测系统,为了保护计算机网络免受未授权的访问和恶意攻击。
总结
本篇文章主要讲解一下SQL注入的整体框架,从漏洞原理——漏洞危害——漏洞分类——漏洞防范措施,包括我个人对漏洞的理解,之后会继续围绕SQL注入分类进行漏洞复现,谢谢!