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

天融信阿尔法实验室 李喆

有人说php是世界上最好的语言,这可能是对开发人员来说,确实有这方面的特点,因为它开发起来不像其他语言那样麻烦,就比如:弱类型,它不需要像java等语言那样明确定义数据类型。这给开发带来了很大的便利,所有的数据类型都可以用$xx来定义,而不需要int i,string a,fload b等等这样去定义它。这样确实很方便,因为php帮助你判断了数据类型,比如整形int ,你只要$a=1;那这个1就是整形,$a=’abc’那这个abc就会被php判断为字符串类型。但是弱类型方便是方便,但是带来的安全问题也是巨大的,很多的php安全漏洞都是因为它带来的。

本文是给做代码审计漏洞挖掘和渗透测试人员总结的一个思路,有不对的地方请多多指出。

这里主要是介绍如何通过利用弱类型来做php代码审计的漏洞挖掘。漏洞挖掘关键点肯定在变量上,因为变量可以承接外来参数和内部数据的交互工作,这是漏洞的起因,也是必要条件。如果外来参数是恶意代码,同时再因为使用了弱类型的函数或者比较运算符导致了恶意参数的数据进入了程序里比如数据库,就可能引发想象不到的破坏力。这里我介绍了三种可以导致恶意数据进入判断体里的函数和比较运算符,他们有共同的特点,就是和数据比较,然后把外来变量做自动类型转换,如果外来变量是恶意变量,利用一定的方法就可以绕过你想绕过的地方比如判断if条件,让恶意变量进入到条件体内,恶意变量如果在判断体内被代入到了数据库的增删改查操作中就可以引发sql注入等漏洞问题。

01第一个要介绍的是 is_numeric,它的功能是,判断参数是否为数字或者数字字符串,如果是则返回true,假返回false,它的弱类型问题是他支持十六进制0x格式,如何引发的安全问题让我们继续观看。

安全问题描述:is_numeric在做判断时候,如果攻击者把payload改成二进制0x..,is_numeric会先对十六进制做类型判断,十六进制被判断为数字型,为真,就进入了条件语句,如果再把这个代入进入sql语句进入mysql数据库,mysql数据库会对hex进行解析成字符串存入到数据库中,如果这个字段再被取出来二次利用,就可能因为二次注入漏洞.比如这样:

if(is_numeric($_GET['num']))

{

echo $_GET['num'];

echo “”;

//假设这个插入进了mysql数据库,mysql数据库就会把十六进制转换成了字符串,这里为了方便用 Hex2String 函数代替

echo Hex2String($_GET['num']);

//输入http://127.0.01/equal.php?num=0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729

// 输出0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f2121272

//输出9999999999999 union all (select ‘Hello!!’)

}

function Hex2String($hex){

$string=”;

for ($i=0; $i < strlen($hex)-1; $i+=2){

$string .= chr(hexdec($hex[$i].$hex[$i+1]));

}

return $string;

}

可以看到,数据库存入的是 9999999999999 union all (select ‘Hello!!’) ,如果被取出来再输出没做过滤就会引发二次注入

防御方法:用intval函数获取变量整数值,对从数据库取出变量做过滤

上面的不理解,可以看一个案例分析:

这里有个例子:

956be69762f765b3cdea6f1b7d36958b.png

图1.1

问题出现在if (!isset($_POST['id'], $_POST['vote']) || !is_numeric($_POST['id'])) 如果能绕过is_numeric,就可以执行mysql_query(“INSERT INTO vote VALUES ({$id}, {$vote}, ‘{$login}’)”); 注入sql语句。

999999999999 union all \(select ‘Hello!!’\)

转成 hex=0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729

我们提交的参数:

vote=1&submit=&id=0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729

498234b980a6b0958e2a84400f992b83.png

图1.2

我们可以清楚的在图片里看到,我们插入的Hello!在其他查询位置被显示了出来,引发了二次注入漏洞问题。

