YAK-SSA,古希腊掌管PHP代码审计的神

admin 2025年1月9日22:27:52评论10 views字数 4579阅读15分15秒阅读模式

YAK-SSA,古希腊掌管PHP代码审计的神

之前的文章中曾为大家简单介绍过

线上代码审计平台ssa.to

今天牛牛就来为大家详细介绍一下

如何用ssa进行PHP的代码审计

YAK-SSA,古希腊掌管PHP代码审计的神

YAK-SSA,古希腊掌管PHP代码审计的神

YAK-SSA,古希腊掌管PHP代码审计的神

YAK-SSA,古希腊掌管PHP代码审计的神

  • tp封装的辅助参数,I/request方法
  • thinkphp中的封装了请求对象,$request
  • 路由参数绑定
在thinkphp中,I方法的过滤并不是时时刻刻都会起作用,在底层中,I如果没有显示的指定过滤参数,其过滤参数需要去config文件中去指定,如果也没有指定,就和传统的参数获取没有区别。
YAK-SSA,古希腊掌管PHP代码审计的神
在tp中,会涉及到一些底层API的封装,开发者不必利用底层API的实现,只要学会使用即可。所以在代码审计的时候,可以找到这些函数,实现从source点到sink点的路径缩短。实现更加精确的数据流分析。
数据库相关:
Db::table()xx->insert()xx->update()xx->delete()$model::where()Db::transaction()
文件上传相关:
在tp底层中,常见的文件上传辅助函数有:
$file->move()$file->check()$file->save()Filesystem()等$file->error()$file->getError()

YAK-SSA,古希腊掌管PHP代码审计的神

YAK-SSA,古希腊掌管PHP代码审计的神
在之前的文章中,会涉及到很多规则编写部分,而ssa官网也提出了syntaxflow的简单实用,重点功能为:
$source #-> as $sink  //顶级定义$source --> as $sink  //底级实用其次:比较重要的两个configinclude: 路径上有(包含)exclude: 路径上无(排除)
在上面的基础上,可以配合过滤器的使用和集合运算,来实现更多的自定义规则
简单的规则编写:
在寻找顶级定义的过程中排序路径上的某些内容
<?php$a = 1;if($a){    $a = filter($a);}else{    $a = unsafe($a);}eval($a);
画出来的控制流图为:

YAK-SSA,古希腊掌管PHP代码审计的神

一共有两个分支到达done block,想到无过滤器的一条路径,规则如下:
//寻找顶级定义的过程中,排除路径上filter的

*a #{exclude: `*?{have: filter}`}-> as $sink/* $sink: t75: Undefined-unsafe .:7:10 - 7:16 t66: 1 .:3:6 - 3:7*/

但是会发现,这个并不是想到的内容,原因就出现在,我们需要让它与可控变量做交集 。需要让它的顶级调用者中,出现可控变量,这样的话,再次改写代码。
// 寻找顶级定义的过程中,路径上包含与_POST相交的点,并且排除filter_POST as $source*a #{exclude: <<<CODE*?{have: filter}CODE,include: <<<CODE* & $sourceCODE}-> as $sink
在这样的一个简单demo学习之后,我们就可以进入实战演示。

YAK-SSA,古希腊掌管PHP代码审计的神

在github中找到一个cms,在yakssa中进行编译。
在编译过程中,会发现,代码多之后编译的很慢,这是因为在php中会有依赖,像go一样,而这些依赖一般都是用来辅助开发者去完成某项功能,比如imageutil、wechat等依赖,可以在编译的过程中,跳过这些依赖的编译,虽然代码不是完整的,但是ssa也可以实现审计。
YAK-SSA,古希腊掌管PHP代码审计的神
搜索thinkphp中常见的可控变量。然后写成一条规则。
request() as $source1input() as $source3i() as $source4*request.get() as $source5*request.post() as $source6.input() as $source7.param() as $source8.post() as $source9$source1+$source3+$source4+$source5+$source6+$source7+$source8+$source9 as $source
YAK-SSA,古希腊掌管PHP代码审计的神

xss分为很多种,这里以最简单的反射和存储来进行说明。
  • 反射xss :由用户手动控制,直接输出到页面。
  • 存储xss:由用户手动控制,但存储到数据库中。
这里写一条存储xss的sf语句。
request() as $source1input() as $source3i() as $source4*request.get() as $source5*request.post() as $source6.input() as $source7.param() as $source8.post() as $source9$source1+$source3+$source4+$source5+$source6+$source7+$source8+$source9 as $source.add() as $func5.save() as $func6$func5 +$func6 as $func$func #{include: `* & $source`}-> as $sink

审计出来的内容很多,这里我们一一查看。

YAK-SSA,古希腊掌管PHP代码审计的神

定位到system.php文件中,先做了请求判断,如果有的话返回已经存在,如果没有的话,将内容进行添加,这里跟进发现。

