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. html页面高度不同浏览器兼容性设置

    页面需要嵌套在跨域的iframe中,而页面高度不固定,需要每个页面把自己的高度获得后,通过js通知iframe调整显示. 而页面在获得自己的高度时,发现总是比预想的大.经过参考别人的博客,发现原来是w ...

  2. bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link

    2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 255  Solved: 77[Submit][Status] ...

  3. OA学习笔记-005-Spring2.5与struts2.1整合

    一.单独测试strust 1.action package cn.itcast.oa.test; import org.springframework.context.annotation.Scope ...

  4. Android 颜色Color

    Android中使用4个数字来表示颜色,分别是alpha.红(red).绿(green).蓝(blue)四个颜色值(ARGB).每个数字取值0-255,因此一个颜色可以用一个整数来表示.为了运行效率, ...

  5. GDI+编程说明及小结

    原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...

  6. 【CF】283D Tennis Game

    枚举t加二分判断当前t是否可行,同时求出s.注意不能说|a[n]| <= |3-a[n]|就证明无解,开始就是wa在这儿了.可以简单想象成每当a[n]赢的时候,两人都打的难解难分(仅多赢一轮): ...

  7. POJ_3616_Milking_Time_(动态规划)

    描述 http://poj.org/problem?id=3616 给奶牛挤奶,共m次可以挤,给出每次开始挤奶的时间st,结束挤奶的时间ed,还有挤奶的量ef,每次挤完奶要休息r时间,问最大挤奶量. ...

  8. BZOJ3156: 防御准备

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 442  Solved: 210[Submit][Status] Descript ...

  9. 使用 Puppet 在 Windows Azure 中配备 Linux 和 Windows 环境

     发布于 2013-12-11 作者 Ross Gardler 微软开放技术有限公司 (MS Open Tech) 很高兴地宣布发行新的 Windows Azure Puppet 模块.通过这个模 ...

  10. OA的一些概念

    今天的主题是OA的一些概念. 先来一段百度百科的定义: 办公自动化(Office Automation,简称OA)是将现代化办公和计算机网络功能结合起来的一种新型的办公方式. OA的目的是:通过实现办 ...