代码审计PHP总结

2 篇文章 0 订阅
2 篇文章 0 订阅

作者:yueji0j1anke

首发于公号:剑客古月的安全屋

字数:2909

阅读时间:    35min

声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外。

备注:本文网络摘取,只为学习使用,如有侵权联系作者删除,小编收到后第一时间删除。

目录

  • 介绍

  • 环境

  • 关键字

  • mvc架构

  • 10种漏洞挖掘方法

一.大致介绍

相比与.net站,php师傅们要熟悉的多。但大多数漏洞万变不离其宗,即

函数和变量

配合以一些关键字,代码审计想不出洞都很难

二.环境配备

1.seay代码审计系统/phpstorm

2.phpstudy+phpstorm+xdebug

配备过程如下

https://blog.csdn.net/m0_60571842/article/details/133246064

三.关键字

sql注入->   select   mysqli mysqluery   insert

文件上传->   $_FILES type="file" upload

xss   ->   print echo sprintf var_dump

文件包含 ->   require include 等四个函数

代码执行 -> eval assert call_user_func preg_replace

命令执行 -> system exec shell_exec popen proc_open

变量覆盖 —> parse_str() extract() $$

反序列化 -> serialize() construct destruct

ssrf   ->   file_get_contents

文件删除 ->   unlink

变量寻找   ->   $_GET $_POST $_FILES $_REQUEST

四.mvc架构讲解

图片

这一块对会java后端的师傅们比较好理解

controller可以简单理解成处理请求的地方,及接受一些传参的函数

调用model去完成数据库的读写操作,随后返回给view,渲染到html上

这里我们采用很经典的一套mvc框架进行演示

比如说这是index.php的源码

图片

但当我们访问

xxx/index.php?s=member&c=account&m=upload
或者
xxx/admin.php?m=Column&a=update&id=3

却能渲染出一个绚丽多姿的页面,比如

图片

m就是model文件,a就是方法,id就是参数

我们可以直接查看源码进行寻找

图片

五.挖掘方法

1.sql注入专场

关键字

get post request
待定函数:
echo
print

1.数据库监控

一边点各种业务,一边查看数据库监控语句,观察是否有变量可以被我们控制

这里我们选择最简单的seay进行演示

点进首页

图片

发现like功能点存在变量,全局查询找到对应函数

图片

发现确实存在变量,且可控,注入点为单引号

找到对应使用函数位置

图片

跟踪getIP函数

图片

不出意外的话,是xff注入

2.正则表达

相对于数据库监控,正则表达则更显得常用一些。

像sql注入,一般的搜索正则表达式如下

(update|select|insert|delete|).*?where.*=\

搜索出来的东西一个个看,看是否sql语句存在可控变量

图片

进行相关函数跟踪

图片

很明显,没有进行过滤,所以存在sql注入

3.根据1day挖掘

这里拿几个古早的洞进行分析

1.后台注入
https://www.cnvd.org.cn/flaw/show/CNVD-2020-59466

看他的描述文件

图片

这套源码是按照标准的mvc框架进行搭建。

根据mvc路由找到对应文件

图片

这里可以发现有两个对应符号描写文件,我们进入审查,优先发现具有传参的函数

图片

看到有貌似查询数据库操作,点击跟进

图片

发现数据库操作

图片

即这里注入点是括号

我们看看相关数据库操作函数是否存在过滤

图片

继续跟进

图片

在这里echo一下sql,看看是否能被我们控制

图片

图片

显然,存在sql注入

2.前台注入
https://www.cnvd.org.cn/flaw/show/CNVD-2019-05674

图片

直接找到对应路径

图片

发现存在sql执行

追入进行查看

图片

发现进行了魔术引号,且进行了filter_sql进行过滤,进行了大小写转换和关键词的过滤。

但是取死之道已在其中

图片

开启了url编码,我们可以双重url编码绕过

目前我们只知道name参数,但并不知道数据库操作局域,跟进getNameData方法

图片

继续跟进

图片

同样的,在这里echo一下

因为function __construct()为特殊构造函数,只要访问便可自动执行,所以我们可以不加上a参数进行访问

图片

可控

直接构造payload

%25%36%31%25%32%37%25%32%30%25%36%31%25%36%65%25%36%34%25%32%30%25%37%35%25%37%30%25%36%34%25%36%31%25%37%34%25%36%35%25%37%38%25%36%64%25%36%63%25%32%38%25%33%30%25%32%63%25%36%33%25%36%66%25%36%65%25%36%33%25%36%31%25%37%34%25%32%38%25%33%30%25%37%38%25%33%37%25%36%35%25%32%63%25%37%35%25%37%33%25%36%35%25%37%32%25%32%38%25%32%39%25%32%39%25%32%63%25%33%31%25%32%39%25%32%33

图片

