php 多条件筛选源码-挖掘0day的一些思路技巧

好久没见到你了!

1 简介

待审核的应用根据访问权限一般有以下几种情况:

本文主要关注有源代码时的代码安全审计。 此类代码审计的总体思路是:

代码审计是每个安全研究人员都应该掌握的技能,但是网上关于代码审计的介绍文章相对较少。 其中大部分是关于漏洞利用和漏洞分析的。 因此,这次分享也算是我这六个月的代码审计工作的一个小总结。 希望感兴趣的朋友可以经常交流。

2.0天

《孙子兵法》云:先谋而后行。 在开始任何事情之前,你需要确定你的目标和计划,以确保你不会偏离方向。 代码审计也是如此。 在代码审计过程中,我不喜欢通读代码全文并跟踪每个函数。 这可能会导致很长一段时间没有收获,既浪费时间,又损害信心。

为了避免这种情况,在开始之前问问自己你的目标是什么。 乍一看这是一个简单的问题,但针对不同的场景可能有不同的答案。 通常安全研究人员的目标是在最短的时间内找到最有价值的漏洞; 对于商业安全顾问来说,目标是在项目预算范围内实现尽可能最高的审计覆盖率; 另外,对于开发人员或者安全架构师来说php 多条件筛选源码,需要更长的时间来进行内部安全审查。

对我来说,审计的目的是对项目或硬件拥有最终决定权。 最有用的0day是无条件getshell漏洞。 我认为其他诸如xss、csrf等无法快速获取shell的漏洞不值得花时间去测试。

所以我的目的就是找到一个可以无条件getshell的漏洞。 这里有两个关键词:

无条件:无需登录或其他方式即可访问,即未经授权的访问

Getshell:获取shell的方式包括但不限于文件上传、命令执行、代码执行、SQL注入等。

php实现数据筛选_php筛选查询数据库_php 多条件筛选源码

3. 挖矿0day

基于以上目的,我挖掘的重点是无条件的文件或未经授权即可访问的接口。

从国内各个OA、CMS曝光的0day可以看出,大量产品的开发不是很规范,不遵循标准流程。 很多漏洞的细节曝光后,大多数漏洞只要有源代码可供审计,对于安全人员来说是非常容易发现的。

我下面提到的技巧都是基于这个基础的。 我个人觉得他们非常适合挖角国内公司或者开发非标产品。

3.1 未授权 3.1.1 未授权文件

拿到源代码后我做的第一件事就是用脚本过滤掉那些未经授权就可以访问的文件。 这个方法并不关心你是否可以构建一个项目。 毕竟国内大部分产品都不是开源的。 只需获取源代码即可。 对于大多数不太了解开发的安全人员来说,可能无法搭建。

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# @Author : yhy
# 未授权文件获取脚本
import os

home_directory = "/Users/yhy/work/ROOT" # 填入项目主目录,该目录名在拼接 uri 中会去除,要给全路径,不然有可能替换出错 # 本地或者公网的靶场地址
suffix = ".jsp" # 要找的后缀
uris = [] # 拼接的 uri 列表
f = open('output.txt', 'w')

def splicing(root, files):
for file in files:
if file.endswith(suffix):
uri = root + "/" + file + "n"
# 去除获取的根目录名
uris.append(uri.replace(home_directory, ""))

# 获取项目中所有的文件拼接而成的 uri
def get_URI():
for root, dirs, files in os.walk(home_directory):
splicing(root, files)
# print("root", root) # 当前目录路径
# print("dirs", dirs) # 当前路径下所有子目录
# print("files", files) # 当前路径下所有非目录子文件

# 结果保存
def output():
# 打开一个文件
fo = open("work.txt", "w")
fo.writelines(uris)
# 关闭打开的文件
fo.close()

if __name__ == "__main__":
get_URI()
output()

通过脚本遍历串联所有文件路径后,我喜欢使用httpx来过滤掉未经授权的文件。 基本流程:

1. 执行`echo url | httpx -path work.txt -sc -cl -nc -o workHttpx.txt -fc 302,500,501,404`
2. 上一步执行可能还会存在一些提示需要登录的文件路径,记录下长度,再次执行`echo url | httpx -path work.txt -sc -cl -nc -o orkHttpx.txt -fc 302,500,501,404 -fl 长度`
3. 之后重点查看筛选出的结果,如果审计过程中还存在一些干扰选项,可以不断的执行第二步来排除。

该方法还可以用于过滤未经授权可以访问的配置文件、xml文件等。

并且根据这一步的结果,您可以使用脚本将未经授权的文件复制到另一个目录,以便于使用工具进行扫描。

php实现数据筛选_php 多条件筛选源码_php筛选查询数据库

3.1.2 未授权接口

前面的方法只能对一些未经授权的文件起作用。 一个完整的Web项目还必须有一个API。 这种情况下就需要相应的环境(自建/公网授权访问),或者分析项目代码架构,从源码中提取API。

我后来的审计计划是使用Burp收集api接口:通过收集所有经过Burp的流量,然后去掉cookie访问,提取状态码为200的接口。Burp中有一个插件AutoRepeater可以做到这一点,但是它不太好用。 我打算稍后打开它并修改它。

