注入之SQL注入2

渗透学习

注入之SQL注入2



前言

本系列用于记录本人渗透学习的过程,主要内容围绕Owasp TOP 10展开。

接上文注入之SQL注入1

上文已经详细描述了SQL注入的基本内容和判断是否存在注入点和注入点类型。在注入之SQL注入2 将用实验案例的形式记录一些新的注入技术,如:POST注入、基于报错的注入、基于布尔的盲注和基于时间的盲注,采用手工注入的方法了解SQL注入的新的思路。

本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。

一、POST注入

POST是一种用于向Web服务器发送信息的HTTP方法,由于其数据内容无法在URL中看到,因此也不能直接在URL上进行修改。这个时候我们就需要借助一定的工具来修改POST包,比如:Hackbar和Burpsuite等。

Hackbar和Burpsuite是很常用的工具,其基本介绍和使用操作在网上有很多介绍,这里不再赘述。

这里我们还是使用基于联合查询的注入技术

实验原理:POST注入,其注入点存在于POST表单中的参数处。攻击者可以通过浏览器拓展插件(如Hackbar)或代理抓包工具(如Burpsuite)拦截并修改POST表单中的参数,利用union select命令进行注入,获取数据库中存储的信息。

先提交任意用户名和密码,再用Burpsuite抓取POST包。得到其内容为:uname=1&passwd=1&submit=Submit
初始提交
将拦截到的HTTP请求包发送到Repeater模块进行进一步操作(也可以在Hackbar中勾选Post data进行操作,由于注入方法相同,这里只介绍前者)

在GET方法中,我们用–+的注释方法;在POST方法中,我们采用#注释之后的内容。
如uname=admin’#&passwd=1&submit=Submit

使用前一篇文章介绍的方法,我们可以很快的判断出注入类型为字符型注入,然后对其进行基于联合查询的注入。
在Burpsuite的注入

二、基于报错的注入

当union被过滤后,基于联合查询的注入就无法再使用,因此我们就需要更改注入的方法。

基于报错的注入是通过构建特定的SQL语句,让攻击者想要查询的信息(如数据库名、版本号、用户名等)通过网页的错误提示回显出来。

这种注入点存在的原因是:
1.web应用程序未关闭数据库报错函数(print_r(mysql_error())),导致错误直接回显。
2.后台未对一些报错功能的函数(如extractvalue,updatexml等)过滤

在开始实验之前,这里先对接下来需要用到的具有报错功能的函数进行介绍:
1.extractvalue():对XML文档进行查询。
语法:extractvalue(目标xml文档,xml路径)
我们可以在第二个参数xml路径上进行操作,因为xml文档中查找字符位置是用/xxx/xxx/xxx这样的,如果我们使用了其他格式,就会发生报错,并且返回我们写入的非法格式内容。
在这里插入图片描述
可以看到我们当前的数据库名和报错信息一起被回显了出来。
2.updatexml():更新xml文档的函数
语法:updatexml(目标xml文档,xml路径,更新的内容)
同理第一个函数,我们还是可以在第二个参数上操作:
在这里插入图片描述
值得一提的是,以上两种函数都属于Xpath类型的函数,主要对xml文档进行处理,并且函数最长显示为32,超过的长度要用substr,limit显示。

另外,还有很多其他的函数会引发基于报错的注入。如:
1.floor()、rand()、count()、group by连用
2.exp()

这里主要介绍两种Xpath类型的函数,有兴趣的可以去搜索。

实验原理:在Xpath类型函数对xml路径参数操作导致报错回显

通过判断此处存在字符型注入点,对其进行基于报错的SQL注入。和基于联合查询的SQL注入相比较,该注入不需要判断字段数和回显位置,可以直接开始查看当前数据库。
错误回显
其他操作和基于联合查询类似,最后通过limit可输出想要的结果
在这里插入图片描述

三、SQL盲注

在SQL注入过程中,SQL语句执行后,会遇到想要的数据不能回显到前端页面的情况,这个时候就需要一些方法来判断自己语句的结果,这个过程叫盲注。

在盲注的过程中,攻击者需要根据返回页面的不同来判断信息,一般情况下,盲注可分为两类:
1.基于布尔的盲注(返回页面内容不同,结果true或false)
2.基于时间的盲注(延时功能的函数sleep,benchmark)

实验用到的主要函数有:
1.IF(‘a’,1,2) 在a的位置输入猜测语句,真1假2
函数演示

2.left() 输出前n位
函数演示
3.length() 显示字符长度
函数演示
4.substr() 从n位开始输出m个字符
函数演示
5.ascii() 输出第一个字符的ascii码值
函数演示
6.cast(),convert() 字符形式转换
函数演示
还有两个延时类函数
7.sleep(10) 延时执行10秒
8.benchmark(1000000,md5(‘abcde’)) 执行md5语句1000000次

1、基于布尔的盲注

常用payload:
1.and length(database())>5–+ 猜长度
2.and (select substr(database(),1,1)=‘a’–+ 猜名字
3.and ascii(select substr(database(),2,1))=101–+ 猜名字

通过页面是否有显示判断是否猜测正确。
比如猜测数据库名称长度为7
回显结果
可知猜测错误。

猜测数据库名称长度为8
回显结果
可知猜测正确

最后判断的复杂payload类似:
and substr((select concat_ws(’,’,username,password) from security.users limit 1,1),2,1)=‘n’–+
and ascii(substr((select concat_ws(’,’,username,password) from security.users limit 1,1),2,1))=110–+

2、基于时间的盲注

常用payload:
and if(length(database())=8,sleep(5),1)–+

当猜测正确时,网页会延时执行5秒。

在判断注入点类型时,由于没有回显结果,会需要sleep()来判断
如:
id=1’ and sleep(5)–+
表现结果
有明显延迟,成功执行。

接下来,只需要套上if语句,通过延迟来判断语句是否成功执行。

复杂payload类似于:
and if(substr((select concat_ws(’,’,username,password) from security.users limit 1,1),2,1)=‘n’,sleep(5),1)–+
and if(ascii(substr((select concat_ws(’,’,username,password) from security.users limit 1,1),2,1))=110,sleep(5),1)–+


总结

以上罗列了不同的注入技术如:POST注入、基于报错的注入、基于布尔的盲注和基于时间的盲注。相比较于上一篇单一的联合注入,可以在union被过滤之后采用另外的注入技术。其中,基于报错的注入重点需要掌握mysql数据库不同版本可用的报错功能函数;而盲注手工注入比较费时费力,接下去的文章会采用试出语句后用脚本来跑的方法等手工+工具的方式来进行sql注入进阶。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bwxzdjn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值