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?