还有CodeQL,我最近在学习,我用CodeQL来查找所有的API。

3.2 刀具扫描

如果只是手工的话,会受到个人水平的限制,导致会漏掉一些漏洞,所以需要一些工具来辅助。 我可能会使用以下工具进行审核:

过滤掉可以未经授权访问的文件后,可以使用静态扫描工具对这些文件进行扫描,发现一些危险函数,这样可以大大提高效率。

3.3 文件上传

getshell最有效的方法之一就是上传文件,所以我们在筛选出未经授权的文件之后,比如PHP项目,我们可以用Seay工具进行扫描,这样我们就可以快速定位到一些可能存在漏洞的文件,然后对这些文件进行详细分析。 审计; 如果您对PHP非常熟悉,则无需工具即可扫描。 例如:PHP中上传文件就离不开move_uploaded_file函数。 直接全局搜索此功能是否有未授权的文件,然后重点分析文件。

例如,E-office9之前版本存在文件上传漏洞,编号为CNVD-2021-49104

图片-20220317112314751

这是打完补丁后的文件。 打补丁前,logo上传时没有进行后缀判断。

采用我提到的方法,如果在漏洞暴露之前就有了e-office9的源代码,那么不到5分钟就可以挖出这个漏洞。

3.4 SQL注入

SQL注入取决于项目本身是否有一些过滤功能,过滤是否完整,配置文件是否有相应的防御措施。

在最新版本的E-office 9中,存在SQL注入看似存在,但无法注入的情况。

图片-20220317114320473

虽然后面的'$userId'参数没有使用过滤功能,但是本项目的PHP默认开启了魔术引号,所以不存在字符SQL注入,而且是0天损失,O(∩_∩)哦哈哈~。

图片-20220317114526006

php实现数据筛选_php 多条件筛选源码_php筛选查询数据库

魔术引号是程序自动转义进入 PHP 脚本的数据的过程。 开启后,所有 '(单引号)、"(双引号)、(反斜杠)和 NULL 字符都将自动用反斜杠转义。与addslashes() 函数效果相同。

关于sql注入挖掘,除了看代码之外,我们来说一下我辅助sql注入挖掘的想法之一。

现有工具MySQLMonitor是一个通过监控Mysql的general_log_file日志文件来实时获取执行的SQL语句的工具。

图片-20220316174135527

然而,这个工具的缺点也非常明显。 对于大型项目,需要执行的语句很多。 这个工具对于发现SQL注入可能发生的地方帮助不大php 多条件筛选源码,而且仍然需要大量的人力。

我的想法之一是通过burp浏览时获取访问日志,然后在有参数或可能的注入点的地方重新发送包,在字段中添加一些自定义标识符+ SQL注入的一些简单有效负载,然后进行神奇的更改。 MySQLMonitor 工具仅输出具有自定义标识符+负载的语句。 然后重点关注这些输出语句,这些语句很可能存在SQL注入。

该方法类似于IAST污点跟踪,跟踪有效负载,然后检查有效负载是否被执行。

4. 总结

我提到的一些技巧可以半自动实施。 例如,通过分析项目的逻辑,也可以实现未授权文件的筛选。 例如E-offcie9中的访问控制是通过include_once("inc/auth.php"); 要实现这一点,只需要遍历所有文件,去掉 include_once("inc/auth.php"); 然后添加一些高危函数,如文件上传函数move_uploaded_file、执行SQL语句的关键函数、执行命令的关键函数等。 匹配完毕后,最后通过一点人工辅助,就可以实现半自动取孔。

本次分享仅是个人观点,技术比较片面。 对于使用框架和标准流程开发的产品可能不是很有用。 成功的代码审计流程必须务实、灵活且以结果为导向。 虽然你注重方法,但并不意味着你根据别人的方法就能成功。 代码审计需要通过学习和实践来掌握。 我们推荐一个方法:

php实现数据筛选_php筛选查询数据库_php 多条件筛选源码

找到公开的漏洞公告,根据标题审核相关模块,看能否发现漏洞。

如果找不到,请返回阅读漏洞公告的详细信息并反思自己的审核方法。

不断重复,直到你能认为发现漏洞只是时间问题而不是能力问题。

任何行业都没有捷径,你看到的所谓神奇,很可能只是有人花时间做了你意想不到的事情。

5. 参考资料

如何审计代码安全性

6. 题外话

我们公司莫安正在招聘大量安全研究/研发/业务支持/产品/营销人员。 我们周末有两个休息日,不打卡上下班,工作氛围很好。 该研究所的人们每周都会分享它。 这篇文章是上个月刚刚分享的。 ,今天听机器学习组组长讲机器如何理解文本信息——AI在安全领域的落地。 虽然我不明白,但我还是震惊了,灵魂受到了洗礼。

如果您有兴趣,请在滴滴上联系我,我会安排推荐。

免责声明:本文仅供安全研究和讨论。 严禁非法使用。 违反者须自行承担后果。