概述
前面的pikachu、DVWA、sqli-labs里面都介绍了很多sql注入的东西了,这里要系统的学习一下SQL的原理和注入的内容,算是我的学习笔记叭,也给大家分享一下。
Web程序与数据库交互过程
SQL注入的定义
很多应用程序都使用数据库来存储信息。SQL命令就是前端应用程序和后端数据库之间的接口。攻击者可利用应用程序根据提交的数据动态生成SQL命令的特性,在URL、表单域,或者其他的输入域中输入自己的SQL命令,改变SQL命令的操作,将被修改的SQL命令注入到后端数据库引擎执行。
当应用程序将用户输入的内容,拼接到SQL语句中,一起提交给数据库执行时,就会产生SQL注入威胁。
SQL注入危害
- 窃取数据库敏感信息——任意查询用户信息、任意查询管理员账号密码
- 对数据进行恶意的增删改
- 造成拒绝服务——通过sleep,benchmark 等函数时数据库阻塞不能正常工作
- 文件系统操作:列目录,读取、写入文件(一句话木马)等。
- 获取服务器权限(执行系统命令)——使用数据库内置的一些函数来执行系统命令
SQL注入分类(以字符类型方式)
按传递参数类型分:
数字型:例如 id=1 ,数字型注入不需要考虑单引号或者双引号闭合。
字符型:例如 name='bob',字符型注入,需要考虑单引号的闭合和注释问题。
按注入类型分:
回显注入
- 回显正常:通过执行构造的SQL注入语句之后,页面与原页面存在差异,但没有报错信息。在SQL注入过程中,注入后页面与原页面存在差异,但没有报错信息。
- 回显报错:通过执行构造的SQL语句之后,页面报错,且将报错信息显示页面上。通过注入使程序报错的语句,将敏感信息显示在错误提示中,通常程序使用了mysql_error类似的函数,将错误信息直接显示在页面中。select id,name from product where id = 1 and updatexml(1,concat(0x5c,user()),1) //在显示错误信息的同时也会将user()函数执行的结果返回在页面上。
盲注
- 布尔型盲注:构造SQL语句之后,根据页面显示差异来判断。在SQL注入过程中,应用程序仅仅返回True(页面)或False(页面)。无法根据应用程序的返回页面得到需要的数据库信息。可以通过构造逻辑判断(比较大小)来得到需要的信息。select id,name from product where id = 1 or 1=1
- 基于时间的盲注:构造SQL语句之后根据页面响应时间来判断。在SQL注入过程中,无论注入是否成功,页面完全没有变化。此时只能通过使用数据库的延时函数来判断注入点一般采用响应时间上的差异来判断是否存在SQL注入,即基于时间型SQL盲注。select id,name from product where id = 1 and sleep(2)
哪些地方存在注入漏洞
- 最普遍的注入漏洞是由于参数值过滤不严导致的。
- Cookie注入漏洞普遍存在于ASP的程序中。
- 参数名、目录名、文件名等注入漏洞通常存在于有网站路由的程序中。
判断注入漏洞的依据
根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行,如果测试语句被执行了,说明存在注入漏洞。
数据库的注释语法
SQL Server和Oracle:
- -- 用于单行注释
- /* */ 用于多行注释
Mysql:
- # 用于单行注释
- /* */ 用于多行注释
- -- 在Mysql里要后面跟个空格或者+