Loading [MathJax]/jax/input/TeX/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PHP代码审计01之in_array()函数缺陷

PHP代码审计01之in_array()函数缺陷

作者头像
雪痕@
发布于 2020-09-27 02:33:41
发布于 2020-09-27 02:33:41
1.8K00
代码可运行
举报
文章被收录于专栏:代码审计代码审计
运行总次数:0
代码可运行

前言

从今天起,结合红日安全写的文章,开始学习代码审计,题目均来自PHP SECURITY CALENDAR 2017,讲完这个题目,会再用一道有相同问题的CTF题来进行巩固。下面开始分析。

漏洞分析

下面我们看第一题,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class Challenge{
    const UPLOAD_DIRECTORY = './solutions/';
    private $file;
    private $whitelist;
    public function __construct($file)
    {
        $this->file = $file;
        $this->whitelist=range(1,24);
    }
    public function __destruct()
    {
        // TODO: Implement __destruct() method.
            //这里要特别注意!!!
        if (in_array($this->file['name'],$this->whitelist)){
            move_uploaded_file(
                $this->file['tmp_name'],
                self::UPLOAD_DIRECTORY.$this->file['name']
            );
        }
    }
}
$challenge=new Challenge($_FILES['solution']);
?>

这一关考察的是任意文件上传漏洞,导致这个漏洞发生的是上方代码中,对in_array()函数使用不规范导致的。这里详细说一下in_array()函数的用法。先看一下PHP手册对这个函数的解释,是检查数组中存在某个值,重点是我圈起来的,如果没有设置第三个参数,那么就使用宽松的检查,问题就出现在这里。

现在看上方代码第12行,这里使用了in_array()函数来检查文件名,但是没有设置第三个参数!,只会进行弱类型比较,不会检查数据类型。比如上面白名单规定,只能上传1~24的文件名,我们上传3shell.php,因为3在白名单中,所以它会将3shell转换成3从而绕过了白名单,达到了任意文件上传的目的。 为了加深对in_array()的理解,这里写一段简单的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$id =3 and 1=1;
$whitelist = range(1, 5);
if (!in_array($id, $whitelist)) {
    echo "你想搞事";
} else {
    echo "你通过了";
}
?>

这里in_array()也是没有设置第三个参数,会进行弱类型比较,会将3 and 1=1转化为3从而绕过了白名单,输出你通过了。当我设置第三个参数为true时,此时会进行强类型检查。所以我们将上文第三行代码修改为:if (!in_array(id,whitelist,true)),再执行就会输出:“你想搞事”。 现在是不是对in_array()函数有了一个大概的了解呢?那让我们做一道同类型CTF题目来加深巩固一下。

CTF练习

这道题目也是in_array()函数没有设置第三个参数,导致白名单被绕过,然后被SQL注入。下面我们具体看一下相关代码。 index.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
include 'config.php';
$conn = new mysqli($servername,$username,$password,$dbname);
if ($conn->connect_error){
    die("连接失败");
}
$sql="SELECT  COUNT(*) FROM users";
$whitelist = array();
$result = $conn->query($sql);
if ($result->num_rows > 0){
    $row = $result->fetch_assoc();
    $whitelist = range(1,$row['COUNT(*)']);
}
$id = stop_hack($_GET['id']);
$sql = "SELECT * FROM users WHERE id=$id";

if (!in_array($id,$whitelist)){
    die("id $id is not in whitelist.");
}

$result = $conn->query($sql);
if ($result->num_rows > 0){
    $row = $result->fetch_assoc();
    echo "<center><table border='1'>";
    foreach ($row as $key=>$value){
        echo "<tr><td><center>$key</center></td><br>";
        echo "<td><center>$value</center></td></tr><br>";
    }
    echo "</table></center>";
}
else{
    die($conn->error);
}
?> 

然后的config.php的相关代码。 config.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$servername = "localhost";
$username = "root";
$password = "XFAICL1314";
$dbname = "day1";

function stop_hack($value){
    $pattern =
        "insert|delete|or|concat|concat_ws|group_concat|join|floor|
        \/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex|
        file_put_contents|fwrite|curl|system|eval";
    $back_list = explode("|",$pattern);
    foreach ($back_list as $hack){
        if (preg_match("/$hack/i",$value)) {
            die("$hack detected");
        }
    }
   return $value;
}
?>

