2.21.6 is_numeric

is_numeric()

is_numeric()函数语法:

is_numeric — 检测变量是否为数字或数字字符串 

bool is_numeric( mixed $var)

如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE

示例代码

<?php
$a= '23333333abc';
if(is_numeric($a)){
    echo "6";
}else{
    echo "flase";
}
if($a>1000){
    echo "666";
}

?>

因为在php中如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行,所以就绕过了is_numeric()函数。

我们下面来看一下is_numeric()函数造成的sql注入问题。

示例代码如下:

这个代码的逻辑其实很简单,接收user的值,判断是否为数字,若为数字,则带入到数据库进行查询,否则不查询。

那么我们再来看下数据库的结构:

可是我们的username是一个字符型,但是参数又只能为数字型,理论上来说是没有办法进行注入的 。

但是在is_numeric()函数中,不仅仅是十进制的数字,如:

我们可以看到,它是支持是hex编码的,同样,mysql也支持hex编码,所以这里就就导致我们可以使用hex进行注入,如:

admin=0x61646d696e

则:

我们来看一个二次注入的例子:

示例代码:

这段代码实现对max(user_id)行的用户名实现十六进制playload的写入,然后,通过select语句又将写入的十六进制playload查询出来,从而实现了二次注入。

PHPYun二次注入.

问题代码如下:

多个数据表模型都用到了这个函数,基本都是Update操作。现在的思路是利用接口将恶意代码Update进数据库,再通过其他接口,从数据库读恶意数据,在再次存到数据库的时候,进行注入

从DB层(friend.model.php)可以找到GetFriendInfo():

跟进member_log函数:

跟进DB_insert_once函数:

先尝试通过hex编码写入测试信息,如图所示 。刷新后,成功写入! http://127.0.0.1/phpyun0625/friend/index.php?c=info

测试二次注入的接口,在DB_insert_once()打印SQL语句 http://127.0.0.1/phpyun0625/ask/index.php?c=friend&a=atnuser POST: id=2 返回结果如下:

php比较

php在转码时会把16进制转化为十进制

首先分析代码,函数要求变量$temp不能存在1~9之间的数字, 最后,又要求$temp=3735929054;利用php在转码时会把16进制转化为十进制.于是把 3735929054转换成16进制为0xdeadc0de,记得带上0x; 构造payload

?password=0xdeadc0de

Last updated

Was this helpful?