YAK-SSA,古希腊掌管PHP代码审计的神

会将最后的内容存放到数据库中。

YAK-SSA,古希腊掌管PHP代码审计的神
注意:不是所有的I方法都有漏洞,在之前tp的代码审计中提到,参数可以配置默认过滤。
此项目中,因为没有配置默认过滤,可以直接根据路由传入参数。
POST /index.php/admin/sys.Auth/groupAdd HTTP/1.1Host: 10.211.55.11:8092Upgrade-Insecure-Requests: 1Accept-Language: zh-CN,zh;q=0.9Referer: http://10.211.55.11:8092/index.php/admin/indexUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Cookie: think_lang=zh-cn; PHPSESSID=655381238c1f39ebb2ccbc7cb5d7830e; Hm_lvt_d7fcc824c81abdf6e6d33ffc0e10c071=1736077733,1736168831; Hm_lpvt_d7fcc824c81abdf6e6d33ffc0e10c071=1736168831; HMACCOUNT=8C60E645EC57F215Connection: keep-aliveAccept-Encoding: gzip, deflateContent-Type: application/x-www-form-urlencodedtitle=<script>alert(1)</script>
根据syntaxflow找到的内容,基本上都有xss漏洞,至少3处。
YAK-SSA,古希腊掌管PHP代码审计的神
.request().file() as $source1request().file() as $source2$source1+$source2 as $source$source

定位到文件upload.php中,可以看到是过了一层校验,thinkphp validate,这里可以去看下,简单来说就是对数组进行过滤。

YAK-SSA,古希腊掌管PHP代码审计的神

此处的过滤器写的有问题,正确的过滤器如下。

YAK-SSA,古希腊掌管PHP代码审计的神

上传文件即可。

YAK-SSA,古希腊掌管PHP代码审计的神

YAK-SSA,古希腊掌管PHP代码审计的神

通过对输入点的审计,找到这样一段代码。

YAK-SSA,古希腊掌管PHP代码审计的神

  • 时间戳校验
  • appid校验
  • 签名校验
YAK-SSA,古希腊掌管PHP代码审计的神

是根据输入来计算的MD5(可以使用热加载来写)

YAK-SSA,古希腊掌管PHP代码审计的神

而数据库中有默认的appid和appsecret。

YAK-SSA,古希腊掌管PHP代码审计的神

判断是否有用户名,并且进行密码校验。

YAK-SSA,古希腊掌管PHP代码审计的神

// 使用标签 {{yak(handle|param)}} 可触发热加载调用handle = func(param) {    // 在这里可以直接返回一个字符串}// 使用标签 {{yak(handle1|...)}} 可触发热加载调用handle1 = func(param) {    // 这个特殊的 Hook 也支持返回数组    return ["12312312", "abc", "def"]}// beforeRequest 允许发送数据包前再做一次处理,定义为 func(origin []byte) []bytebeforeRequest = func(req) {    /*        // 我们可以提供一些基础用法,比如说单纯就是替换一个时间戳~        req = str.ReplaceAll(req, "TIMESTAMP_INT64", sprint(time.Now().Unix()))    */ params = poc.GetAllHTTPPacketPostParams(req)params.Delete("sign")params["key"] = "123456"var buildSign = ""for k,v in params{    buildSign = buildSign+sprintf("%s=%s", k,v)    buildSign = buildSign+ "&"}buildSign = buildSign[:-1]params.Set("sign", codec.Md5(buildSign))println(params)return poc.ReplaceAllHTTPPacketPostParams(req, params)}// afterRequest 允许对每一个请求的响应做处理,定义为 func(origin []byte) []byteafterRequest = func(rsp) {    return []byte(rsp)}// mirrorHTTPFlow 允许对每一个请求的响应做处理,定义为 func(req []byte, rsp []byte, params map[string]any) map[string]any// 返回值回作为下一个请求的参数,或者提取的数据,如果你需要解密响应内容,在这里操作是最合适的mirrorHTTPFlow = func(req, rsp, params) {    return params}

YAK-SSA,古希腊掌管PHP代码审计的神

PHP代码审计——ThinkPHP基础  

END

  YAK官方资源 

Yak 语言官方教程:
https://yaklang.com/docs/intro/
Yakit 视频教程:
https://space.bilibili.com/437503777
Github下载地址:
https://github.com/yaklang/yakit
Yakit官网下载地址:
https://yaklang.com/
Yakit安装文档:
https://yaklang.com/products/download_and_install
Yakit使用文档:
https://yaklang.com/products/intro/
常见问题速查:
https://yaklang.com/products/FAQ

 

原文始发于微信公众号(Yak Project):YAK-SSA,古希腊掌管PHP代码审计的神

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月9日22:27:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   YAK-SSA,古希腊掌管PHP代码审计的神https://cn-sec.com/archives/3611656.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息