然后是搭建CTF使用的sql语句。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create database day1;
use day1;
create table users (
id int(6) unsigned auto_increment primary key,
name varchar(20) not null,
email varchar(30) not null,
salary int(8) unsigned not null );INSERT INTO users VALUES(1,'Lucia','Lucia@hongri.com',3000);
INSERT INTO users VALUES(2,'Danny','Danny@hongri.com',4500);
INSERT INTO users VALUES(3,'Alina','Alina@hongri.com',2700);
INSERT INTO users VALUES(4,'Jameson','Jameson@hongri.com',10000);
INSERT INTO users VALUES(5,'Allie','Allie@hongri.com',6000);
​
create table flag(flag varchar(30) not null);
INSERT INTO flag VALUES('HRCTF{1n0rrY_i3_Vu1n3rab13}');

题目解析

用上面代码我们在本地将环境搭建好。然后开始分析,先看index.php文件代码。再第16行通过$_GET方法接收用户的输入,并用stop_hack()来过滤用户的输入,然后下方直接拼接到sql语句中进行查询。然后再向下看,这里这里用in_array()来进行一个简单的检查,我们发现它没有设置第三个参数,进行弱类型检查。现在我们来验证一下,眼见为实。根据我们上方白名单规则,我们现在id只能输入1~5。现在我们输入3来看一下,发现查询到了信息。

现在我们输入8,它不在白名单中,看看返回什么。

上面是正常的输入,所以白名单是有效的,下面我们构造payload,比如我们输入:1',发现程序报错,绕过了白名单的检查。可以直接报错注入。

而关于报错注入的函数,大约有四个,分别是:floor()、extractvalue()、updatexml()、exp()。 虽然绕过了白名单,但是还有过滤函数stop_hack()现在我们定位到这个函数看看:

发现过滤了一些危险函数,我们查看后发现,这里没有过滤updatexml()函数,可以用它,但是concat函数被过滤了,我们需要找到可以替换得函数了。这里我们使用make_set()函数,它的用法是make_set()函数是先将x转化成二进制,例如: 11的二进制为1011,将二进制顺序颠倒变成1101,每一位数再与后面的字符串相对应,为1的截取,为0的丢弃。如下图:

所以我们构造payload,获取数据,为了避免占用篇幅这里直接是获取到flag的payload。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
and updatexml(1,make_set(3,'~',(select flag from flag limit 1)),1)

小结

