开发者社区> bypass> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

PHP代码审计笔记--弱类型存在的安全问题

简介: 0x01 前言   PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型。   弱类型比较,是一个比较蛋疼的问题,如左侧为字符串,右侧为一个整数,只不过左侧与右侧内容完全相等。
+关注继续查看

0x01 前言 

 PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型。

  弱类型比较,是一个比较蛋疼的问题,如左侧为字符串,右侧为一个整数,只不过左侧与右侧内容完全相等。

<?php
var_dump(null ==false);  //bool(true) 
var_dump('aa'==0);         //bool(true) 
?>

0x02 Magic Hash

  PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,在进行比较运算时,如果遇到了 0e\d+ 这种字符串,就会将这种字符串解析为科学计数法。所以上面例子中 2 个数的值都是 0 因而就相等了。如果不满足 0e\d+ 这种模式就不会相等。

"0e132456789"=="0e7124511451155" //true
"0e123456abc"=="0e1dddada" //false
"0e1abc"=="0"  //true

参考链接:http://www.freebuf.com/news/67007.html   http://www.cnblogs.com/Primzahl/p/6018158.html

常见的payload:

0x01 md5(str)
    QNKCDZO
    240610708
    s878926199a
    s155964671a
    s214587387a
    s214587387a
0x02 sha1(str)
    sha1('aaroZmOk')  
    sha1('aaK1STfY')
    sha1('aaO8zKZF')
    sha1('aa3OFF9m')

MD5不能处理数组,若有以下判断则可用数组绕过:

if(@md5($_GET['a']) == @md5($_GET['b']))
{
    echo "yes";
}
//http://127.0.0.1/test.php?a[]=1&b[]=2
//$_GET: array(2) { ["a"]=> array(1) { [0]=> string(1) "1" } ["b"]=> array(1) { [0]=> string(1) "2" } }

 0x03 弱类型函数

通过利用弱类型进行数据比较,外来变量自动类型转换,导致恶意数据进入到条件体内,可能存在极大的安全风险。

下面开始介绍几个弱类型的函数:

【is_numeric()】

  is_numeric() 检测变量是否为数字或数字字符串。如果 是数字和数字字符串则返回 TRUE,否则返回 FALSE。

  它的弱类型问题是他支持十六进制0x格式,攻击者把payload改成十六进制0x,is_numeric会先对十六进制做类型判断,十六进制被判断为数字型,为真,就进入了条件语句,如果再把这个代入进入sql语句进入mysql数据库,mysql数据库会对hex进行解析成字符串存入到数据库中,如果这个字段再被取出来二次利用,就可能导致二次注入、XSS等安全漏洞。

<?php
$type= is_numeric($_GET['id'])?$_GET['id']:0; 
$sql="insert into test(id,type)values(1,$type);";
echo $sql;
?> 

把‘1 or 1’ 转换为16进制 0x31206f722031 为参数的值,带数据库执行,查询结果:

如果再重新查询这个表的字段出来,不做过滤带入另一个SQL语句,将会造成二次注入。

【in_array()】

  in_array() 函数搜索数组中是否存在指定的值。

<?php
if (in_array($_GET['id'],array(1,2,3,4)))
{
    $sql="select * from admin where id ='".$_GET['id']."'";
}
echo $sql;
?> 
//提交:?id=1' union select 1,2,3,4%23
//结果:select * from admin where id ='1' union select 1,2,3,4#' 

in_attay()函数做比较之前,自动做类型转换,从而匹配成功,绕过检查。

 【strcmp()】

  strcmp() 函数比较两个字符串,如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

  先将两个参数先转换成string类型

  当比较数组和字符串的时候,返回是0

  如果参数不是string类型,直接return

<?php
    $id=$_GET['id'];
    if (strcmp('test',$id)) {
     echo 'YES!';
    } else{
        echo 'NO!';
    }
?>
//提交:?id[]=
//结果:YES

 类似这样的函数还有switch()

 参考文章:

php代码审计之弱类型引发的灾难

http://blog.topsec.com.cn/ad_lab/php%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E4%B9%8B%E5%BC%B1%E7%B1%BB%E5%9E%8B%E5%BC%95%E5%8F%91%E7%9A%84%E7%81%BE%E9%9A%BE/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PHP学习笔记3-表单
PHP 表单处理 PHP 超全局变量 $_GET 和 $_POST 用于收集表单数据(form-data) 一个简单的 HTML 表单 &lt;html&gt; &lt;body&gt; &lt;form action="welcome.php" method="post"&gt; Name: &lt;input type="text" name="name"&
1735 0
阿里云一键部署LNMP(Linux+Nginx+MySQL+PHP)栈
LNMP代表Linux+Nginx+MySQL+PHP网站服务器架构。通过ROS资源编排可以阿里云上一键部署LNMP栈。
11567 0
centos下 Apache、php、mysql默认安装路径
apache: 如果采用RPM包安装,安装路径应在 /etc/httpd目录下 apache配置文件:/etc/httpd/conf/httpd.conf Apache模块路径:/usr/sbin/apachectl web目录:/var/www/html 如果采用源代码安装,一般默认安装在/usr/local/apache2目录下 php: 如果采用RPM包安装,安装路
3019 0
php+apache+mysql+phpMyadmin
Apache安装:tar zxvf httpd-2.2.22.tar.gzcd httpd-2.2.22./configure --prefix=/usr/local/apache --enable-deflate --enable-headers  --enable-so --en...
752 0
MYSQL老密码与php版本扩展关系
mysql的用户密码保存在数据库中是加密的。不可逆的。当需要创建一个新的帐号,如果是使用insert插入一条记录,mysql提供了一个函数PASSWORD(),对明文进行加密。所以有如下sql:insert into mysql.user values('帐号名',PASSWORD('设置的帐号密码'));但是,mysql4.1版本之前有些不同。
1179 0
php mysql 配置
引用:http://www.phpwind.net/read-htm-tid-79533.html php用比较成熟和稳定的php4.3.9下载地址:http://bbs.uushop.net/read.php?fid=3&tid=158361mysql4.0.24下载地址:http://www.uushop.net/book/mysql4.rarzend下载地址见本帖附件phpmyadmin下载地址http://down.chinaz.com/s/5637.aspPHP加速软件eaccelerator 下载地址见本帖附件好,工具准备完毕,下面开始我们的配置环境。
1316 0
Apache+php+mysql在windows下的安装与配置图解
先准备好软件: Apache官方下载地址:apache_2.0.55-win32-x86-no_ssl.msi,更多版本在这里; php官方下载地址:php-5.0.5-Win32.zip,更多镜像下载地址,更多版本下载; mysql官方下载地址:mysql-4.1.14-win32.zip,更多镜像下载地址,更多版本下载。
1083 0
Ubuntu 配置Apache+PHP+MySQL
1.安装apache2.0 sudo apt-get install apache2 2.安装PHP 依次在终端打开: sudo apt-get install php5 //安装PHP5 sudo apt-get install libapache2-mod-php5 //配置APACHE+PHP sudo /etc/init.
832 0
+关注
bypass
一个网络安全爱好者
111
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载