php代码审计——初次尝试
来源:互联网 发布:js 修改class 属性值 编辑:程序博客网 时间:2024/06/15 22:23
首次尝试PHP代码审计,不够完善,敬请指教。
原题如下:
<?php
show_source(__FILE__);
$flag = "xxxx";
if(isset($_GET['time'])){
if(!is_numeric($_GET['time'])){
echo 'The time must be number.';
}else if($_GET['time'] < 60 * 60 * 24 * 30 * 2){
echo 'This time is too short.';
}else if($_GET['time'] > 60 * 60 * 24 * 30 * 3){
echo 'This time is too long.';
}else{
sleep((int)$_GET['time']);
echo $flag;
}
echo '<hr>';
}
?>
解题:
1、相关知识:PHP弱类型、is_numeric()函数等。
2、分析:题中先使用is_numeric()判断time是数字还是数字字符串,然后判断是否在60*60*24*30*2~60*60*24*30*3之间,最后对time参数有一个sleep()延时函数,函数用了一个int类型的强制类型转换。要绕过的是时间大小的限制,因此通过计算得到限制的时间范围最小是5184000秒,转换成16进制就是0x4F1A00,于是传参time=0x4F1A00,通过了四次判断,GET获取值类型为字符串,最后sleep函数中进行类型转换的时候0x4F1A00,遇到字母就停止转换,变成了0,于是不能继续sleep,最后输出结果。
3、问题:is_numeric()中强制类型转换成int,不能正确转换的类型有十六进制型和部分科学计数法型字符串。
4、测试:
<?php
show_source(__FILE__);
$temp = $_POST['temp'];
echo (int)$temp;
?>
当传入参数为 0x6F1A00之类的十六进制型字符串和0e10之类的科学计数法型字符串时,会输出0;当传入参数6e10之类的科学计数法型字符串时,会输出6。
5、Payload:
(1)?time=0x6F1A00--十六进制
(2)?time=0e10--科学计数法
(3)?time=6e10--科学计数法
- php代码审计——初次尝试
- PHP代码审计
- php代码审计工具
- 【转】PHP代码审计
- php代码审计
- php代码审计
- PHP代码审计
- PHP代码审计之路——5.代码执行及一句话木马总结
- 黑马程序员——System.in.read()初次尝试
- Hybrid应用引擎AppCan学习笔记——初次尝试
- PHP代码审计学习总结
- php漏洞与代码审计
- php漏洞与代码审计
- php漏洞与代码审计
- php安全代码审计小结
- PHP代码审计学习总结
- PHP代码审计学习总结
- php安全代码审计小结
- 安装Ubuntu 16.04时卡住的那些坑
- 记录一下对TP的研究
- isset empty is_null
- stm32串口DMA方式发送数据
- Spark-2.2.0源码编译报错
- php代码审计——初次尝试
- 今天发现一个奇怪的js写法
- 学习java之后能做什么
- 专利申请--权利要求书vs说明书
- centos7—计划任务(at、cron)
- 在屏幕上输出以下图形 * *** ***** ******* ......
- 清理C盘旧驱动
- 字符串
- linux之rsync