5.缓存文件getshell
我们在搜索危险函数的时候发现一处很有可能getshell的地方,我们先看这里的$arrayData是否可控。
这里代码37行的 $o 也就是对应代码49行的 $cat 数组中的内容是从数据库中 cms_category 表中获取的。那么如果这里表中的内容是我们可以控制的那么就能写入任意内容。
我们去看下该表中的内容
从数据内容可以看出这里的功能点其实就是 管理栏目 中的内容,这里就可以添加内容。
这里通过 columsdata() 接收参数,然后通过 add_one() 进行数据插入
这里还是通过 safeword() 进行数据的过滤的,但是这里的 safeword() 方法在后续并没有起到过滤的效果。
通过搜索该文件可以发现有好几处包含了该模板文件,所以我们这里就可以通过写入缓存文件getshell。
cat_array.inc 文件内容如下
然后我们访问刚才包含该文件的路由
6.sql注入
直接先进入admin.php和index.php
发现index.php有点难以理解。但是大致可以通过函数名和语义分析出是根据一些变量或者一些路径来渲染,加载模板文件,随后回显到前端。
再看admin.php,发现存在action参数和ctrl参数。
发现有两个方法,class_exists和method_exists,这两个函数是判断是否存在类和方法的,接下if内的语句判断,指导action是类名,ctrl是函数名,有点像路由
搜索发现处理数据库请求的类为cms方法为lists
直接搜索跟进
发现有过滤函数对变量进行了一些过滤处理。
发现有过滤函数对变量进行了一些过滤处理。
发现对输入做了处理
注入点存在处
最后找到几个未过滤的函数方法:delist、getquery、updatelist、get_one、getlist
那就值针对这几个方法看
审计开始
先看第一个函数delist,看到有三个文件有这三个函数,先看第一个
delist
Article类
看到传入的参数有表名、参数id,以及where参数,用于筛选匹配数据
在后台管理系统中没看到该模块的调用,然后看CMS类的时候发现CMS继承了Article类,所以看CMS类就好了
Category
这里可以看到仍然没有对id进行过滤,直接使用sleep(5)延时,看到burpsuite返回的时间是5s,符合执行语句,这次只有一次数据库操作,所以返回时间没啥变化
CMS
跟Article类是一样的语句所以其实是通杀
测试bool盲注,对语句进行拼接,看参数知道是id
payload:27) or 1=1#
发现回显没啥特征进行,采用延时确认,发现成功延时12s,我们的语句写的是4s,说明经历了三次注入,
这里payload使用--+是失败的,还是需要用#号,不是很明白
直接上sqlmap,注入出当前user,使用的一些参数
-v 3 --level 5 --risk 3 --random-agent --current-user --technique T --dbms mysql -p id
继续跟进代码,看看为什么产生了三次延时,看看createtag方法
可以看到传参值也是id,而id在加入sql语句前也没有进行安全处理,只针对tags参数进行过滤,但是我们这个删除执行很明显没有传递tag参数,所以走的是下面的else语句,成功拼接到语句中,根据之前阅读的方法知道,delist、getquery、updatelist、get_one、getlist这几个函数中没有对输入值进行过滤,执行我们的payload。
这里有两条语句都拼接了所以一共延时了3次