02 第二个介绍的是比较运算符的安全隐患,比如 ==,!= ,同时还会介绍他们和恒等式和=== ,!==的区别和安全问题

函数功能:

==和!=是比较运算符号 不会检查条件式的表达式的类型

安全问题描述:php是弱类型,在做匹配和比较时候,会根据匹配的类型做类型转换,如果后面是整形,如$a==1,因为后面的1是整形,那前面gpc传进来就会转换成整形,转换规则是前面的数字不变后面字母被当成字符型舍去,也就是1a会变成1,判断为真进入判断体;如果这样$a==”1″,那么后面的就是字符串1,如果gpc传进来1a会发现为假,因为传进来的1a做类型转换成字符串后就是1a,字符串1a和字符串1不想等,所以为假,这时候要改成1才能进入判断体内;同样在进行加减乘除比较运算判断时候也会做自动类型转换,如果跟整形比较,1a会转换成1,跟字符串比较,a1就会转换成字符串a1,其他类型也一样。

如果你觉得这样很绕看不懂,那就简单说,如果和字符串做比较,就会转换成字符串,如果和整形做比较,就会自动转换成整形,只不过整形自动转换的时候php就是用的intval 函数导致1a为1。intval函数可以自查下,大致如:intval(“a”)=0; intval(12.3223)=12; intval(“12abc”)=12;

比如:

$a = $_GET['a'];

if ($a==1)

{

echo ‘vul->’.$a;

}

09e8993a5d2ea3886d5d92bd55301d2e.png

同样!=也会有这个问题,换成2就可以进到判断体内

$a = $_GET['a'];

if ($a!=1)

{

echo ‘vul->’.$a;

}

3dbdfb1566edf7b64e803e03cb3c04b8.png

防范方法:用===和!==来做判断,他们是恒等计算符, 同时检查表达式的值与类型

跟数字有关的运算都可能引起弱类型漏洞,比如下面这个运算

但是这样也不完全可以,比如加减乘除运算符也会做类型转换

假如这样:

$a = $_GET['a'];

$b = $_GET['b'];

if($a+$b===2)

{

echo “vul->”.$a.””.$b;

}

6837016b5d1186ca56b9413fc0337c60.png

所以最安全的防范是对gpc获取数字型的参数值进行intval强制类型转换或者过滤,再做判断

$a = intval($_GET['a']);

$b = intval($_GET['b']);

if($a+$b===2)

{

echo “vul->”.$a.””.$b;

}

a4583d80452c932aeb3a86f2d6953a8a.png

03 第三个要就介绍的是in_array()函数

函数功能:判断一个值是否在数组中存在

安全问题描述:这个函数的弱类型问题是,判断的值在比较之前会做类型转换,同样是弱类型问题,比如in_array($_GET['id'],array(1,2,3,4,5)),如果我们传入 id=1’ union select… ,判断就会为真,因为id被转换成1,这时候假如我们再把$_GET['id']拼接到数据库语句中,就会引起sql注入漏 洞。

if(in_array($_GET['id'],array(1,2,3,4,5)))

{

echo $_GET['id'];

//输入http://127.0.01/equal.php?id=1′id

//输出: 1′id

}

防范方法:外来变量要做过滤,或者强制类型转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大学计算机基础python第二次作业_第二次python作业-titanic数据练习

原博文 2019-10-14 14:45 − 一、读入titanic.xlsx文件&#xff0c;按照教材示例步骤&#xff0c;完成数据清洗。 titanic数据集包含11个特征&#xff0c;分别是&#xff1a; Survived:0代表死亡&#xff0c;1代表存活Pclass:乘客所持票类&#xff0c;有三种值(1,2,3)Name:乘客…

微小宝公众号排行榜_榜单 广东省技工院校微信公众号排行榜(第51期)

