一、False Injection
1. 引子
首先我们常见的注入
这些都是基于1=1这样的值得比较的普通注入,下面来说说关于False注入,利用False我们可以绕过一些特定的WAF以及一些未来不确定的因素,其中有些姿势之前了解但是没有去深入,这次做一个归纳总结。
首先抛出这么一个问题
为什么username=0会导致返回数据呢?
这就是一个基于false注入的例子,下面在举一个例子
和上面是同一个表,但是为什么这里只返回了两组数据呢?说到这里不得不说一说有关于MYSQL的隐式类型转换。
2. MYSQL隐式类型转换
关于官方文档中的理解大致是:
如果两个参数比较,有至少一个NULL,结果就是NULL,除了是用NULL<=>NULL 会返回1。不做类型转换
两个参数都是字符串,按照字符串比较。不做类型转换
两个参数都是整数,按照整数比较。不做类型转换
如果不与数字进行比较,则将十六进制值视为二进制字符串。
有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为时间戳
有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
所有其他情况下,两个参数都会被转换为浮点数再进行比较
最后那一句话很重要,说明如果我是字符串和数字比较,需要将字符串转为浮点数,这很明显会转换失败
在这里我试了试如果是字符串和数字比较:
可以看到在进行类型转换的时候,将字符串转换的时候会产生一个warning,转换的结果为0,但是如果字符串开头是数字的时候还是会从数字部分截断,转换为数字。
现在可以很好理解开头说的为什么username=0会导致返回数据了,就是因为这里会将数据转换为浮点数比较,但是字符串转换会出问题,从而返回0使得0=0从而为true得到结果,而后面passwd查询少一组数据的原因就是admin的passwd字段第一个字符是2 从而返回2 并非为0。
2. 利用
实际中我们接触到的语句都是带有引号的,类似于where username=’+input+’ 这样的,这时候我们就需要做一些处理来构造false注入的利用点。
2.1. 算术运算
加:+
减:-
乘:*
除:/
取余:%
2.2. 位操作运算
我们可以使用当字符串和数字运算的时候类型转换的问题进行利用
我们可以用的位运算符有:
和运算:&
或运算:|
异或运算:^
移位操作:
位非(~):这里位非运算符由于是在表达式之前的
2.3. 比较运算符
安全等于:<=>
不等于<>(!=)
大小于>或<
2.4. 其他
1’+1 is not null# ‘in(-1,1)# ‘not in(1,0)# ‘like 1# ‘REGEXP 1# ‘BETWEEN 1 AND 1# ‘div 1# ‘xor 1# ‘=round(0,1)=’1 ‘<>ifnull(1,2)=’1
3. 综合利用
false注入这种注入方式有的优势就是,在某些特定时候可以绕过WAF或者是一些其他的绕过。
这里举例一道题

