前言
正好最近省赛的复现有点php代码审计的苗头了,正好看到ctfshow里面也有代码审计的模块,这里写一写
Web301
知识点:sql写马、联合注入创建用户
文件结构如下

在checklogin.php中一眼定真,直接凭借的sql语句,直接开打sql注入

这里直接sql写马,审了个寂寞
|
|


flag在当前目录下的flag.php直接cat就行了,另外这道题正常做法还可以用联合注入伪造虚拟数据登录进去就可以访问flag.php了
这里当作练习,就都尝试一下吧
在联合查询并不存在得数据时,联合查询就会构造一个虚拟得数据就相当于构造了一个虚拟账户,可以使用这个账户登录。当然作用局限性也很大,比如说后端如果限制你必须用admin登录,那你不炸了
第一次知道联合注入可以这样打


Web302
知识点:sql依旧写马
代码修改如下照样写马

这里改的是

显然是加固了一下,这里判断的条件导致联合注入没那么无脑了,因为这个是和数据库中的字符做比较。
可以打联合注入虚拟数据,可以通过源码中的代码对密码进行加密,就可以了
|
|
写马还是照样
写马还是要抓包,不抓包写不了

这里还不能url编码,一直想学习一下这个,服务端处理请求报文的逻辑。

Web303
知识点:sqlmap跑盲注
换了附件,但是项目结构是一样的

貌似多了一些东西,来简单审计一下,首先还是checklogin.php,这里队sql注入点加了限长,sql注入应该是无法利用了

看看多出来的dpt.php和dptadd.php
dpt.php都是一些前端dptadd.php则存在新的SQL注入点,这里只要控制dpt_name参数就可以执行sql注入了

但是新的问题来了,访问这个页面是需要login的session的,否则会重定向回login.php。
但是fun.php这里输出了sds_decode("admin"),感觉也是一种变相的提示密码就是admin(其实直接爆破也可以)

成功登录之后尝试访问dptadd.php,成功,显示出来的也是之前的insert语句

直接用sqlmap跑一下,无绕过的sql注入还是太简单了
|
|


手打的话也挺简单,因为insert语句本身就是插入语句,里面是可以嵌套select的
|
|

也可以用报错注入,这里直接带过了
Web304
知识点:同上
说是上了waf但是估计忘记上环境了,反正sqlmap还是照样跑的出来。这里直接跳过了
Web305
知识点:项目反序列化写马
项目结构还是相同,一眼看到发序列化,并且触发点在cookie

去看看class.php的逻辑

简单,直接传马上去,本地测试成功

别穿错路由了。。。。。。()


没找到flag,连蚁剑去数据库里找,记得不能连https

要看蚁剑里的conn.php中的数据库信息


也是第一次知道蚁剑可以直接管理数据库

Web306
知识点:构造反序列化链写马
开始使用mvc架构
项目结构如下

MVC(Model-View-Controller)模式是一种广泛应用于软件开发中的架构模式,特别是在用户界面的设计中。它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller),实现了关注点的分离,即将数据的管理、用户界面和控制逻辑分离开来。
在index.php中找到反序列化的点

看一下checklogin.php。很明显,把登录的功能搞到了service类中

那么接下来跟进看看service类的代码逻辑,包含了两个文件,然后在dao.php是用于查询用户名对应的密码,然后如果查询对了的话就创建新的user对象。这个user对象就是反序列化的利用点

接下来去看看dao.php的逻辑

这里明显存在sql注入,还是没过滤的那种,不过因为checklogin.php还存在用户名长度限制,所以这里sql注入其实是没有作用的
|
|
其实漏洞点这个destruct这里很明显是调用了close函数

然后再class.php的log类中也有很明显的close方法,而且直接可以利用

写个脚本,这里要注意的就是conn这个成员赋值
|
|

这里稍微解释一下利用链
|
|
另外我发现一个很有趣的事情,当我的木马密码为数字的时候就会出错误

这种时候写进去的马也无法连接
只有木马为字母的时候才会报200。也许和这个log类有关系

蚁剑连接后,在当前目录找到,我还以为又在数据库呢

Web307
知识点:项目反序列化链命令注入
项目结构

多了一个controller更像mvc架构了,后续审java代码的话,这个还是挺有帮助的
index.php没发现啥在login.php发现注入点

然后注意到包含了这个service.php直接去看一下
|
|
很明显可以看到两个熟的不能再熟的魔术方法,接下来就去看看config类和dao类

config.php没啥东西

dao.php这里还是有这个经典的魔术方法,不过class.php中的close方法已经改成了closelog,所以这里是走不通了

dao.php中还看到了这个可以命令注入的点,说不定这里就是攻击的地方

这里config在构造函数里定义了是config类的对象,所以拼接的是config类的cache_dir成员
问题是,怎么触发这个函数呢?在Seay里有一个全局搜索,我们搜索一下clearCache()这个函数。可以发现除了service.php和dao.php还有一个login.php存在clearCache()

跟进看看,看来这里才是利用点,那么就很好解决了

我们构造脚本
|
|

讲一下构造脚本的思路,其实有些曲折
|
|
一开始,我看到logout.php里包含了service就觉得肯定需要从service类开始。但其实,从service类的话,是不行的。后来经过了解,发现了php的包含链
后来还发现这个命令注入写马居然还需要转义一下\$_POST,命令注入看来是需要转义的(写入包含php代码的文件也需要)
(分析还可以,但是构造代码功力还是弱了)
Web308
知识点:项目反序列化链ssrf打mysql
最后一个项目,后续都是这个源码
依旧项目结构:

简单审计之后,发现之前那个命令注入的地方加了一点waf

所以也过不了了,只能寻找新的
在index.php中看到有调用奇怪的东西

跟进查看

熟悉的dao.php,这里调用了一个checkUpdate,继续跟进

最后在fun.php有一个ssrf

结合题目描述说要拿shell,这里可以想到通过ssrf连接mysql打sql注入木马
先生成一个payload
|
|

|
|
在index.php发包(这里虽然有重定向,但是不妨碍继续执行代码)

Web309
知识点:gopher协议探测端口,打FastCGI
题目描述:308方法失效,mysql需要密码了
附件没变,审计过程就忽略了,主要看利用方式。
漏洞点还是ssrf我们可以通过gopher协议探测一下可用的一些端口
|
|
|
|
用Gopher请求端口时,如果端口有服务在监听,则会接受连接并等待我们传输数据,此时连接会"卡住"一段时间;如果端口没有服务,则会立刻拒绝连接。通过是否出现等待,就能判断端口是否开放

说明这里存在9000端口的FastCGI(快速通用网关接口,用于php加速网页处理请求)
这里再说句题外话,因为java是不用这个老掉牙的技术的,所以现在环境里几乎没有这个。甚至php都只有一些灰黑产业会用
所以学学看就好了,不用太深入,我们还是要学一些通用漏洞
怎么打呢
|
|
这里也可以反弹shell(这里转义符号之前还记录了一下)


直接读就行了
Web310
知识点:同上
思路同上,flag换了个地方

总结
总结下来还是有些收获的,对php的代码审计已经有些眉头了,有些自己的方式方法。另外还学到了sstf打FastCGI,这真是从来没接触过的东西。