▼2020年10月榜单出炉&#xff01;本期榜单最大看点&#xff0c;莫过于发文33篇的劳模代表——“广东高新技术高级技校”以高达830.49的微信传播指数WCI&#xff0c;荣登第51期广东省技工院校微信公众号排行榜榜首&#xff01;截至本期&#xff0c;实力一向强劲的“广东高新技术…

python 读取excel表格_python 对Excel表格的读取

importxlrd flbrd "D:\\考勤系统.xlsx"wsxlrd.open_workbook(flbrd)#获取所有sheet名字&#xff1a;ws.sheet_names&#xff08;&#xff09; print(获取所有sheet名字,ws.sheet_names())#获取sheet数量&#xff1a;ws.nsheets print(获取所有sheet对象,ws.nsheets)#…

matlab相机标定 外参数,相机外参数的标定.doc

相机外参数的标定本 科 毕 业 设 计 (论 文)题 目 __________________________________指导教师__________________________辅导教师__________________________学生姓名__________________________学生学号_________________________________________________________院(部)__…

word公式编辑器_【Word技巧】word使用终极技巧,工程人必会(四)

1、问&#xff1a;Word中怎么在一个英文字母上打对号&#xff1f;答&#xff1a;透明方式插入图片对象&#xff0c;内容是一个√2、问&#xff1a;Word里怎么显示修订文档的状态&#xff1f;文档修订后&#xff0c;改后标记很多&#xff0c;但是在菜单里没有“显示修订最终状态…

python pip install pil_解决python的pip install PIL失败问题

标签&#xff1a; 安装PIL的时候遇到个问题&#xff0c; pip install PIL Downloading/unpacking PIL Could not find any downloads that satisfy the requirement PIL Some externally hosted files were ignored (use --allow-external PIL to allow). Cleaning up... No di…

加载oracle属性文件,关于属性文件的详细介绍

我们通常会将Java应用的配置参数保存在属性文件中&#xff0c;Java应用的属性文件可以是一个正常的基于key-value对,以properties为扩展名的文件&#xff0c;也可以是XML文件. 在本案例中&#xff0c;將会向大家介绍如何通过Java程序输出这两种格式的属性文件&#xff0c;并介绍…

android 访问服务器sql_XSS 攻击、CSRF 攻击、SQL 注入、流量劫持(DNS 劫持、HTTP 劫持)—— 浏览器安全

今天看了 jsliang 大佬关于网络安全的文章&#xff0c;为了加深一下印象&#xff0c;自己动手写一下。 主要参考文章&#xff1a;网络安全 ——— jsliang XSS攻击 XSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击&#xff0c;指的是向网页注入恶意代码&#xff0c;…

python3 class init_python3 module中__init__.py的需要注意的地方

网上关于__init__.py的作用的资料到处都是&#xff0c;我在此就不再啰嗦哪些了。若有需要、请各位看官去搜搜即可。最近刚开始用Python3 就遇到了这个比较有意思的事情闲言少叙&#xff0c;下面要介绍的是python3中__init__.py中的一些略微不同的地方目录结构如下&#xff1a;├…

simulink和psim仿真结果不同_在HFSS进行AC耦合电容仿真优化怎么做?

AC耦合电容&#xff0c;也叫DC blocking隔直电容&#xff0c;在几乎所有的高速串行链路中&#xff0c;都可以看到它的身影&#xff0c;它的主要作用是去掉信号中的直流偏置分量&#xff0c;同时让高频分量可以顺利通过&#xff0c;类似于一个高宽带的滤波器。由于电容的焊盘通常…

民生银行 一码付 php,PHP开心码支付免签约第四方支付平台源码修复版

源码说明后台号码admin后台密码123456声明&#xff1a;该源码仅供学习出现&#xff0c;修复者不承担任何责任&#xff0c;下载安装即代表使用者自行承担责任源码安装方法需要服务器开启g11插件PHP5.6&#xff0c;主机用户推荐95云主机&#xff0c;因为已经开启所有扩展插件必须…