我们注意到filter()函数
这里看起来过滤的比较多,其中and,or还有\&,|都被过滤了,这个时候就可以利用false进行盲注。
可以在show函数利用查询的时候注入,
这里官方给出的就是利用异或,其实这里并不需要’admin‘只要是一串字符串就可以
异或会使字符串都转为浮点型,都变为了0,由于0=0^0 -> 1^0 -> 1当然对于这个题并不一定利用这个,直接截取字符串作比较就可以,但是这里只是提供一种姿势,由于mysql的灵活,其花样也比较多还有就是构造的payload比较简短,例如’+’、’^’、’/4#这样只有三个字符便可以绕过登录,简单粗暴,还有就是类似的文章不多,许多开发人员容易忽视这些细节。
3.1. 结合盲注
上面的例子payload就是利用字符串类型转换导致false注入结合盲注的一个过程
二、一些注入的技巧
mysql中,我们用得到的:
1. 过滤的绕过:
不使用逗号:’ and substr(data from 1 for 1) = ‘a’#
2. 技巧
下面说几种不同情境的注入技巧
有时候我们可以利用一些逻辑语句进行注入例如在最近的0ctf上的Temmo’s Tiny Shop这个题中,我们在搜索的时候推测出语句是在like后的,就可以通过left来进行like盲注
在LIMIT后面可以跟两个函数,ProCEDURE 和 INTO,INTO是需要写的权限。
利用PROCEDURE 有两种方式,基于报错和时间的
基于报错:
基于时间:
2.3. Order by
order by 后的数字可以作为一个注入点。具体可以看这个文章MySQL Order By 注入总结
这里可以用一些判断和返回值进行利用,
还可以用rand函数
通常这里我们是不知道列名的,那可以通过报错进行利用
3. 有关函数
3.1. 不常用函数绕过滤
3.2. 搜索匹配类的函数
3.3. 使用函数进行字符串的切割
4. 关于php中md5的一个小技巧
PHP中这么一段sql语句
这里是可以注入绕过的,在php关于MD5函数的介绍说:
如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。
也就是找到一个字符串MD5的二进制恰好和字符编码中的某些编码对上了,就可以产生注入,原文作者找到这么一串字符串ffifdyop,md5加密后对应字符编码刚好是’or’ ,便产生注入。
这里的原文在这
三、END
false注入也许在某些时候会利用,但是对其中并不是很了解,所以在这里进行了一下系统地总结。
同时往往在利用的时候往往不只是一个点,要结合许多姿势。文章后半部分就是总结了一些注入小姿势,并不是很系统有些散,如果有错误欢迎大佬指出。
t-sql的关系运算符有哪些?
运算符是一些符号,它们能够用来执行算术运算、字符串连接、赋值以及在字段常量和变量之间进行比较。 在SQL Server 2005中,运算符主要有以下六大类:算术运算符、赋值运算符、位运算符、逻辑运算符以及字符串串联接运算符。 1 .算术运算符:可在两个表达式上执行数学运算,两个表达式可以是数字数据类型分类的任何数据类型。 包括: + , - , * , / 和取模( % )。 2 .赋值运算符:Transact - SQL中的运算符( = ),( = )还可以在列标题和为列定义值的表达式之间建立关系。 3 .位运算符:在整形数据或者二进制数据(image类型除外)之间执行位操作。 运算符 & (按位AND), | (按位OR), ^ (按位异或XOR)都是两上操作数。 4 .比较运算符:比较两个表达式的大小或是否相同,其比较的结果是布尔值,即:true(表达式结果为真)、false、以及unknown。 注: text , ntext ,image数据类型不可用。 5 .逻辑运算符:可把多个逻辑表达式连接起来。 包括AND,OR和NOT等运算符,返回带有true,false值和布尔数据类型。 6 .字符串串联运算符:用 + 加号进行字符串串联,例:语句SELECT tai + hang ,其结果为taihang。 运算符的优先级从高到低排列:1 .括号:( )2 .乘、除、求模运算符: * 、 / 、 %3 .加减运算符: + 、 -4 .比较运算符: = , > , < , >= , <= , <> , != , !> , !<5 .位运算符: ^ , & , |6 .逻辑运算符: NOT7 .逻辑运算符: AND8 .逻辑运算符: OR
如何防止sql注入
1.查看和修改等的权限分离2.过滤所有用户输入3.把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令4.用存储过程来执行所有的查询5.完善用户输入的的长度和类型等验证6.检查用户输入的合法性7.将用户登录名称、密码等数据加密保存
sql bit类型赋值
Bit 数据类型在 SQL Server 数据库中以存储 1、0 进行存储。 往数据库中添加,修改 bit 类型的字段时,只能用 0 或者 1。 关于修改 Bit 类型的字段 1.若使用 SQL 语句在查询分析器中进行修改,需要传入 1、0; 在SQL语句中也只能用 0 或者 1,比如 where sex=1 不能用 where sex=TURE。 2.若使用企业管理器直接在表中进行修改,需要使用 True、False; 使用 SqlDataReader 读出的 Bit 类型数据返回值为 bool 类型,若将返回结果关联到 GridView 中,那么此列下呈现的是复选框,复选框的 Checked 属性绑定 Bit 类型字段的返回值。
发表评论