sql-inject漏洞手动测试-基于函数报错的信息获取
1.常用的报错函数:
- updatexml()
- extractvalue()
- floor()
我们在使用这三个函数的时候,可以根据我们构造的报错点,把相关的报错信息给报出来,我们就可以通过相关的报错信息,来把我们想要的信息给套出来
2.基于函数报错的信息获取(select/insert/update/delete)
前面的几次注入我们一直都用的select,这次我们可以使用insert,update,delete
技巧思路:
在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。
select/insert/update/delete都可以使用报错来获取信息
前提条件:
后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。
前面提到的三个报错函数在MYSQL中的用处:
3.updatexml()具体讲解
简单概括基本就是将括号里第一个参数中的第二个参数用第三个参数去进行替换。
我们需要注意的是,如果Xpath是一个表达式,它会先把表达式执行,再把执行结果作为报错的内容给报出来,所以我们才会用这个函数来进行注入漏洞。
我们切换到pikachu平台上来进行演示
按照之前的步骤,我们先确认这个地方是否有SQL注入点,
发现他报出错误来后我们可以确定,这个地方是符合报错的操作条件的
可以基于上面的原理,可以构造这样一个payload
这个函数的第一个参数传进去其实是错误的,因为不存在这个值,所以后面的替换为0也是无意义的,但关键就在中间的version(),刚才提到过,它会先把表达式执行,再把执行结果作为报错的内容返回出来,我们将这个payload提交一下
网页返回了这个值,网页并没有把完整的版本号打印出来,我们需要对函数的报错内容进行一个处理
concat的作用就是将括号里面的参数组合成一个字符串,0x7e是~的16进制
我们将这一串输入进去,点查询,
这回数据库的版本号就会完整的打印出来了
同样的原理,我们输入这行payload
数据库的名称就可以得到了
如果我们把上篇提到的information_schema放到第二个参数里会怎么样呢?
网页报了一个错误
说明报错只能显示一行,这个问题怎么解决呢?很简单,我们一行一行的查呗
实现这个操作只需要在后面加上 limit 0,1
就能得到第一行表的名称了
如果想要获得第二行的,就只要把零换成1就行了
一次类推,继续加数,就可以一行一行取得信息
剩下的,再想获取其他表大体思路就和上一篇文章很相似了