oracle主从表分离怎么实时更新数据_高可用数据库UDB主从复制延时的解决

MySQL主从复制的延时一直是业界困扰已久的问题。延时的出现会降低主从读写分离的价值&#xff0c;不利于数据实时性较高的业务使用MySQL。UDB是UCloud推出的云数据库服务&#xff0c;上线已达六年&#xff0c;运营了数以万计的UDB MySQL实例。除了提供高可用、高性能、便捷易用…

vp翻N_VP刀叨叨:如何让G胖给你唱生日歌

VS看起来好凶喵▼ESL欧洲&独联体区VP发推庆祝击败OG昨晚第九个比赛日&#xff0c;OG与VP的比赛无疑是大家关注的焦点&#xff0c;一边是TI双冠王&#xff0c;一边是状态开始回升的俄罗斯毛熊&#xff0c;大家都很期待他们能给我们带来精彩的比赛。不过比赛结果却出乎了不少…

秒后面的单位是什么_为什么兰州马拉松很难跑出好成绩?

如果要评选中国最难PB的马拉松&#xff0c;西北第一马兰州马拉松当之无愧可以排名第一。为什么这么说呢&#xff1f;先来看下今年兰马的一组数据&#xff0c;不管是精英选手还是大众选手&#xff0c;成绩都要比个人PB慢。国内男子冠军是管油胜&#xff0c;成绩为2小时18分58秒&…

surface php老是用不了,surface pro7触摸屏没反应怎么办

发生该问题的原因可能是&#xff1a;有很多可能原因&#xff0c;从校准到硬件或者固件。故障排查可以找到根本原因。1. 清洁屏幕将柔软的无绒布蘸上水或眼镜清洗液来清洁屏幕&#xff0c;但不要直接在屏幕上喷洒液体。2. 重启 Surface注意&#xff1a;你将需要连接键盘或鼠标到…

小优优(u盘歌曲顺序调整)_电脑从U盘启动,这三种方式你知道吗?

Windows 可以运行在数千台不同配置的电脑上, 但安装 Windows 10又是另一回事, 具体取决于你的电脑是否安装了现有的 Windows 10,以及早期版本,像是 Windows7, Windows XP, 或完全不同的操作系统(如 macOS 或 Linux)。大多数情况, 安装系统都依赖于主硬盘HDD或SSD以外的设备启动…

unity vs没有智能提示_Unity博主营地你不可不知的Unity C#代码小技巧

「Unity博主营地第一期」于2019年11月开启&#xff0c;现已收到数百篇原创投稿。每周根据Unity Connect社区反馈&#xff0c;帮助大家发现最优质、最干货、最受欢迎的博文作品。开门见山的说&#xff0c;这篇文章干到挤不出一点水分。文章主要针对Unity初学者&#xff0c;相信读…

oracle insert忽略重复数据,Oracle’INSERT ALL’忽略重复项

我有一个具有唯一约束的数据库表(唯一的(DADSNBR, DAROLEID)对)。 我将同时向该表中插入多个值&#xff0c;因此我想使用一个查询来完成它-我假设这将是更快的方法。 因此&#xff0c;我的查询是&#xff1a;INSERT ALLINTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 1)INTO ACC…

python炼丹师是什么_2021年编程语言趋势预测:Python和JavaScript仍火热,Go不可小觑...

编译 | 陈大鑫Tensorflow和Pytorch到底该用哪个呢&#xff1f;“import tensorflow as pytorch!”编程语言及框架似乎总是被人拿来比较&#xff0c;这里我们只谈语言。作为开发人员&#xff0c;在当今这个技术更迭飞快的时代要连年吃香并非易事&#xff0c;很多十年开发经验以上…

python123数值运算_python123中 Hello World的条件输出 和数值运算

描述 获得用户输入的一个整数&#xff0c;参考该整数值&#xff0c;打印输出"Hello World"&#xff0c;要求&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪…