vlambda博客
学习文章列表

可怕的漏洞,SQL注入漏洞实战演习


不当想研发的渗透人不是好运维 可怕的漏洞,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 time10.宽字节注入

实战


数字型注入(POST)

可怕的漏洞,SQL注入漏洞实战演习

2.抓包查看(PS:工具的操作可以查看burpsuite的文章哦!!

可怕的漏洞,SQL注入漏洞实战演习

3.修改包插入or 1=1# 对数据进行遍历,发现可以遍历成功,有漏洞。(PS:输入这条语句在后台中会拼接为select username ,email from member where id=4 or 1=1#)

可怕的漏洞,SQL注入漏洞实战演习


数字型注入(GET)

1.发现一个查询框,可以输入字符

可怕的漏洞,SQL注入漏洞实战演习

2.直接使用1' or 1=1#走一波查看是否可以直接注入,发现无过滤可以直接注入。

可怕的漏洞,SQL注入漏洞实战演习


搜索型注入

1.发现页面有一个搜索框,猜测模糊查询的字段应该是'%查询内容%'

可怕的漏洞,SQL注入漏洞实战演习

2.使用%号进行闭合构造1%' or 1=1#试试,成功注入(其实1' or 1=1#也能注入成功可怕的漏洞,SQL注入漏洞实战演习

可怕的漏洞,SQL注入漏洞实战演习


XX型注入

1.发现一个输入框使用1' or 1=1#进行尝试发现报错,大概意思是说我的语法有错误。

可怕的漏洞,SQL注入漏洞实战演习

可怕的漏洞,SQL注入漏洞实战演习

2.说我语法错误,使用)号进行构造1') or 1=1#来闭合报错信息

可怕的漏洞,SQL注入漏洞实战演习

扩展:基于报错的信息获取技巧思路:在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型,发现一个注册页面,点击注册进入

可怕的漏洞,SQL注入漏洞实战演习

可怕的漏洞,SQL注入漏洞实战演习

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 ' 成功获取数据库名。

可怕的漏洞,SQL注入漏洞实战演习

可怕的漏洞,SQL注入漏洞实战演习

3.update型,我们先正确注册一个账号,然后登录

可怕的漏洞,SQL注入漏洞实战演习

可怕的漏洞,SQL注入漏洞实战演习

4.点击修改个人信息,还是和之前一样,我们要想象,后台的mysql语句是怎么执行的,更新我们的信息,需要用到的时候update语句,构造1' or updatexml(1,concat(0x7e,database()),0) or '来获取数据库名。

可怕的漏洞,SQL注入漏洞实战演习

可怕的漏洞,SQL注入漏洞实战演习


“delete”注入

1.发现一个留言板,既然是delete注入,那肯定是在删除这里。

可怕的漏洞,SQL注入漏洞实战演习

2.点击一下删除,使用burpsuite抓包查看,删除使用数字型我们就不用单引号闭合,直接or就行了

可怕的漏洞,SQL注入漏洞实战演习

3.构造+or+updatexml(1,concat(0x7e,database()),0)添加到url后面,成功获取到数据库名。

可怕的漏洞,SQL注入漏洞实战演习


“http header”注入

1.先登录一下看看。

可怕的漏洞,SQL注入漏洞实战演习

2.提示说我的信息被记录了!!!还返回了我的user-agent,那么肯定把我的user-agent记录到数据里了,那我们就从user-agent注入。

可怕的漏洞,SQL注入漏洞实战演习

3.抓包在user-agent传个号看看什么情况,发现有报错信息。

可怕的漏洞,SQL注入漏洞实战演习

4.构建' or updatexml(1,concat(0x7e,database()),0) or '  成功获取数据库名。

可怕的漏洞,SQL注入漏洞实战演习


盲注(base on boolian)

表现:1.没有报错信息2.结果都只显示两种情况(0或1)

1.布尔型麻烦就在于需要多次尝试来测试出正确的注入点,先正常查询看看。

可怕的漏洞,SQL注入漏洞实战演习

2.加个号看看,无回显

可怕的漏洞,SQL注入漏洞实战演习

3.构建vince' order by 2#试试,有回显。

可怕的漏洞,SQL注入漏洞实战演习

4.构建vince' order by 3#试试,无回显。

可怕的漏洞,SQL注入漏洞实战演习

5.知道了注入点,只能通过真或者假来获取数据或者跑sqlmap,给出一些基本的盲注语句判断库名长度。

判断库名长度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)#   页面会延迟五秒

可怕的漏洞,SQL注入漏洞实战演习

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被编成了可怕的漏洞,SQL注入漏洞实战演习,而单引号就逃逸出来了,从而形成了注入漏洞。

1.抓包构造payload:vince%df%27 or 1=1# 直接遍历出来了。

可怕的漏洞,SQL注入漏洞实战演习

2.如果想要爆表爆列只需要在vince%df%27#中间插入语句即可。

可怕的漏洞,SQL注入漏洞实战演习


往期内容





可怕的漏洞,SQL注入漏洞实战演习

   专业的信息安全团队,给你最安全的保障。定期推送黑客知识和网络安全知识文章,让各位了解黑客的世界,学习黑客知识,普及安全知识,提高安全意识。

觉得不错点个“赞”呗