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. hdu 4433

    一道dp题,虽然知道是dp,但是不会做: 学习了ACM_cxlove大神的代码,终于明白了: 搬运工: dp[i][j][k]表示 前i个已经完全匹配,而这时候,第i+1个已经加了j位,第i+2位已经 ...

  2. Django自定义上传目录

    由于数据库的upload_to功能,有时不能满足每次上传灵活自定义的需求, 基于DEF的上传,有时不能满足基于CLASS的视图要求, 于是,只好慢慢用土法实现. 当然,首先,要使用上传功能时,form ...

  3. unicode转中文

    <pre name="code" class="html">[root@dr-mysql01 ~]# cat a1.pl my $str=" ...

  4. 老的acm & oj学习站点

    1.网易小鱼博客 http://gisyhy.blog.163.com/blog/#m=0&t=1&c=fks_087069086082087064085081082095085084 ...

  5. Eclipse超级完美汉化教程

    转自:http://jingyan.baidu.com/article/e75057f28401a8ebc91a899e.html 是中国人都喜欢汉化的东西,除非你想挑战英文,抑或你就是英语高手.百度 ...

  6. Json数据异步绑定到界面的Table并且自动刷新

    转自:http://blog.csdn.net/jianxin1009/article/details/8565828‘ 做Winform习惯了,大家都习惯设置datasource这样的写法. 如果想 ...

  7. (转载)JavaScript中的Window窗口对象

    (转载)http://www.ijavascript.cn/jiaocheng/javascript-window-65.html 例子: <html> <head> < ...

  8. SQL Server 2005 To Oracle

    近期因为项目需要,将SQLServer2005转成Oracle 在这里介绍下转换步骤: 1. 准备好你要转换的数据,如图 2. 右键单击 任务/导出数据,如图 3. 执行完之后就打开选择数据源页面,填 ...

  9. Bootstrap+MetroNic_1.5.4 Head meta

    Bootstrap+MetroNic_1.5.4 HTML <meta> 标签设定含义: <meta http-equiv="X-UA-Compatible" c ...

  10. UVA 3890 Most Distant Point from the Sea(二分法+半平面交)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11358 [思路] 二分法+半平面交 二分与海边的的距离,由法向量可 ...