通过这篇文章的讲解,是不是对in_array()理解更深了一些呢?下一篇文章会对filter_var函数缺陷导致的漏洞进行学习和分析,一起努力吧!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP代码审计Day1 - in_array函数缺陷
-----------------------------------------------------------------------------------
用户1631416
2018/09/14
2.3K0
PHP代码审计Day1 - in_array函数缺陷
由PHP SECURITY CALENDAR 2017引发的思考总结
这里的关键问题在in_array()函数,可以先看看In_array()的函数定义:
p4nda
2023/01/03
4910
由PHP SECURITY CALENDAR 2017引发的思考总结
BUUCTF-Web-WriteUp
知识点:代码审计,phpmyadmin任意文件包含漏洞 参考:phpmyadmin 4.8.1任意文件包含
小简
2022/12/28
1.5K0
BUUCTF-Web-WriteUp
PHP代码审计02之filter_var()函数缺陷
根据红日安全写的文章,学习PHP代码审计审计的第二节内容,题目均来自PHP SECURITY CALENDAR 2017,讲完这个题目,会有一道CTF题目来进行巩固,外加一个实例来深入分析,想了解上一篇的内容,可以点击这里:PHP代码审计01之in_array()函数缺陷 下面我们开始分析。
雪痕@
2020/10/10
2.4K0
PHP代码审计02之filter_var()函数缺陷
PHP代码审计笔记--SQL注入
测试语句:id=1 UNION SELECT user(),2,3,4 from users
Bypass
2019/07/08
1.7K0
PHP代码审计笔记--SQL注入
通过DedeCMS学习php代码审计
织梦(DedeCms)也是一个国产内容管理系统,曾经爆出过众多漏洞,甚至还有人开发了dedecms漏洞一键扫描器
FB客服
2021/08/24
21.7K0
PHP审计之in_array函数缺陷绕过
定义 : bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
全栈程序员站长
2022/07/13
1K0
网页注册登陆PHP代码
实现网页注册和登录功能的PHP代码涉及多个方面,包括数据库连接、用户输入验证、密码加密、会话管理等。下面是一个简单的示例,展示了如何创建一个基本的注册和登录系统。
用户2023156
2024/08/02
1630
网页注册登陆PHP代码
[网络安全] 三十六.津门杯CTF Web Write-Up万字详解(SSRF、文件上传、SQL注入、代码审计、中国蚁剑)
(1) 我们从github下载dirsearch工具(Python脚本),这是一个目录扫描工具,目的是扫描网站的敏感文件和目录从而找到突破口。
Eastmount
2021/12/02
5.2K0
[网络安全] 三十六.津门杯CTF Web Write-Up万字详解(SSRF、文件上传、SQL注入、代码审计、中国蚁剑)
【代码审计】PHP代码审计之CTF系列(1)
声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
物联网安全小编
2020/03/10
3.7K0
【代码审计】PHP代码审计之CTF系列(1)
SQL注入攻击与防御举例
以下是一段普普通通的登录演示代码,该脚本需要username和password两个参数,该脚本中sql语句没有任何过滤,注入起来非常容易,后续部分将逐步加强代码的防注入功能。
KevinBruce
2020/03/11
1K0
PHP代码审计05之正则使用不当
根据红日安全写的文章,学习PHP代码审计的第五节内容,题目均来自PHP SECURITY CALENDAR 2017,讲完题目会用一道CTF的题目和实例来加深巩固。这是之前写的,有兴趣可以去看看: PHP代码审计01之in_array()函数缺陷 PHP代码审计02之filter_var()函数缺陷 PHP代码审计03之实例化任意对象漏洞 PHP代码审计04之strpos函数使用不当
雪痕@
2020/12/31
6010
phpMyAdmin 4.8.1 远程文件包含漏洞复现
phpMyAdmin是一套开源的、基于Web的MySQL数据库管理工具。在phpMyAdmin 4.8.2 之前的 4.8.x 版本中,其index.php中存在一处文件包含逻辑,通过二次编码即可绕过检查,造成远程文件包含漏洞。
LuckySec
2022/11/02
1.9K0
phpMyAdmin 4.8.1 远程文件包含漏洞复现
吃透一文总结,轻松入门代码审计!
本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。
网络安全自修室
2023/12/15
5380
吃透一文总结,轻松入门代码审计!
PHP7原生MySQL数据库操作实现代码
PHP5中mysql_connect()等函数大多被PHP7中类的成员函数所代替。PHP5中连接mysql是过程性的,而PHP7中强调了类的使用与面向对象的方法
用户8832582
2021/07/13
8840
PHP代码审计笔记
http://blog.evalbug.com/2015/11/10/different_arrays_compare_indentical_due_to_integer_key_truncation/
用户5878089
2019/07/23
1.2K0
代码审计 | 记一次PHP入门代码审计
可以看到没有过滤就直接带入查询了而且还写出报错,这里就可以使用报错注入 payload
HACK学习
2021/07/21
9970
PHP代码审计
代码审计顾名思义就是检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞,并提供代码修订措施和建议。PHP代码审计审计套路通读全文法 (麻烦,但是最全面)敏感函数参数回溯法 (最高效,最常用)定向功能分析法 (根据程序的业务逻辑来审计)初始安装信息泄露文件上传文件管理登录认证数据库备份恢复找回密码验证码越权注入第三方组件CSRF,SSRF,XSS......审计方法1.获取源码2.本地搭建调试可先使用扫描器识别常见传统漏洞,验证扫描器结果,手动正则3.把握大局对网站结
企鹅号小编
2018/02/24
3.9K0
PHP代码审计
PHP基础之与MySQL那些事
这篇文章会对PHP的MySQL扩展库,MySQLI的扩展库,SQL批量执行,事务控制等等进行一些简单的讲解。
雪痕@
2021/02/25
1.5K0
PHP基础之与MySQL那些事
PHP代码审计
代码审计顾名思义就是检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞,并提供代码修订措施和建议。
信安之路
2018/08/08
4.7K0
PHP代码审计
相关推荐
PHP代码审计Day1 - in_array函数缺陷
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验