原理:
总之一句话:注入产生的原因是接受相关参数未经处理直接带入数据库查询操作
为了发动注射攻击必须要做三件事情:
1、 确定Web应用程序所使用的技术注射式攻击对程序设计语言或者硬件关系密切,但是这些可以通过适当的踩点或者索性将所有常见的注射式攻击都搬出来逐个试一下就知道了。为了确定所采用的技术,攻击者可以考察Web页面的页脚,查看错误页面,检查页面源代码,或者使用诸如Nessus、AWVS、APPSCAN等工具来进行刺探。
2、确定所有可能的输入方式Web应用的用户输入方式比较多,其中一些用户输入方式是很明显的,如HTML表单;另外,攻击者可以通过隐藏的HTML表单输入、HTTP头部、cookies、甚至对用户不可见的后端AJAX请求来跟Web应用进行交互。一般来说,所有HTTP的GET和POST都应当作用户输入。为了找出一个Web应用所有可能的用户输入,我们可以求助于Web代理,如Burp等。
3、查找可以用于注射的用户输入在找出所有用户输入方式后,就要对这些输入方式进行筛选,找出其中可以注入命令的那些输入方式。这个任务好像有点难,但是这里有一个小窍门,那就是多多留意Web应用的错误页面,很多时候您能从这里得到意想不到的收获。
手工检测SQL注入方法:
URL拼接:单引号 、and1=1、and1=2
注入分类:
数字型
字符串拼接。
字符型
select id,email from member where username='vince'; 万能密码漏洞
搜索型
select* from 表名 where 字段名 like ‘%(对应值)%’;
XX型
XX型是由于SQL语句拼接方式不同,注入语句如下:select * from member where username=('xx') or 1=1;
注入提交方式:
1、get提交:一般直接通过浏览器地址栏提交;
2、post提交:可通过安装火狐浏览器插件(hackbar)或Burp工具来完成;
3、cookie提交:一般通Burp工具来完成。
注入攻击类型与方式
1、union注入:
union操作符用于合并两个或多个SQL语句集合起来,得到联合的查询结果。
2、information——schema注入
information_schema数据库是MySQL系统自带的数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。通过information_schema注入,我们可以将整个数据库内容全部窃取出来, 使用order by(ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字)来判断查询的字段。先找出数据库的名称,输入vince' union select database(),user(),3#%得到反馈,判断数据库名称为pikachu。获取pikachu数据库的表名,输入:u' union select table_schema ,table_name,3from information_schema.tables where table_schema='pikachu'#
3、基于函数报错注入
在MySQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息,常见的select/insert/update/delete注入都可以使用报错方式来获取信息。
实现要求:后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。
基于报错的信息获取(三个常用的用来报错的函数):
1、updatexml ():函数是MYSQL对XML文档数据进行查询和修改的XPATH函数;
2、extractvalue () :函数也是MYSQL对XML文档数据进行查询的XPATH函数;
3、floor ():MYSQL中用来取整的函数。
基于报错的信息获取:
UPDATEXML (XML_document, XPath_string,new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
4、insert注入
insert注入,就是前端注册的信息最终会被后台通过insert这个操作插入数据库,后台在接受前端的注册数据时没有做防SQL注入的处理,导致前端的输入可以直接拼接SQL到后端的insert相关内容中,导致了insert注入。
5、update注入
与insert注入的方法大体相同,区别在于update用于用户登陆端,insert用于用于用户注册端。
6、delete注入
一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入。
7、Http_Header注入
先在pikachu平台打开Http Header注入模块,点击提示查看登录帐号和密码,登陆后去BurpSuite中找到登陆地GET请求,把请求发送到Repeater模块中,去除User-Agent:,然后输入' 然后运行后观察MYSQL语法报错然后发现存在SQL注入漏洞。这时候可以设置payload。在User-Agent输入payload Mozilla' or updatexml(1,concat(0x7e,database ()),0) or '
8、cookie注入
Cookie是网站为了识别用户身份来跟踪会话的,虽然Cookie是由后端生成的,但每次页面跳转,后端都回对前端的Cookie的信息进行验证,但如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点。在 ant[uname]=admin后添加一个’观察反馈的MYSQL的语法报错,发现了存在SQL注入漏洞,在设置Payload 'and updatexml (1,concat(0x7e,database()),0)#,观察报错和之前是否相同。
9、Boolian(布尔型)盲注
在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办?例如应用程序就会返回一个“通用的”的页面,或者重定向一个通用页面(可能为网站首页)。这时,我们之前学习的SQL注入办法就无法使用了。
盲注:即在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。
Boolian:通过对比ascii码的长度,判断出数据库表名的第一个字符,以此类推;输入语句select ascii(substr(database(),1,1))>xx;通过对比ascii码的长度,判断出数据库表名的第一个字符。
那么通过这个方法,虽然只能通过判断单个字符,我们同样可以使用length来判断表名的长度,判断出长度后就能多次输入payload来爆破出每一个表名的字符。输入语句:select length(database())<xx;判断表名长度为多少。
10、base on time(时间型盲注)
基于时间的延迟,构造一个拼接语句:vince' and if(substr(database(),1,1)='X' (猜测点)',sleep(10),null#,输入后,如果猜测真确,那么就会响应10秒,如果错误会立刻返回错误。输入:vince' and if(substr(database(),1,1)='p',sleep(10),null)#,再web控制台下,判断出database的表名的一个字符为p。通过这个办法我们就能逐步向下获取数据。
11、宽字节注入
当我们把php.ini文件里面的magic_quotes_gqc参数设为ON时,所有的'(单引号),"(双引号),\(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。还有很多函数有类似的作用如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。目前大多数的主机都打开了这个选项,并且很多程序员也注意使用上面那些函数去过滤变量,这看上去很安全,很多漏洞查找者或者工具遇到这些函数过滤后的变量直接就放弃,但是就在他们放弃的同时也放过很多致命的安全漏洞。其中\的URL编码是 %5C ,当我们在单引号前面加上%df的时候,最终就会变成運',如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK的编码时,会认为 %df 是一个宽字符,也就是運,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。
' =======>\'单引号转义后占两个字节,所以我们需要通过繁体字%df构造两个字节,最终用運干掉了\,也就是说被運占领了\ 所以最后在页面也不会显示出来。