当前位置:   article > 正文

安全小白的pikachu靶场学习笔记(三)---sql注入(II)_pikachu head 注入讲解

pikachu head 注入讲解

系列文章

暴力破解
sql注入(I)


`


前言

本篇文章将会针对pikachu靶场中的其它sql注入环节进行分析讲解
通过这篇文章,你也许会学到更多的sql注入的位置、方式,重点是基于函数报错的方式注入,还有盲注的思想。


提示:以下是本篇文章正文内容,下面案例可供参考

一、"insert/update"注入

点一下提示,“如果你还没有账号,请先注册一个”
那我们就先注册一个账号吧!
在这里插入图片描述
由这个注册界面,我们可以猜测应该后台存在insert函数,来插入注册的用户信息到相关数据库中。
那么我们就有可能可以基于函数报错来尝试构造攻击载荷,sql注入!

重要知识点: 基于函数报错的sql注入

基本思路:
在mysql中使用一些特定函数时,故意让其报错,它们报错时有可能会返回一些你想要获取的关键私密信息!
  • 1
  • 2
使用条件:
(1)开发人员没有屏蔽掉这些函数报错信息,能够在前端看到
(2)没有类似于WAF的安全设备对构造的攻击载荷进行拦截
  • 1
  • 2
  • 3
适用对象:
*select/insert/update/delete*这些函数都可以通过报错来获取信息
  • 1
  • 2
常用函数:
updatexml()

extractvalue():是 MYSQL 对 XML 文档数据进行查询的 XPATH 函数

floor():MYSQL中用来取整的函数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

基于函数报错主要使用频率最高的便是updatexml()

updatexml():该函数是 MYSQL 对 XML 文档数据进行查询和修改的 XPATH 函数

具体格式为:
UPDATEXML(xml_target, xpath_expr, new_value)

参数说明:

xml_target:指定要更新的XML数据字段或表达式。
xpath_expr:XPath表达式(一种用于在XML文档中定位和选择节点的语言),该参数用于**定位**要更新的XML节点。
new_value:要替换为的新值。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

其中xpath_expr必须Xpath格式的字符串,且这个参数必须是有效的,如果无效就会发生错误——后端会先把这个XPath表达式执行,执行错误后,会把错误信息爆出来,我们就是利用这点来进行注入。

ps:学安全真的不简单,要学好多东西哈哈,关于Xpath语言,可以网上搜一下学习,如果后面需要学习爬虫什么的,也是绕不开要学习的,这里给出几篇相关文章:
XPath入门(含动图解析)

Xpath函数——字符串函数

官方文档

Xpath语法整理归纳

为了判断是否能够利用报错来注入,我们先在注册界面输入进行如下操作:
在这里插入图片描述
提交后得到如下反馈:
在这里插入图片描述
这个反馈说明了:
(1)前端输入的信息参与了后台数据库的拼接,存在sql注入
(2)前端会返回报错信息,可能可以利用函数报错来注入

再加上之前判断采用了insert函数,于是我们用前面说到的updatexml()函数来尝试注入。
那要怎么基于insert注入来构造闭合语句呢?

我们先看,如果正常注册,insert的sql语句应该是这样的(天眼玩家- _ -):
在这里插入图片描述
那么如果我们要去写入payload,就可以按照这种格式:
在这里插入图片描述
通过单引号和or语句,把两个正常的单引号给拆开,并且形成闭合,然后在两个or中间美美写上我们精心构造的攻击载荷嘿嘿嘿

示例:
在注册区的账号处输入如下语句,密码区域随便写个密码:

hacker' or updatexml(1, concat(0x7e, database()) ,0) or '
  • 1

爆出数据库名:
在这里插入图片描述
再去把database()换成我们想要的数据,一次次去爆,就可以完成sql注入,夺取数据。
注意:需要使用concat拼接函数与0x7e(转义后就是那个~波浪线),如果直接updatexml(1,database(),0)是无法显示想要信息的——可能原因是database()没有直接出现语法错误,因此不会直接返回相关信息。事实上如果输入这个payload:

xiaohong' or updatexml(1, concat(0x7e, database()) ,0) or '
  • 1

pikachu的返回结果是:
在这里插入图片描述
由于没有明显的语法错误,数据库将 database() 视为一个 Double 类型的值,并尝试将其截断转换为 Double 类型,导致了错误。

我们发现在pikachu这一栏目中除了注册外,还可以更新用户信息:
在这里插入图片描述
因此我们猜测修改个人信息中会存在update注入
对于update函数来说,语法和insert是一模一样的,因此构造payload的形式也是一样的。
我们直接在可以修改的那一栏开始我们的表演:
在这里插入图片描述
果然成功爆库:
在这里插入图片描述
总结:基于upadte/insert函数报错的格式是一样的,他们的特殊点在于构造闭合的位置以及or关键字的使用

二、delete型注入:

有了前面关于insert与update的基础,delete型报错注入就不用多讲了,只需要在他们的形式上稍加变化,构成闭合即可。
开天眼,看一下后台delete语句一般长啥样:
作者大大在源码里面其实写了很多注释,允许的话可以都去看看
因为传进去的是一个id,是一个数字型的
所以我们的payload不需要用单引号闭合
把上面我们的payload改为

1 or updatexml(1, concat(0x7e, database()) ,0) 
  • 1

delete方式不能直接在网站界面进行注入,我们尝试用BurpSuite
在这里插入图片描述
因为删除的是id嘛,注入点也在这里,把id改为我们构造的Payload:
在这里插入图片描述
send之后,纳尼???
在这里插入图片描述
这是为什么呢?
原来因为我们的id参数是在URL中用GET请求提交的,因此我们需要对id进行URL编码。——选中–convert selection–URL–URL-encode key characters
在这里插入图片描述
成功注入!
在这里插入图片描述


三、http header注入

什么是http header注入?

有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)
或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等。
会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑
则可能会导致基于http header的SQL Inject漏洞。
  • 1
  • 2
  • 3
  • 4

登录场景:
在这里插入图片描述
由这句话我们可以知道,后台调取了我们的http头
而一般有http头的地方,就可能存在sql注入
因此我们再次使用bp,构造payload:

firefox' or updatexml(1, concat (0x7e,database()),0) or '
  • 1

在这里插入图片描述
成功爆库
这启示我们,在进行sql注入时,除了一些常见的注入点外,像http头部,也常常会有这种注入。

四、盲注

什么是盲注?

在有些情况下,后台使用了错误消息屏蔽方法(比如@ )屏蔽了报错
此时无法在根据报错信息来进行注,入的判断。
这种情况下的注入,称为“盲注”
根据表现形式的不同,盲注又分为based boolean和based time两种类型
  • 1
  • 2
  • 3
  • 4

什么是based boolean?

基于boolean的盲注主要表现症状:
0.没有报错信息
1.不管是正确的输入,还是错误的输入,都只显示两种情况(我们可以认为是0或者1)
2.在正确的输入下,输入and 1=1/and 1= 2发现可以判断
  • 1
  • 2
  • 3
  • 4

我们在pikachu中举例:
输入

kobe' or 1=1#
  • 1

在这里插入图片描述
结果:
在这里插入图片描述
好像并没有返回具体的报错信息,似乎无计可施~
输入:

kobe' and 1=1#
  • 1

在这里插入图片描述
却能爆出正确的信息,也就是说后台只是处理了kobe这一字段,也就是说单引号’构成了闭合,也就是说and 1=1#已经被后台执行了。
输入

kobe' and 1=2#
  • 1

果然:
在这里插入图片描述
说明后面的句子是执行的
那么你的基于正误来判定的盲注就算是成功一半了
请大家想一下:
你依旧要去获得数据库的名称
但是这个前端只会告诉你true or false
那么怎么去获得呢?

思路:
将想要获得的字符一个个转换成ascii码
然后通过比大小的方式夹逼推理得到具体的最后值
例如:
pikachu的第一个字符是p
对应的ascii码是112
那如果用>110的判定语句,会返回true
       >113的判定语句,会返回false
       那么就可以通过盲注,一步步获得库名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
kobe' and ascii(substr(database() ,1,1) )>113#
  • 1

怎么样,是不是很麻烦,所以搞懂盲注的原理后,我们一般用工具去做自动化测试

什么是基于时间的盲注?
如果说基于boolean的盲注在页面上还可以看到0 or 1的回显的话
那么基于time的盲注完全就啥都看不到了!
但还有一个条件,就是“时间”
,通过特定的输入,判断后台执行的时间,从而确认注入!
常用的Teat Payload:
kobe' and sleep(5)#
看看输入: kobe和输入kobe 
and sleep(5)#的区别,从而判断这里存在based time的SQL注入漏洞
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

怎么查看sleep函数是否起作用呢?
web开发者工具—网络 里面就可以看到传输时间,对比加上sleep和不加的区别 即可确认是否有盲注
判断方式和思路与boolen based是一样的 就不多赘述。
给出一个例子:

基于时间的延迟:

kobe' and if((substr(database(),1,1))='p' ,sleep(5) ,null)#
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/267540
推荐阅读
相关标签
  

闽ICP备14008679号