【代码审计】—PHP

工具🔧

seay源代码审计系统

phpstudy——搭建环境

前言

🌸//原文:

【小迪安全】Day50代码审计-PHP无框架项目SQL注入挖掘 - 哔哩哔哩点击进入查看全文>https://www.bilibili.com/read/cv14964585

【小迪安全】Day51代码审计-PHP框架MVC类上传断点调试 - 哔哩哔哩点击进入查看全文https://www.bilibili.com/read/cv15042607?spm_id_from=333.999.0.0【小迪安全】Day52代码审计-PHP项目类RCE及文件包含下载删除 - 哔哩哔哩点击进入查看全文>https://www.bilibili.com/read/cv15169189?spm_id_from=333.999.0.0

0x00 相关原理分析要求

1.教学计划:

---审计项目漏洞 Demo->审计思路->完整源码框架->验证并利用漏洞

2.教学内容:

---PHP,JAVA 网站应用,引入框架类开发源码,相关审计工具及插件使用

3.必备知识点:

---环境安装搭建使用,相关工具插件安装使用,掌握前期各种漏洞原理及利用

4.开始前准备:

---审计目标的程序名,版本,当前环境(系统,中间件,脚本语言等信息),各种插件等

5.挖掘漏洞根本:

---可控变量及特定函数,不存在过滤或过滤不严谨存在绕过导致的安全漏洞

🌟🌟6、定点挖掘关键词

---可控变量

        变量接受get post 接受关键字$_GET

---特定函数

        输出print

        数据库操作

---特定关键字

        select insert update sql执行语句==sql 注入漏洞

---搜索特定关键字尝试寻找特定漏洞

        如:echo print         xss漏洞

        如:$_GET $_POST         安全漏洞

🌟🌟7、定点挖掘功能点:

🌹如:我要挖掘文件上传,会员中心存在文件上传操作,抓包分析源码中特定文件上传代码段,进行分析。

🌟🌟8、拓展: 视漏洞而定

🌹sql注入        数据库监控-监控到当前页面和数据库的交互过程(sql执行语句)

🌹断点调试        访问页面对应代码进行断点调试(执行过程先后顺序,调用文件列表等)

    

0x01 sql注入漏洞点判断(php无框架)

1、分析:

(1)查找关键词如select,掠过定量处,分析存在变量的代码处;回溯调用函数,注意有传参的位置,是否有过滤,是否有预编译,以及通过查看代码反馈信息的方式来具体判断存在哪一种注释。

(2)看过滤机制。一般过滤机制在类似incloud等配置文件中(一般是全局性的,可以看看大部分代码中都共同引用了什么配置文件)

ps:二次注入(解决转义的过滤)与宽子节注入(核心:传一个字符将反斜杠吃掉成为汉字)可绕过php魔术引导机制(magic_quotes_gpc),原理如下:

 SQL注入篇学习之盲注/宽字节注入_其他数据库_萬仟网

2、研判:

(1)是否存在预编译(防御sql注入最好的办法,就是使用预编译,绑定变量);

(2)是否使用安全的存储过程(效果和预编译相似,区别是存储过程需先将sql语句定义在数据库中,但仍然需尽量避免使用动态sql语句,如无法避免,应严格过滤);

(3)是否检查数据类型,严格限制数据格式;

(4)是否使用足够安全的编码函数;

🌟 🌟 如不满足以上四种中任何一种,可判断为存在sql注入。

3、防御:

(1)正确使用参数化api进行sql查询(推荐)

(2)如需求是提交非字符串,可进行数据类型校验,如:用户输入整数还是浮点数时进行数据类型验证,输入邮箱则严格按照邮箱格式等类似白名单的输入检查方式。

(3)使用安全函数

###ps:不推荐黑名单,黑名单防御方式易被绕过,防不胜防。

4、案例分析思路

(1)74CMS 人才招聘系统挖掘-2 次注入应用功能(自带转义) 🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸

🌹分析源代码发现有自带过滤机制(common.php文件);

🌹过滤机制是魔术引导;

🌹联想到二次注入和宽子节注入绕过;

🌹分析了二次注入的原理之后选取网站同时存在insert、update且变量可控的功能点;

🌹对二次注入功能点抓包分析;

🌹使用seay代码审计系统——审计插件——mysql监控——输入用户名和密码——点击下断、更新(为了直观的看到存在二次注入的功能点);

🌹在页面中可能存在二次注入功能点(insert+updata+变量可控,取出首次提交的数值后,更新时又将数值带入数据库中)的地方点击按钮,进行查看;

 🌹如果可以找到满足二次注入的功能点,进行验证。

(2)苹果 CMS 影视建站系统挖掘-数据库监控追踪(自带过滤) 🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸

🌹根据url的index.php?m=vod-search进行代码审计

🌹对m参数进行一系列分析后定位到过滤文件module中的vod.php

🌹追踪到chksql,又定位到过滤函数stopattack,进一步定位到过滤关键字的语句getfilter,然后进行全局搜索,发现过滤的关键字

//总结:搜索框追踪到sql语句,sql语句追踪到特定文件vod.php,特定文件里追踪到调用函数chksql,chksql进行右键函数定位追踪到该函数模块,该函数模块又涉及到stopattack,再次右键定位函数发现匹配关键字的函数模块,关键字又是从哪来的?是刚刚stopattack函数模块中调用的getfilter参数,对getfilter参数右键定位,即查询到过滤关键字的语句。

❤️tips1:管他丫的,就是找就对了,各种溯源

❤️tips2:双重编码可对此处过滤进行绕过。

