is_numeric漏洞分析
2014年,PHP中is_numeric函数十六进制绕过漏洞引发了一次安全问题
接下来,我们来分析一下这个漏洞的原理
函数介绍:
is_numeric — 检测变量是否为数字或数字字符串。
函数原型:
bool is_numeric ( mixed $var )
如果 var 是数字或数字字符串则返回 TRUE,否则返回 FALSE。
举例说明:
例程1:
<?php
$v = is_numeric ('58635272821786587286382824657568871098287278276543219876543') ? true : false;
var_dump ($v);
?>
运行输出:bool(true)
说明:这个参数是数字或数字字符串
变换参数继续测试
如果参数是:0xFFFF,运行结果又会怎样呢?
<?php
$v = is_numeric ('0xFFFF') ? true : false;
var_dump ($v);
?>
输出结果:bool(true)
说明他已经把0x这种十六进制的数忽略了,或者转换成了其他进制的数(注:其他进制的数都是数字或数字字符串,唯有十六进制有个x不是数字,八进制的表示是以0开始的,而非o),不信的话可以自己算算:
所以,这个地方,is_numeric函数的参数是十六进制的,也可以完美执行。
在渗透测试的时候,如果我们提交:1 or 1作为该函数参数的一部分,那么这个函数肯定是不会接受的,为什么,因为他不是数字或数字字符串,就这么简单,如果,我们将1 or 1转换成十六进制呢?
1 or 1 对应的十六进制数为:0x31206f722031
怎么转换来的,可以百度下:ASCII码表
1:0x31
:0x20
o:0x6f
r:0x72
合理连接起来不就是0x31206f722031了吗
在这里,推荐小葵写的一个编码与解码的小工具:
在此,我们可以测试一下,看0x31206f722031是不是数字或数字字符串
<?php
$v = is_numeric ('0x31206f722031') ? true : false;
var_dump ($v);
?>
输出结果:bool(true)
说明:0x31206f722031是数字或数字字符串。
那又怎样,此时,我们就可以通过这个函数实现SQL注入了
注入测试代码1:
<?php
$conn = mysql_connect('127.0.0.1','root','root');
mysql_select_db('dvwa',$conn);
$user = addslashes($_GET['user']);
$flag = is_numeric ($user) ? true : false;
if($flag)
{
$sql = "SELECT user_id,user,password FROM users WHERE user=$user";
$res = mysql_query($sql);
if($res)
{
while($row = mysql_fetch_array($res))
{
var_dump($row);
}
}
else
{
echo '----------数据库没有符合此条件的用户记录----------';
echo '<br />';
}
}
else
{
var_dump ($flag);
}
?>
Firefox输入:http://localhost:81/is_numeric.php?user=0x61646D696E
0x61646D696E 对应的ASCII字符就是:admin
运行结果:
array(6) { [0]=> string(1) "1" ["user_id"]=> string(1) "1" [1]=> string(5) "admin" ["user"]=> string(5) "admin" [2]=> string(32) "5f4dcc3b5aa765d61d8327deb882cf99" ["password"]=> string(32) "5f4dcc3b5aa765d61d8327deb882cf99" }
这还不算啥,接下来,我们来看一下关于这个漏洞的二次注入
注入测试代码2(二次注入):
<?php
$conn = mysql_connect('127.0.0.1','root','root');
mysql_select_db('dvwa',$conn);
$user = addslashes($_GET['user']);
$flag = is_numeric ($user) ? true : false;
if($flag)
{
//保存最大user_id
$max_id;
//保存导出的playload
$playload;
//查出数据库中最大的user_id
$query_max_id = "select max(user_id) from users";
$res = mysql_query($query_max_id);
if($res)
{
$rows = mysql_fetch_array($res);
$max_id = $rows['user_id'];
//echo $max_id;
echo '----------max_id查询成功----------';
}
else
{
echo '----------max_id查询失败----------';
}
//更新最大user_id行的用户名
$gx = "update users set user=$user where user_id=$max_id";
$res = mysql_query($gx);
if($res)
{
echo '----------用户数据更新成功----------';
echo '----------插入十六进制成功----------';
}
else
{
echo '----------用户数据更新失败----------';
echo '----------插入十六进制未成功----------';
}
//导出插入的playload
$playload = "SELECT user FROM users WHERE user_id=$max_id";
$res = mysql_query($playload);
if($res)
{
$rows = mysql_fetch_array($res);
$playload = $rows['user'];
echo '----------playload成功导出----------';
}
else
{
echo '----------playload导出失败----------';
}
//将导出的playload拼接到select语句中执行
$play = "SELECT user_id,user,password FROM users WHERE user=$playload";
$res = mysql_query($play);
if($res)
{
$row = mysql_fetch_array($res);
var_dump($row);
echo '----------注入已成功----------';
}
else
{
echo '----------注入未成功----------';
}
}
else
{
echo '----------输入数据不是数字或者数字字符串----------';
}
?>
这段代码实现对max(user_id)行的用户名实现十六进制playload的写入,然后,通过select语句又将写入的十六进制playload查询出来,从而实现了二次注入。
is_numeric漏洞分析的更多相关文章
- YxCMS 1.4.7 最新版漏洞分析
i春秋作家:F0rmat 原文来自:YxCMS 1.4.7 最新版漏洞分析 0x01前言 很感谢关注我专辑的表哥,我会坚持写下去的,最近会慢一点,一月四篇是正常的. 在先知看到的,大部分都是后台漏洞, ...
- 「白帽挖洞技能」YxCMS 1.4.7 漏洞分析
这几天有小伙伴留言给我们,想看一些关于后台的漏洞分析,今天i春秋选择YxCMS 1.4.7版本,理论内容结合实际案例进行深度分析,帮助大家提升挖洞技能. 注:篇幅较长,阅读用时约7分钟. YXcms是 ...
- Zabbix 漏洞分析
之前看到Zabbix 出现SQL注入漏洞,自己来尝试分析. PS:我没找到3.0.3版本的 Zabbix ,暂用的是zabbix 2.2.0版本,如果有问题,请大牛指点. 0x00 Zabbix简介 ...
- PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...
- CVE-2016-0143 漏洞分析(2016.4)
CVE-2016-0143漏洞分析 0x00 背景 4月20日,Nils Sommer在exploitdb上爆出了一枚新的Windows内核漏洞PoC.该漏洞影响所有版本的Windows操作系统,攻击 ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- CVE-2014-1767 漏洞分析(2015.1)
CVE-2014-1767 漏洞分析 1. 简介 该漏洞是由于Windows的afd.sys驱动在对系统内存的管理操作中,存在着悬垂指针的问题.在特定情况下攻击者可以通过该悬垂指针造成内存的doubl ...
- CVE-2014-4115漏洞分析(2014.11)
CVE-2014-4115漏洞分析 一.简介 该漏洞是由于Windows的Fastfat.sys组件在处理FAT32格式的硬盘分区存在问题.攻击者利用成功可导致权限提升. 影响的系统包括: Windo ...
- FFmpeg任意文件读取漏洞分析
这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...
随机推荐
- python,django,mysql版本号查询
1. ubuntu 下如何查询子集的mysql版本: 方法一: 登录子集的mysql之后就会显示mysql版本: ***:~$ mysql -u root -p Enter password: Wel ...
- 在PYTHON中,用cx_Oracle连接ORACLE数据库简单示例
一,在安装的时候,参数有点不一样: python setup.py build install 二,连接数据库,有两种方式,DSN和TNSNAMES方式: #dsn = orcl.makedsn(se ...
- 【20161030la 】总结
就写个题解 1. 生成树(Tree) 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些 ...
- USB Type-C“三剑客”: 连接器、控制器和电缆
USB Type-C™是最新的有关电缆布线的USB连接器标准.您会看到,从笔记本电脑.智能手机.闪存到视频系统,这些设备上有一个小型可逆的Type-C连接器.由于Type-C电缆既可以给主机和设备提供 ...
- 子查询解嵌套in改写为exists
SELECT * FROM (SELECT pubformdat0_.id id332_, pubformdat0_.domain_id domain2_332_, pubformdat0_.proc ...
- 转载:MyEclipse中防止代码格式化时出现换行的情况的设置
转载出处:http://www.cnblogs.com/yjhrem/articles/2310013.html 编辑完成代码,用MyEclipse的代码格式化后,本来不长的代码也被自动转成了多行. ...
- 安卓高手之路之java层Binder
很多人一提到Binder就说代理模式,人云亦云的多,能理解精髓的少. 本篇文章就从设计角度分析一下java层BInder的设计目标,以及设计思路,设计缺陷,从而驾驭它. 对于[邦德儿]的理解, 从通信 ...
- JavaScript日期时间操作
<script> var d=new Date();//当前时间 alert(d); var d1=new Date(1992,5,19);//定义一个时间,月份要加1; alert(d1 ...
- bzoj2754
看到这道题一开始想到的是后缀数组+二分+rmq 类似bzoj3172 问每个串i在合并后的串出现了多少次 等价于有多少个后缀j,使得LCP(i,j)>=length(s[i]) 但是想想又不对, ...
- JSONP跨域的原理解析(转)
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略). ...