当然你也可以使用xdebug调试技术,见前面环境配备技术讲解链接

图片

2.文件删除演示案例

通过搜索关键字

@unlink
del
unlink

图片

图片

这里通过关键词找到一处删除文件处漏洞且文件参数可控。

图片

接下来尝试跨路径删除

图片

删除成功

3.文件读取

关键词如下

file_get_contents *
file_put_contents *
fread
fgets
file
parse_ini_file
readfile       *
highlight_file   *
show_source     *

通过关键词搜索发现存在相关功能

图片

接下来寻找使用

图片

找到对应文件

图片

图片

发现函数参数可控

在config里面找到相关前缀路径

图片

图片

进行测试,成功

进行路径跨越读取

图片

成功,利用这个漏洞读取一些配置文件甚至windows.ini也不是不行

4.文件写入

图片

同樣找到用法

图片

图片

进行写入

图片

访问

图片

写入成功

5.文件下载

像之前的都是纯代码审计,其实还可以通过功能点进行测试

比如一些文件下载点

这个跟文件读取的点有些类似,就不再重复

6.文件包含

这里的逻辑是,接受r参数,包含相关文件

如果我们上传了图片马,传参进行相关路径包含,即可完成上传木马操作。

7.RCE 命令执行和代码执行

1.命令执行

图片

这里亦无具体详细,所以下载源码进行审计

图片

搜索system,一下就出来了

查看对应函数

图片

这段代码主要是对上传的文件进行保存并对上传的文件进行压缩处理,但没用进行任何过滤,可能会有注入,我们来看看是否存在变量,跟踪函数调用

图片

存在三处,但我一眼就看中了第四个,因为前三个一定还要继续追踪用处,第四个已经跳脱出inc文件了

图片

这里的脚本代码主要执行文件上传后的操作

获取上传文件的扩展名,并将其转换为小写。
如果文件的扩展名是 'txt',则将上传的文件保存到指定的位置。保存的路径由 WEB_ROOT 和文件名构成。
然后,更新配置数组 $cfg 中的 'weixin_hasverify' 键值为文件名。
如果上传文件的扩展名不是 'txt',则显示错误消息。

而我们的file_save正是触发在后缀名为txt之时

现在我们需要观察网站路由并进行相关函数的触发

http://127.0.0.1/baijiacms-master/index.php?mod=site&act=manager&do=store&op=display&beid=1

图片

是这样一个对应触发

那我们对应setting.php触发如下

http://127.0.0.1/baijiacms-master/index.php?mod=site&act=weixin&do=setting

成功找到对应接口

随便点个txt文件上传

图片

这是$file_full_path的值

不出意外的话

执行的命令会是这样

system('covert xxx 路径 路径')

假如说我们加入|或者&号,那就很爽比如,可惜文件名不能有|
convert xxx D:/phpstudy/WWW/bajiacms-master/&whoami&1.txt D:/phpstudy/WWW/bajiacms-master/&whoami&1.txt

不出意外,会返回两次whoami的结果

图片

但需要安装这个

图片

2.代码执行

图片

这里的采用是zzzcms

1 | 1.6.1版本审计

1.6.1版本审计

下载下来进行代码审计,搜索eval等关键词

图片

搜索调用

图片

需要调用这个方法,那么当我们修改模板或者上传文件时即可解析文件,进行eval

图片

构造这个即可完成一个小木马

2 | 2.2.1版本审计

图片

可以看到这里进行了严格的安全过滤

但是采用的是黑名单过滤,总有遗漏的地方。

{if:=`calc`}{end if}

图片

图片

8.验证未授权类型

就是伪造cookie删除cookie进行黑盒测试等

图片

这个也具有典型意义,左边的可以发数据包并且执行,右边的发数据包会被拦截

9.变量覆盖

其实本人一直没怎么挖过变量覆盖,这个洞一向是跟其他漏洞结合从而导致的危险,最常见的是文件包含到配置文件,经常被引用从而导致的危险。但我审计到的源码中基本没有这样的组合拳。所以这里不过多献丑。

图片

10.反序列化

这里拿很经典的phpmyadmin做例子

图片

会自动执行_wake_up魔术方法

刚好wakeup里面存在load函数

图片

跟进load函数,相关函数里面有代码执行,即存在

图片

构造相关poc

图片

图片

即相关类中的相关变量,将其恶意代码写入文件进行file_get_contents

<?php
 class PMA_Config {
   var $source = 'ggg.txt';
}
 $x = new PMA_config();
 echo serialize($a);
?>

触发条件总结如下

图片

先触发反序列化,再写入对应后缀文件,file_get_content进行读取之后,进行eval

后续将会推出php篇框架总结,希望各位师傅多多指点~

参考文章:  https://www.bilibili.com/video/BV1pQ4y1s7kH/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值