【i春秋】渗透测试入门 —— 你是会员吗?

0x00 前言

本题的目标是一个基于 XDCMS(目前官网貌似被黑)的订餐管理系统,XDCMS 是各大漏洞平台的常客,维护效率极低,基本过时淘汰,常用于渗透测试的练习靶机。

以下的问题均源自于两个典型的漏洞利用。第 1 题由 SQL 注入漏洞可得到管理员的密码散列值,进而破解得到密码明文;第 2 题先将一句话木马插入图片中,再将图片马上传到服务器,最后利用文件包含漏洞,顺利地将中国菜刀与服务器连接,即可看到网站根目录下的 flag 文件。

guide

0x01 获取目标网站管理员的密码

从题目的暗示来看,应该与网站的会员注册有关。搜索一番后,发现了两个 SQL 注入漏洞均可获得管理员的账号密码,且都能在实验靶机上成功复现。

注册会员处的 SQL 注入

第一个漏洞是由于 /system/modules/member/index.php 中的注册函数 register_save() 过滤不严,可绕过限制造成 SQL 注入。漏洞原理在此没有深究,只是对该漏洞进行利用,详情可参考:

xdcms注册用户处SQL注入漏洞

接下来打开 Chrome 浏览器,进入默认首页,点击 免费注册,根据提示填写好对应信息:

register-info

下面要利用 Burp Suite 工具,准备对注册信息进行抓包改包。依次打开工具箱中的【抓包改包】->【Burp Suite】文件夹,双击【BurpLoader.jar】,弹出的所有提示框点击 确定 即可:

burp-path

回到浏览器,设置局域网本地代理,依次点击 设置 -> 更改代理服务器设置 -> 连接 -> 局域网设置,在 为 LAN 使用代理服务器 前打钩,在地址上填 127.0.0.1,在端口上填 8080,最后点击 确定 返回即可:

proxy-setting

设置完毕后,回到注册页面,点击 注册 后,在 Burp Suite 上点击 Proxy -> Intercept -> Raw 选项卡,看到了成功抓取的注册数据包:

register-capture

再依次点击 Action -> Send to Repeater,便可在 Repeater 选项卡中看到刚才抓取的数据包,用于进行重放攻击:

register-repeater

根据漏洞报告中的利用方法以及 payload:

1
' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14 FROM (SELECT count(1),concat(round(rand(0)),(SELECT concat(username,0x23,password) FROM c_admin LIMIT 0,1))a FROM information_schema.tables GROUP by a)b#

将该 payload 插入请求数据的 username 参数中,点击 Go,在响应数据中即可看到报错信息中泄露的管理员账号密码:

register-repeater-response

当然也可直接在 Proxy 选项卡中插入 payload,点击 Forward,将抓取的数据包转发给服务器:

register-proxy-forward

在浏览器的注册响应信息中同样能看到账号密码:

register-proxy-response

会员资料修改处的 SQL 注入

第二个漏洞也是由于 /system/modules/member/index.php 中的编辑函数 edit_save() 过滤不严,可绕过限制造成 SQL 注入。同样地,此处不研究漏洞原理,只对该漏洞进行利用,详情可参考:

xdcms通用型全版本注入漏洞

利用刚刚注册好的 sql_injection 账户登录,准备对 资料管理 -> 基本资料 中的 姓名 进行修改:

modify-info

打开 Burp Suite 后,点击 更新,成功截取到更改请求数据包:

modify-capture

根据漏洞报告中的利用方法以及 payload:

1
%60%3D%28select%20group_concat%28username%2C0x3a%2Cpassword%29%20from%20c_admin%20where%20id%3D1%29%23

该 payload 经过 URL 解码后为:

1
`=(select group_concat(username,0x3a,password) from c_admin where id=1)#

将该 payload 插入请求数据的 field%5Btruename%5D中,注意是要将经过 URL 编码后 payload 插入到 truename%5D 之间,否则漏洞利用失败。接着点击 Forward

modify-forward

资料更新成功后,在 基本资料 中可看到在 姓名 处成功泄露了管理员的账号密码:

modify-response

最终得到管理员账号为 xdcms121,密码为 1be20cb2907edca1e4f55f375a5663f1,从摘要长度猜测此为 MD5 哈希算法,用 MD5解密工具 得到结果 e890790166bfb88ee91047c64cda7aad

md5-1

看来思路没错,再对其进行一次解密,终于得到密码明文 xdcms212

md5-2

接下来成功渗透后,即可看到 /system/modules/member/index.phpregister_save() 函数处理密码明文的哈希算法源码,确实是对密码明文进行了连续两次的 MD5 哈希计算:

md5-source

0x02 获取目标网站目录中的 flag 文件信息

打开工具箱【目录扫描】文件夹下的【御剑后台扫描工具】,对目标 URL 进行扫描:

directory-scan

可轻松得到并成功验证后台登录页面 /admin/index.php

login

用账号 xdcms121 与密码 xdcms212 登录后台后,根据实验手册提示,要用菜刀与服务器连接,并在网站目录中获取 flag 文件信息。我们接着搜索可利用的漏洞,发现 /system/function/global.inc.php 存在文件包含漏洞。根据漏洞说明,我们可将一句话木马插入图片中,再将图片马上传到服务器,利用 URL 查询字符串的 m 参数指向图片马的路径,最终触发文件包含漏洞,等待菜刀连接。该漏洞详情可参考:

XDcms控制器绕过漏洞(可本地包含)

因此,首先来制作图片马。任意找到一张图片 logo.jpg(此处以 XDCMS 的 logo 为例),新建含有一句话木马的文本文档 trojan.txt,在命令行模式下用 copy 命令合并两个文件:

小贴士:在 Windows 命令行下输入 help copy,即可看到 copy 命令的使用说明,限于篇幅在此省略。

copy

用 【Notepad++】查看图片马 result.jpg,发现图片末尾确实已插入了一句话木马:

notepad

所以即使不用 copy 命令,直接将木马粘贴在图片末尾也是可以的,此处就不演示了。

回到后台管理界面,依次点击 模块管理 -> 幻灯片管理 -> 添加幻灯,发现此处能够上传图片,在 名称 处填上任意字符(此处以 upload trojan 为例),在 链接地址 处填上 http://www.test.ichunqiu(不知能否填任意地址,保险起见此处填入相关地址),接着点击 上传,选择图片马 result.jpg

upload-trojan

再次点击 上传 后,发现 图片 一栏仍为空,需要手动填写图片马的绝对地址(这里真心想吐槽这个不合理的设计=_=!!!),填写完点击 保存 即可:

upload-save

咦,怎么在 幻灯片管理 页面没显示图片马在服务器上的地址?点击 编辑 亦是如此:

upload-manager

这个点也是本题的一大坑,大家也许注意到了,既然 图片 一栏要手动填写地址,那前面还需要点击 上传 来选择图片马吗?其实这是为了用 Burp Suite 抓取数据包,获得图片马在服务器上的地址。

如果刚刚忘记打开 Burp Suite,现在请打开,并设置好浏览器的局域网本地代理,严格按照上述的上传步骤重新将图片马上传。成功上传后,可在 Proxy -> History 中点击相应记录,并在 Response -> Raw 中看到图片马的地址为 /uploadfile/image/20180309/201803090113470.jpg

小贴士:在上传图片马的步骤中,在 Proxy -> Intercept 中点击关闭截取功能,操作起来更加顺畅。当显示 Intercept is off 表示已关闭截取功能。

upload-path

由于 /uploadfile/ 在网站根目录下,而根据漏洞说明中的源码,可知参数 m 是在 /system/function/global.inc.php 文件中被引用,文件包含的关键语句如下:

1
include MOD_PATH.$m."/".$c.".php"; //调用类

因此使用菜刀 添加SHELL 时,赋值给 m 的图片马路径需要先从 MOD_PATH 返回根目录,拟在前面添加 ../../,猜测向上返回两级目录后可到达根目录,若猜测正确即能指向图片马的路径:

add-shell

接下来尝试连接服务器,结果得到报错信息:

get-shell-error

原因是参数 m 被引用到源码后,后面还连了一段字符串,该字符串默认情况下是 /index.php,在漏洞说明的源码中可得到验证。所以可在参数 m 末尾加入空字符 %00,对源码中的 include 语句进行截断。详情可参考:

文件上传之\00截断与文件包含之%00截断 文件包含漏洞详解

add-shell-null

如无意外,成功地连接上服务器,并在根目录下看到 flag 文件 flag9szsed-fdzvc4-1l3iza.txt

server-root

打开 flag 文件即可获得 key{7h7hii9a},大功告成,因此第 2 题答案就是 7h7hii9a

flag

另外,如果等得起暴力目录扫描的话,直接可以扫出 http://www.test.ichunqiu/flag9szsed-fdzvc4-1l3iza.txt,然后往浏览器一扔:

flag-browser

呵呵…想想就好,还是按部就班的渗透吧~

0x03 小结

获得 webshell 后,除了查看 flag 文件,还能查看所有后台文件的源码,包括上述的 MD5 哈希算法,以及在 /system/common.inc.php/system/function/global.inc.php 中进一步验证了参数 m 的值是跟在 /system/modules/ 后面的,所以,需要向上返回两级目录的猜测是正确的:

mod-path

include

本次渗透过程没有用到实验手册中提到的 SQLMap,若有使用其他工具或有新奇的渗透思路,还请各位前辈多多指教。最后向以下三篇参考 writeup 的作者表示致谢!

10-在线挑战详细攻略-《你是会员吗》
你是会员吗?
你是会员吗挑战攻略