0x02 php框架mvc类上传断点调试(文件上传

1、mvc框架简介

php MVC框架实例教程 - 临点 - 博客园

MVC的全名是Model View Controller,是一种使用模型-视图-控制器设计和创建web应用程序的模式,是一种设计典范。

其中:

    Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常负责与数据库直接进行 curd 的交互。

    View(视图):是应用程序处理数据显示的部分,通过将处理好的数据进行渲染。

    Controller(控制器):是应用程序中处理用户交互的部分,通常用于处理数据逻辑的分发,并相应的反送给视图和控制器。

2、总体思路

(1)关键词搜索(函数,键字,全局变量等)

文件上传:$_FILES,move_uploaded_files等

文件上传的关键字:在写上传的时候会有注释,如//上传

(2)应用功能处抓包(任何可能存在文件上传的功能点),对此处代码进行分析。

全局数组$_ _FILES

$_ FILES['myFile']['name'] 显示客户端文件的原名称。
$_ FILES['myFile' ]['type']文件的MIIME类型,例如"image/gif" 。
$_ FILES['myFile']['size']已 上传文件的大小,单位为字节。
$_ _FILES['myFile' ]['tmp_ _name'] 储存的临时文件名,一 般是系统默认。
$_ FILES['myFile']['error'] 该文件上传相关的错误代码。以下为不同代码代表的意思:

0;文件上传成功。
1;超过了文件大小php.ini中即系统设定的大小。
2;超过了文件大小MAX_ _FILE_ _SIZE 选项指定的值。
3;文件只有部分被上传。
4;没有文件被上传。
5;上传文件大小为0。
相关函数

move uploaded file(file, newloc)函数将上传的文件移动到新位置。
strtolower()函数把字符串转换为小写。
trim()函数移除字符串两侧的空白字符或其他预定义字符。
strrchr()函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
str ireplace() 函数替换字符串中的一些字符(不区分大小写)
getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE并产生一条E_ WARNING级的错误信息。
exif jimagetype()读取一个图像的第一个字节并 检查其签名。
substr()函数返回字符串的一部分。
fopen()函数打开文件或者URL。
fread()函数读取文件(可安全用于二进制文件)。
fwrite()函数写入文件(可安全用于二进制文件)。

3、文件上传代码审计研判

(1)文件可上传
(2)知道文件上传路径
(3)上传文件可以被访问
(4)上传文件可以被执行

4、防御方案及缺点

(1)黑白名单

容易被绕过,所以基本被白名单验证所淘汰。不推荐黑名单,因为大部分都不全,总有奇奇怪怪的绕过姿势。

(2)文件头验证

 进行验证,在1.gif文件中,我们写入文件头GIF89a,文件内容随便写,我们发现这个文件被判断为GIF文件,返回了尺寸数组。

(3)content-type验证

content-type位于request请求里,是我们抓包后可以自行修改的内容。

(4)上传文件重命名

将用户上传的文件重命名是一种安全程度较高的防御方式,我们一般采用hash(文件名+时间戳+salt随机数)的方式对文件重命名。入侵者在不清楚自己的木马命名的时候就很难连接进行攻击了。

5、案例分析思路

(1)Beescms 无框架后台任意文件上传🌸🌸🌸🌸🌸🌸🌸

---进入首页——后端
---在源代码中搜索关键字:上传,搜索函数$_FILES(直接搜索没有,把$去掉,灵活变通)
---点击其中一个查看(这里是一个文件上传的处理过程)
---浏览器访问该文件
---上传一个doc文件抓包分析看传递的参数
---传递的参数:文件说明:file_info和uppic,传递的表单名为up


---在源代码里面查找这两个参数,出现文件上传的代码段。

       (tips:

        ❤️ 如果uppic的参数存在,就传递表单名up;

      ❤️ fl_html里面将传递的字符串利用htmlspecialchars将特殊字符转换为 HTML 实体;

         ❤️explode 使用一个字符串分割另一个字符串,这里将$_type_file以|分割,前面有有一个$_type_file函数,将允许的文件格式以|分割);

         ❤️$_sys文件是一个数组,包含上传文件的大小,和文件类型;
        ❤️ is_uploaded_file()函数检查指定的文件是否是通过 HTTP POST 上传的。如果文件是通过 HTTP POST 上传的返回 TRUE,可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件;

        ❤️ $_FILES['up']['tmp_name']是is_uploaded_file()要检查的文件,up是要上传的表单名,tmp_name变量中的值就是文件在Web服务器中临时存储的位置(上传文件的临时保存文件)。)

---确定文件的大小限度(这里是系统设置的值);

--- up_file处理上传的文件,并且验证是否符合上传标准;

---根据up_file返回值(返回的字典形式)确定文件的路径、扩展名、大小、时间;

---最后在进行数据库的插入操作;


---定位函数up_file(进行相关的验证);

---传递了三个参数:表单名,文件大小,文件类型;

---确定文件的大小不超过系统设置的文件大小;

---pathinfo() 函数以数组的形式返回关于上传的文件路径信息,如/testweb/test.txt,生成数组:[dirname] => /testweb;[basename] => test.txt;[extension] => txt;[filename] => test;


---查看上传的文件的后缀名是不是在系统规定的后缀里面;

---判断path=’’的话,就上传到upload/file/路径下(如果path没传参的话默认为空,有参数的话就是参数值);

---file_exists检查文件或者目录是否存在,不存在就创建目录;

---再根据时间戳生成文件名;


---这里的关键就是绕过pathinfo函数,让php文件的格式的能够最后检测;

---尝试绕过均不成功,无法上传。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haoaaao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值